實現小程序推送 需要以下配置信息:
1,小程序appid
2,小程序AppSecret(密匙)
3,小程序推送模版id
4,用戶的openid
5,用戶的formid(一個formid只能用一次)
APPID、APPsecret、模板ID 都是可以通過微信公衆平臺 直接過去拿到的,而openId是需要調用方 傳給我們。formId 是收集用戶觸發的動作,官方文檔講formId的有效期是7天,且一個formId只能使用一次。
/**
* 微信小程序模板推送實現
* @author lbh
* @date 2019/11/14 17:20
* @desc
*/
@Service
public class WecharPushTemplateService {
/**
* 小程序 APPID
*/
@Value("${APP_ID_NEW}")
private String appIdNew;
/**
* 小程序 AppSecret
*/
@Value("${APP_SECRET_NEW}")
private String appSecretNew;
/**
* 收益到賬通知模板ID
*/
@Value("${APP_INCOMETOACCOUNT_MESSAGE_TEMPLATEID}")
private String incomeToAccountTemplateId;
/**
* 審覈結果通知模板ID
*/
@Value("${APP_CHECKRESULT_MESSAGE_TEMPLATEID}")
private String checkResultTemplateId;
@Autowired
private WecharUserFormIdService userFormIdService;
/**
* 審覈結果通知
* @param pushModel
* @return
*/
public String pushCheckResult(WecharMessagePushModel pushModel) {
//1、配置小程序信息
WxMaInMemoryConfig wxConfig = new WxMaInMemoryConfig();
wxConfig.setAppid(appIdNew); //小程序appid
wxConfig.setSecret(appSecretNew); //小程序AppSecret
WxMaService wxMaService = new WxMaServiceImpl();
wxMaService.setWxMaConfig(wxConfig);
//2、設置模版信息(keyword1:類型,keyword2:內容)
List<WxMaTemplateData> templateDataList = new ArrayList<>(5);
WxMaTemplateData data1 = new WxMaTemplateData("keyword1", pushModel.getCheckResult());
WxMaTemplateData data2 = new WxMaTemplateData("keyword2", pushModel.getRefusalReason());
WxMaTemplateData data3 = new WxMaTemplateData("keyword3", pushModel.getCheckName());
WxMaTemplateData data4 = new WxMaTemplateData("keyword4", pushModel.getMobile());
WxMaTemplateData data5 = new WxMaTemplateData("keyword5", pushModel.getCheckDate());
templateDataList.add(data1);
templateDataList.add(data2);
templateDataList.add(data3);
templateDataList.add(data4);
templateDataList.add(data5);
// 去記錄表裏查詢最早的有效formId
WecharUserFormIdsModel userFormIdsModel = new WecharUserFormIdsModel();
userFormIdsModel.setOpenId(pushModel.getOpenId());
WecharUserFormIdsModel formIdsModel = userFormIdService.wecharUserFormIdList(userFormIdsModel);
//3、設置推送消息
WxMaTemplateMessage templateMessage = WxMaTemplateMessage.builder()
.toUser(pushModel.getOpenId())//要推送的用戶openid
.formId(formIdsModel.getFormId())//收集到的formid
.templateId(checkResultTemplateId)//推送的模版id(在小程序後臺設置)
.data(templateDataList)//模版信息
.page("pages/message/message")//要跳轉到小程序那個頁面
.build();
//4、發起推送
try {
wxMaService.getMsgService().sendTemplateMsg(templateMessage);
} catch (WxErrorException e) {
System.out.println("推送失敗:" + e.getMessage());
return e.getMessage();
}
return "推送成功";
}
}
/**
* 取得openId 所擁有的formId
*
* 【由於官方文檔講:formId 有效期是7天,所以需要將過期的formId刪除掉,且返回最早的一個formId】
* @param userFormIdsModel
* @return
*/
@Transactional(rollbackFor = Exception.class)
public WecharUserFormIdsModel wecharUserFormIdList(WecharUserFormIdsModel userFormIdsModel) {
List<WecharUserFormIdsModel> list = userFormIdsDao.wecharUserFormIdList(userFormIdsModel);
if (AirUtils.hv(list)) {
ListIterator<WecharUserFormIdsModel> iterator = list.listIterator();
while (iterator.hasNext()) {
WecharUserFormIdsModel formIdsModel = iterator.next();
Date failDate = TimeUtilis.getDateByNum(formIdsModel.getCreateTime(), 7); // formId過期時間
if (TimeUtilis.dateCompareToDate(failDate, new Date())) { //如果已經過期了,則刪除
userFormIdsDao.delWecharUserFormId(formIdsModel.getId());
iterator.remove(); // 使用迭代器移除,可避免報錯: java.util.ConcurrentModificationException
}
}
}
return list.get(0);
}
參考博文: https://blog.csdn.net/qiushi_1990/article/details/90406088