⼩程序java后端开发记录(三):模板消息推送·模板消息推送
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) Data();
// 填充模板数据
WechatAppletTemplateDTO wechatTemplate = new WechatAppletTemplateDTO();
//被推送⽤户
wechatTemplate.Touser());
//模板id
wechatTemplate.setTemplate_id(receivedNotice);
// 表单提交场景下为formid,⽀付场景下为prepay_id(前端传)
wechatTemplate.setForm_FormId());
/
/ 跳转页⾯
//.setPage("pages/index")
/**
* 车牌 {{keyword1.DATA}}
* 发送时间 {{keyword2.DATA}}
* -> {"keyword1": {"value":"xxx"}, "keyword2": ...}
*/
wechatTemplate.wHashMap(//
"keyword1", new PaltNo()),//
"keyword2", new RequestDate())//
));
log.info("#receivedNoticeTemplateSend:{}", String());
WechatApiUtil.wechatAppletTemplateSend(templateSendaccessToken, wechatTemplate);
urnSuccess();
}
3.业务层调⽤推送⽅法:
根据推送⽅法进⾏传参即可。
注: ⼩程序的推送是必须要依赖formid,必须是⼀对⼀回执,⽽⼀次挪车申请表单提交只能产⽣⼀次formid,并且只能使⽤⼀次,不可重复使⽤。所以前端只能提供⼀个formid给后台,后台只能推送⼀次⼩程序通知。
//⼩程序通知申请⼈被回复
WechatTemplateKeyWordDTO wechatTemplate = new WechatTemplateKeyWordDTO();
//openid/formid表中查
wechatTemplate.Openid());
//唯⼀formid,⼀次表单提交仅可使⽤⼀次
wechatTemplate.FormId());
wechatTemplate.PlatNo());
wechatTemplate.Content());
wechatTemplate.Time());
log.info("#申请⼈被回复⼩程序通知: openid:{},车牌号:{}", Touser(), PaltNo()); plyNoticeTemplateSend(wechatTemplate);
附:封装hutool的MapUtil :
public class MapUtil extends ap.MapUtil {
public static HashMap keyValues) {
return newMap(HashMap.class, keyValues);
有趣的java小程序}
public static ConcurrentMap keyValues) {
return newMap(ConcurrentMap.class, keyValues);
}
public static TreeMap keyValues) {
return newMap(TreeMap.class, keyValues);
}
public static LinkedHashMap keyValues) {
return newMap(LinkedHashMap.class, keyValues);
}
public static IdentityHashMap keyValues) {
return newMap(IdentityHashMap.class, keyValues);
}
private static <R extends Map> R newMap(Class<? extends Map> type, 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 = wHashMap();
} else if (type == ConcurrentMap.class) {
resultMap = wConcurrentMap();
} else if (type == TreeMap.class) {
resultMap = wTreeMap();
} else if (type == LinkedHashMap.class) {
resultMap = wLinkedHashMap();
} else if (type == IdentityHashMap.class) {
resultMap = wIdentityHashMap();
} else {
throw new IllegalArgumentException("MapUtil#newMap() type = " + SimpleName() + " 不⽀持。");        }
for (int i = 0; i < length; i = i + 2) {
resultMap.put(keyValues[i], keyValues[i + 1]);
}
return (R) resultMap;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。