uni-app实现微信推送消息

一、准备工作

1. 注册微信开放平台和微信公众平台

  • 微信开放平台还需要开发者资质认证
    在这里插入图片描述
  • 微信公众平台必须是服务号,需要通过消息模板推送

2. 创建移动应用

在这里插入图片描述

3. 绑定微信服务号

在这里插入图片描述

必须绑定,通过开放平台获取unionid,与公众号的unionid匹配。
不绑定的话,公众号获取不到unionid


二、使用微信登录获取unionid

uni.login({
	provider: "weixin",
	success: function(loginRes) {
		var wechatUnionid = loginRes.authResult.unionid;
	}
});

三、微信公众号服务器配置和验证令牌Token

在这里插入图片描述

@RequestMapping("verifyToken")
public byte[] verifyToken(String signature, String timestamp, String nonce, String echostr) throws UnsupportedEncodingException {
	List<String> params= new ArrayList<>();
	params.add(nonce);
	params.add(timestamp);
	// 在微信公众号平台上设置的Token
	params.add("token");

	if (echostr!=null){
		// 确定是否是微信的请求,验证是否正确签名,返回echostr
		if(wechatUtil.verifySignature(params,signature)){
			return URLEncoder.encode(echostr,"UTF-8").getBytes();
		} else {
			return null;
		}
	} else {
		return null;
	}
}

public boolean verifySignature(List<String> params,String signature){
	// 字典序排序
	Collections.sort(params);
	// SHA1加密
	String paramsStr = StringUtils.join(params.toArray(),"");
	String checksignature = DigestUtils.shaHex(paramsStr);
	return checksignature.equals(signature);
}

四、获取并缓存access_token

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数 是否必须 说明
grant_type 获取access_token直接填写client_credential
appid 开发者ID(AppID)
secret 开发者密码(AppSecret)

五、获取公众号用户信息openid和unionid

  • 获取openid

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID

参数 是否必须 说明
access_token 调用接口凭证
next_openid 第一个拉取的OPENID,不填默认从头开始拉取
  • 获取unionid

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

参数 是否必须 说明
access_token 调用接口凭证
openid 普通用户的标识,对当前公众号唯一
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
  • 通过开放平台绑定微信公众号,公众号才能获取到unionid。

六、通过openid推送模板消息

  • 在公众号设置模板消息的模板,可以得到模板id
    在这里插入图片描述
    在这里插入图片描述
  • 通过开放平台获取到的unionid与公众号的unionid匹配就可以获取到openid,使用openid推送

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

参数 是否必须 说明
access_token 调用接口凭证
  • 后端创建实体类
public class TemplateContentEntity {

    public String touser; //用户OpenID
    public String template_id; //模板消息ID
    public HashMap<String,TemplateDataEntity> data;

    @Override
    public String toString() {
        return "{" +
                "touser='" + touser + '\'' +
                ", template_id='" + template_id + '\'' +
                ", data=" + data +
                '}';
    }
}
public class TemplateDataEntity {

    public String value;
    public String color;

    public TemplateDataEntity(String value, String color){
        this.value = value;
        this.color = color;
    }

    @Override
    public String toString() {
        return "{" +
                "value='" + value + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}
  • 推送代码
@RequestMapping("sendTemplateMsg")
public JSONObject sendTemplateMsg(String openid,String msg){
    // 模板消息实体类
    TemplateContentEntity temp = new TemplateContentEntity();
    temp.touser=openid;
    temp.template_id = wechatTemplateID;
    LinkedHashMap<String, TemplateDataEntity> data = new LinkedHashMap<>();
    data.put("first",new TemplateDataEntity("消息","#173177"));
    data.put("keyword1",new TemplateDataEntity(msg,"#000"));
    data.put("keyword2",new TemplateDataEntity(nowTime,"#000"));
    data.put("remark",new TemplateDataEntity("如有问题请联系管理员","#173177"));
    temp.data= data;
    // sendMessage使用post传json格式
    return wechatUtil.sendMessage(temp);
}

这样就可以实现功能了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章