问题:对于小程序用户报名活动后,我们要通过小程序来给用户发送活动结果。
方案:通过查阅资料(微信官方文档)调用微信小程序订阅消息相关接口。
接口地址
- POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
请求参数
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
access_token | string | 是 | 接口调用凭证 |
touser | string | 是 | 接收者(用户)的 openid |
template_id | string | 是 | 所需下发的订阅模板 |
idpage | string | 否 | 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 |
data | Object | 是 | 模板内容,格式形如 { “key1”: { “value”: any }, “key2”: { “value”: any } } |
miniprogram_state | string | 否 | 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版 |
lang | string | 否 | 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN |
简单代码实现
/**
* 发送订阅消息
*
* @param subscribeMsg
* @param openid
* @return
*/
public static BaseResponse<String> sendSubscribeMsg(BaseSubscribeMsg subscribeMsg, String openid) {
logger.info("发送订阅消息: openid: {}, subscribeMsg: {}", openid, subscribeMsg);
String token = subscribeMsg.getToken();
if (StrUtil.isBlank(openid)) {
return BaseResponse.ok("不明确的接收人");
}
if (StrUtil.isBlank(token)) {
return BaseResponse.ok("微信请求异常,请稍后重试");
}
String sendResult = null;
try {
HashMap<String, Object> requestParam = TaobaoRequest.requestFormParam();
requestParam.put("touser", openid);
requestParam.put("template_id", subscribeMsg.getTemplatId());
requestParam.put("data", subscribeMsg.getData());
String page = subscribeMsg.getPage();
if (StrUtil.isNotBlank(page)) {
requestParam.put("page", page);
}
sendResult = HttpUtil.post(BaseSubscribeMsg.REQUEST_URL+"?access_token="+token, JSONObject.fromObject(requestParam).toString());
JSONObject sendResultJO = JSONObject.fromObject(sendResult);
if (sendResultJO == null || !sendResultJO.has("errcode") || !"0".equals(sendResultJO.getString("errcode"))) {
logger.warn("发送订阅消息失败" + sendResultJO.toString());
return BaseResponse.bad(sendResultJO.toString());
}
} catch (Exception e) {
logger.error("发送订阅消息异常: {}, {}", sendResult, e);
}
return BaseResponse.ok();
}
请求示例:
{
"touser":"o6f6R4hXIJ9nQvj9CIrSnm15idVg",
"template_id": "fU_9Zjs1IaMvOJO2DQDCp04Nrxu2V94eavXDEv9KXWk",
"page": "index",
"miniprogram_state":"developer",
"lang":"zh_CN",
"data": {
"thing1": {
"value": "测试内容"
},
"date2": {
"value": "2020年10月27日"
}
}
}
特别注意
- 模板id通过后台管理平台获取的为准
- 填写模板内容的时候,参数名及参数类型要对应上建的模板里的,如下图标识
参数不对会报错:
{
"errcode": 47003,
"errmsg": "argument invalid! data.date2.value is emtpy rid: 5f97ef46-0f877411-447f13c1"
}
误以为错误为模板id出现问题,模板不起作用,实质是参数错了。
注意点:每个类型的数据长度是有限制的,参考官网,如果模板发送失败,请不要忽略了这个原因,具体限制如下图: