第三篇 用小程序给用户推送服务消息
1.小程序登录获取,小程序的openId和unionId。
2.获取并解密小程序的加密信息包括用户和手机信息。
3.用小程序给用户推送服务消息。
4.给绑定小程序而且又关注微信公众号的用户推送公众号消息。
小程序消息推送机制有两种一种是统一模板消息推送一种是客服消息,本章主要介绍在Java端向指定用户推送指定模板的消息。
模板推送又分为两种一种是用小程序给用户推送服务消息,本章主要介绍这个;
一种是给绑定小程序而且又关注微信公众号的用户推送公众号消息;
为便于开发者对用户进行服务消息触达,简化小程序和公众号模板消息下发流程,小程序提供统一的服务消息下发接口。
下发条件说明
1. 支付
当用户在小程序内完成过支付行为,可允许开发者向用户在7天内推送有限条数的模板消息(1次支付可下发3条,多次支付下发条数独立,互相不影响)
2. 提交表单
当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在7天内推送有限条数的模板消息(1次提交表单可下发1条,多次提交下发条数独立,相互不影响)
1. 小程序端将必要的参数发送给后台
onSendWeappMessage: function (e) {
console.log(e);
wx.request({
url: "https://www.test.com/app/interface/miniprogram/miniprogramWeappMessage",
data: {
//模板ID
template_id: "NKeZWyyEkOl4tT6fYwJN90RxCHt_xxxxxxx",
//需要放大的关键词
emphasis_keyword:"",
//放给谁需要用户的openId,并收集当前用户在页面操作产生的formId
toWeappUser:[
{ openid: "oTJ3H5Vxxxxxxxxxxxx", form_id: e.detail.formId}
],
jsonMessage: {
keyword1:"2017-12-12 12:24",
keyword2:"已经满员了已经满员了已经满员了已经满员了已经满员了已经满员了"
}
},
method: "POST",
header: {
'content-type': 'application/json',
},
success: function (res) {
console.log(res);
},
fail: function (error) {
console.log(error);
}
})
}
2. Java服务端接收参数,并调用接口调用凭证获取access_token
access_token是接口调用的凭证,目前有效期为两个小时,需要定时刷新,重复获取将导致上次获取的access_token失效。(注:不建议每次调用需要access_token的接口,都去重新获取access_token,会导致失败)
获取小程序 access_token:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
返回参数格式:
{"access_token": "ACCESS_TOKEN", "expires_in": 7200}
/**
* 获取小程序 access_token ,每天最多获取200次,一次2小时失效
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/access-token/getAccessToken.html
*
* Date 2018年9月29日 下午5:03:15
*
*
* @author 网行天下
*/
public static synchronized MiniprogramResult getAccessTockenResult() {
MiniprogramResult miniprogramResult = null;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity responseEntity = null;
Object sessionAttribute = EnvManager.getSessionAttribute(MINIPROGRAM_MINIPROGRAM_RESULT);
// access_token会保存在本地服务器需要的时候去微信远程获取
if (sessionAttribute != null) {
miniprogramResult = (MiniprogramResult) sessionAttribute;
if (StringUtils.isNotEmpty(miniprogramResult.getAccess_token())) {
logger.debug("缓存中获取小程序ACCESS_TOKEN成功返回数据:" + miniprogramResult);
return miniprogramResult;
}
}
String appid = "xxxxxxxxxxxxxxxx";
String secret = "xxxxxxxxxxxxxxxx";
// 微信的接口
String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET", appid, secret);
// 进行网络请求,访问url接口
responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
logger.debug("进行网络请求获取小程序ACCESS_TOKEN成功返回数据:" + responseEntity);
// errcode 的合法值0
// 根据返回值进行后续操作
if (responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
String sessionData = responseEntity.getBody();
// 解析从微信服务器获得的ACCESS_TOKEN;
miniprogramResult = FastJsonUtils.getJavaBean(sessionData, MiniprogramResult.class);
// access_token会保存在本地服务器保存100分钟
EnvManager.setSessionAttribute(MINIPROGRAM_MINIPROGRAM_RESULT, miniprogramResult, 6000);
logger.info("远程获取小程序ACCESS_TOKEN成功返回数据:" + miniprogramResult);
}
return miniprogramResult;
}
2. 发送模板消息
先在微信公众平台选用怒需要的模板id,例如
选用模板消息:
3. 发送模板的消息,接口地址:
https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
/**
* 发送统一模板消息
*
* @param token
* @param template
* @return
*
*/
public static String sendUniformMessage(String json) {
logger.info("发送统一模板消息:" + json);
String sendResult = "";
//获取到服务器中的access_tocken
MiniprogramResult result = getAccessTockenResult();
if (result == null) {
return sendResult;
}
String requestUrl = String.format("https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN",
result.getAccess_token());
logger.info("发送统一模板消息到:" + requestUrl);
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
// 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity requestEntity = new HttpEntity(json, headers);
// 进行网络请求,访问url接口
ResponseEntity responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity,
String.class);
logger.info("发送统一模板消息后接受数据:" + responseEntity);
if (responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
String sessionData = responseEntity.getBody();
MiniprogramResult miniprogramResult = FastJsonUtils.getJavaBean(sessionData, MiniprogramResult.class);
int errorCode = miniprogramResult.getErrcode();
String errorMessage = miniprogramResult.getErrmsg();
if (errorCode == 0) {
sendResult = SEND_SUCCESS;
} else {
sendResult = SEND_FAIL;
logger.error("模板消息发送失败:" + errorCode + "," + errorMessage);
}
}
return sendResult;
}
本文参考文献有
http://www.51xuediannao.com/xiaochengxu/0cba78ba.html