·模板消息推送
1.1推送參數dto:
按照文檔逐層次封裝請求參數。
這些參數
/**
* @author hanyy
* @Description: 微信小程序模板消息推送參數
* @date 2019/8/18 10:52
*/
public class WechatAppletTemplateDTO {
private String touser;
private String template_id;
private String page; // 跳轉小程序頁面
private String form_id; //表單提交場景下爲formid,支付場景下爲prepay_id
private Map<String, WechatAppletTemplateItemDTO> data;
private String emphasis_keyword; // 需要放大的關鍵字,如:keyword1.DATA
}
1.2小程序模板數據內容:
這裏data參數沒有使單獨對象一層層封裝,使用了map集合key/value形式。
/**
* @author hanyy
* @Description: 公衆號模板數據內容
* @date 2019/8/8 10:25
*/
@Data
public class WechatAppletTemplateItemDTO {
private String value;
}
2.推送方法:
根據模板封裝通用模板消息發送方法
注意:每次調用推送方法,都需要去拿access_token。
//小程序收到挪車請求通知模板消息
public ResultVO<?> receivedNoticeTemplateSend(WechatTemplateKeyWordDTO dto) {
//獲取AccessToken
ResultVO<?> myAccessToken = getAppletAccessToken();
String templateSendaccessToken = (String) myAccessToken.getData();
// 填充模板數據
WechatAppletTemplateDTO wechatTemplate = new WechatAppletTemplateDTO();
//被推送用戶
wechatTemplate.setTouser(dto.getTouser());
//模板id
wechatTemplate.setTemplate_id(receivedNotice);
// 表單提交場景下爲formid,支付場景下爲prepay_id(前端傳)
wechatTemplate.setForm_id(dto.getFormId());
// 跳轉頁面
//.setPage("pages/index")
/**
* 車牌 {{keyword1.DATA}}
* 發送時間 {{keyword2.DATA}}
* -> {"keyword1": {"value":"xxx"}, "keyword2": ...}
*/
wechatTemplate.setData(MapUtil.newHashMap(//
"keyword1", new WechatAppletTemplateItemDTO(dto.getPaltNo()),//
"keyword2", new WechatAppletTemplateItemDTO(dto.getRequestDate())//
));
log.info("#receivedNoticeTemplateSend:{}", wechatTemplate.toString());
WechatApiUtil.wechatAppletTemplateSend(templateSendaccessToken, wechatTemplate);
return ResultVOUtil.returnSuccess();
}
3.業務層調用推送方法:
根據推送方法進行傳參即可。
注: 小程序的推送是必須要依賴formid,必須是一對一回執,而一次挪車申請表單提交只能產生一次formid,
並且只能使用一次,不可重複使用。所以前端只能提供一個formid給後臺,後臺只能推送一次小程序通知。
//微信小程序通知申請人被回覆
WechatTemplateKeyWordDTO wechatTemplate = new WechatTemplateKeyWordDTO();
//openid/formid表中查
wechatTemplate.setTouser(result.getOpenid());
//唯一formid,一次表單提交僅可使用一次
wechatTemplate.setFormId(result.getFormId());
wechatTemplate.setPaltNo(result.getPlatNo());
wechatTemplate.setContent(dto.getContent());
wechatTemplate.setRequestDate(DateUtil.getTime());
log.info("#申請人被回覆小程序通知: openid:{},車牌號:{}", wechatTemplate.getTouser(), wechatTemplate.getPaltNo());
iWxAppletService.replyNoticeTemplateSend(wechatTemplate);
附:封裝hutool的MapUtil :
public class MapUtil extends cn.hutool.core.map.MapUtil {
public static HashMap newHashMap(Object... keyValues) {
return newMap(HashMap.class, keyValues);
}
public static ConcurrentMap newConcurrentMap(Object... keyValues) {
return newMap(ConcurrentMap.class, keyValues);
}
public static TreeMap newTreeMap(Object... keyValues) {
return newMap(TreeMap.class, keyValues);
}
public static LinkedHashMap newLinkedHashMap(Object... keyValues) {
return newMap(LinkedHashMap.class, keyValues);
}
public static IdentityHashMap newIdentityHashMap(Object... keyValues) {
return newMap(IdentityHashMap.class, keyValues);
}
private static <R extends Map> R newMap(Class<? extends Map> type, Object... keyValues) {
if (null == keyValues) {
log.warn("MapUtil#newMap() keyValues is null.");
return null;
}
int length = keyValues.length;
if (length % 2 != 0) {
throw new IllegalArgumentException("參數不符合預期, 可變數組應該成對出現。");
}
Map resultMap;
if (type == HashMap.class) {
resultMap = Maps.newHashMap();
} else if (type == ConcurrentMap.class) {
resultMap = Maps.newConcurrentMap();
} else if (type == TreeMap.class) {
resultMap = Maps.newTreeMap();
} else if (type == LinkedHashMap.class) {
resultMap = Maps.newLinkedHashMap();
} else if (type == IdentityHashMap.class) {
resultMap = Maps.newIdentityHashMap();
} else {
throw new IllegalArgumentException("MapUtil#newMap() type = " + type.getSimpleName() + " 不支持。");
}
for (int i = 0; i < length; i = i + 2) {
resultMap.put(keyValues[i], keyValues[i + 1]);
}
return (R) resultMap;
}
}