小程序没有消息推送,用的是公众号的模板消息
https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/uniform-message/sendUniformMessage.html
1 配置小程序消息推送
1 进入开发管理,找到消息推送
1.1 设置token校验地址
1.2设置token
1.3选择数据格式
由于本地调试,用的是natapp内网穿透。
natapp内网穿透,win指令: natapp -authtoken= 隧道的token
java的token校验代码
@RequestMapping("getAppletToken")
public String getAppletToken(@RequestParam Map<String, String> params) throws Exception {
// 微信发送的请求中 会有四个参数
// 微信加密签名,signature结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce参数。
String signature = params.get("signature");
// 随机字符串
String echostr = params.get("echostr");
// 时间戳
String timestamp = params.get("timestamp");
// 随机数
String nonce = params.get("nonce");
// 消息推送配置中的 Token(令牌)
String token = "********";
// 验证
String msgSignature = WxUtils.getSHA1(token, timestamp, nonce);
// 验证失败
if (!signature.equals(msgSignature)) {
return "false";
}
// 验证成功 将 echostr 原格式返回 ,即可完成验证
return echostr;
}
WxUtils
/**
* 用SHA1算法生成安全签名
*/
public static String getSHA1(String... values) throws Exception {
try {
String[] array = new String[values.length];
for (int i = 0; i < values.length; i++) {
array[i] = values[i];
}
StringBuffer sb = new StringBuffer();
// 字符串排序
Arrays.sort(array);
for (int i = 0; i < values.length; i++) {
sb.append(array[i]);
}
String str = sb.toString();
// SHA1签名生成
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(str.getBytes());
byte[] digest = md.digest();
StringBuffer hexstr = new StringBuffer();
String shaHex = "";
for (int i = 0; i < digest.length; i++) {
shaHex = Integer.toHexString(digest[i] & 0xFF);
if (shaHex.length() < 2) {
hexstr.append(0);
}
hexstr.append(shaHex);
}
return hexstr.toString();
} catch (Exception e) {
e.printStackTrace();
throw new Exception("SHA1加密失败");
}
}
消息配置完成后开始写java代码进行消息发送
HttpClientUtils
public static String sendGetJsonRequest(String url, Map<String, String> params) {
RestTemplate client = new RestTemplate();
//新建Http头,add方法可以添加参数
HttpHeaders headers = new HttpHeaders();
//设置请求发送方式
HttpMethod method = HttpMethod.GET;
// 以表单的方式提交
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
//将请求头部和参数合成一个请求
HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(params, headers);
//执行HTTP请求,将返回的结构使用String 类格式化(可设置为对应返回值格式的类)
ResponseEntity<String> response = client.exchange(url, method, requestEntity, String.class);
return response.getBody();
}
public static String sendPostRequest(String url, Map<String, String> params) {
RestTemplate client = new RestTemplate();
//新建Http头,add方法可以添加参数
HttpHeaders headers = new HttpHeaders();
//设置请求发送方式
HttpMethod method = HttpMethod.POST;
// 以表单的方式提交
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
//将请求头部和参数合成一个请求
HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(params, headers);
//执行HTTP请求,将返回的结构使用String 类格式化(可设置为对应返回值格式的类)
ResponseEntity<String> response = client.exchange(url, method, requestEntity, String.class);
return response.getBody();
}
获取access_token
两小时有效期,存redis
public static String getAccessToken() {
Map<String, String> params = new HashMap<>();
params.put("APPID", SMSConfig.applet_appid); //小程序appid
params.put("APPSECRET", SMSConfig.applet_secret); //小程序secret
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+SMSConfig.applet_appid+"&secret="+SMSConfig.applet_secret;
String str = HttpClientUtils.sendGetJsonRequest(url, params);
System.out.println(str);
JSONObject object = JSONObject.parseObject(str);
String Access_Token = object.getString("access_token");
String expires_in = object.getString("expires_in");
System.out.println("Access_Token:" + Access_Token);
System.out.println("object:" + object);
return Access_Token;
}
@PostMapping("sendAppletMsg")
public void sendAppletMsg(@RequestBody String params) {
JSONObject paramsJson = JSONObject.parseObject(params);
String openId = paramsJson.getString("openId");
// 获取token
String token = getAccessToken();
String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=" + token;
JSONObject miniprogram = new JSONObject();
miniprogram.put("appid",SMSConfig.applet_appid); // 微信小程序appid
miniprogram.put("pagepath","pages/index/index"); // 点击消息跳转的小程序页面
JSONObject data = new JSONObject();
JSONObject first = new JSONObject();
JSONObject keyword1 = new JSONObject();
JSONObject keyword2 = new JSONObject();
JSONObject keyword3 = new JSONObject();
JSONObject keyword4 = new JSONObject();
JSONObject remark = new JSONObject();
first.put("value","有新的维修订单");
first.put("color","#173177");
keyword1.put("value","2022-12-11");
keyword2.put("value","保养");
keyword3.put("value","杭州修理站");
keyword4.put("value","15170910419");
remark.put("value","点击进入小程序查看详细信息");
remark.put("color","#173177");
data.put("first", first);
data.put("keyword1",keyword1);
data.put("keyword2",keyword3);
data.put("keyword3",keyword2);
data.put("keyword4",keyword4);
data.put("remark",remark);
JSONObject mpTemplateMSG = new JSONObject();
mpTemplateMSG.put("appid",SMSConfig.WX_APP_KEY); // 微信公众号AppKey
mpTemplateMSG.put("template_id",SMSConfig.WX_TEMPLATE_ID_yyby); // 微信公众号模板id
mpTemplateMSG.put("url","http://weixin.qq.com/download");
mpTemplateMSG.put("miniprogram",miniprogram);
mpTemplateMSG.put("data",data);
JSONObject jsonObject = new JSONObject();
jsonObject.put("touser",openId); // 用户小程序openId
jsonObject.put("mp_template_msg",mpTemplateMSG);
String str = HttpClientUtils.sendPostRequest(url, jsonObject);
JSONObject object = JSONObject.parseObject(str);
System.out.println("========================");
System.out.println(object);
System.out.println(object.getString("errcode"));
System.out.println(object.getString("errmsg"));
}