微信小程序消息推送

小程序没有消息推送,用的是公众号的模板消息

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"));
    
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程有财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值