1、前言
做過微信開發的應該都有一點感觸,就是他的開發文檔不是一成不變的,接口有時候會被下線,但也不是一下子就不能用了,一般會相容舊接口,然後提醒你使用新接口有更多好處。
如果接口真的直接下線了,也會提供另一種能夠實作相同功能的接口給你替換。是以有天你以為代碼都寫好了,沒有bug了,悠哉悠哉的時候,忽然産品經理說微信的哪個接口不能用了,快去改一下,不要驚訝,老老實實去改就對了哈。
這不,微信将小程式的模闆消息接口下線了,之前用formid來調這個接口的功能都就用不了了。
看官方文檔提示,是提供了訂閱消息的功能來替換,顧名思義,要使用者主動訂閱了才可以發送成功,像下面這樣:
除了這種訂閱消息外,還有沒有其他方法來實作同等效果呢,答案是of course。
翻閱小程式開發文檔發現,官方還提供了一個統一服務消息的接口。為便于開發者對使用者進行服務消息觸達,簡化小程式和公衆号模闆消息下發流程,小程式提供統一的服務消息下發接口。就是在小程式裡發送公衆号模闆消息,這個好處就是不需要formid的
要注意:以下幾類消息是目前不允許發的模闆消息
1、模闆内容與服務場景(含标題、關鍵詞)不一緻的模闆
2、涉嫌廣告營銷類消息模闆
3、發送頻率過高,有騷擾使用者傾向類消息模闆
4、涉及紅包、卡券、優惠券、代金券、會員卡、積分類消息模闆
接下來我們就來實作下。
2、準備
調用這個接口的前提是公衆号和小程式有綁定且是同主體的,這個好辦,登入公衆号背景 -> 小程式 -> 小程式管理 -> 添加即可綁定小程式。
因為實質上還是發的公衆号模闆消息,是以還是要在公衆号背景添加消息模闆擷取模闆id。
3、開發
好了,做好以上兩個準備就可以開發了,主要代碼如下面:
/**
* 在小程式裡使用同主體的關聯公衆号發送模闆消息
* https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html
* @param vo
* @return {"errcode":0,"errmsg":"ok"} 向沒有關注公衆号的使用者發送會傳回{"errcode":43004,"errmsg":"require subscribe hint: [LGcpYa05528672]"}
*/
public static JSONObject uniformSend(SendVo vo){
boolean flag = false;
JSONObject object = new JSONObject();
JSONObject mpTemplateMsg = new JSONObject();
JSONObject miniprogram = new JSONObject();
String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token="+vo.getToken();
object.put("touser", vo.getToUser());
mpTemplateMsg.put("appid", vo.getPublicAppId());
mpTemplateMsg.put("url", vo.getUrl());
mpTemplateMsg.put("template_id", vo.getTemplateId());
miniprogram.put("appid",vo.getMiniAppId());
miniprogram.put("pagepath",vo.getPagePath());
mpTemplateMsg.put("miniprogram",miniprogram);
List<String> list = vo.getValue();
JSONObject jsonObject = null;
if (list != null && list.size() > 0) {
int size = list.size();
JSONObject data = new JSONObject();
for (int i = 0; i < size; i++) {
if (i == 0) {
JSONObject first = new JSONObject();
first.put("value",list.get(0));
first.put("color",vo.getColor());
data.put("first",first);
} else if (i == size-1) {
JSONObject remark = new JSONObject();
remark.put("value",list.get(0));
remark.put("color",vo.getColor());
data.put("remark",remark);
} else {
JSONObject keyword = new JSONObject();
keyword.put("value",list.get(i));
keyword.put("color",vo.getColor());
data.put("keyword"+i,keyword);
}
}
mpTemplateMsg.put("data",data);
object.put("mp_template_msg",mpTemplateMsg);
jsonObject = CommonUtil.httpsRequestJson(url, "POST", object.toJSONString());
logger.info("統一消息推送模闆json======{}",jsonObject);
}
return jsonObject;
}
針對入參要說下mpTemplateMsg.put("data",data)裡面的data這個參數,它是first.DATA,
(keyword1.DATA,keyword2.DATA。。。),remark.DATA組成的,是以for循環裡面
拼接資料的時候要分三個,分别對應first.DATA,(keyword1.DATA,keyword2.DATA。。。),remark.DATA的字段值。