微信小程序消息推送需要用户触发动作才能发送消息,比如用户提交订单、支付成功。一次只能发一条。也就是说只有用户点了小程序,操作了form表单提交然后生成一个formid ,才可以通过这条formid可以推送一条模板消息 。也就是用户不点你小程序按钮,就不会推送。(微信真的是神坑。。。)
微信小程序消息推送分两种,一种直接从小程序的前端页面发起请求推送,另外一种在后台发起请求进行消息推送
一、微信端发起请求
首先,登录微信小程序后台添加或创建消息模板拿到模板id,这个操作就不多说了,
1.获取access_token
access_token是接口调用的凭证,目前有效期为两个小时,需要定时刷新,重复获取将导致上次获取的access_token失效。
获取access_token的接口地址:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET发送模板的消息接口地址:
https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
小程序wxml页面代码:
<form report-submit bindsubmit='formaction'>
<button form-type="submit">发送模板消息</button>
</form>表单提交触发事件
formaction: function (e) {
var formId = e.detail.formId;//获取formid
var l = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=' + this.data.token;
var d = {
"keyword1": {
"value": "00273",
"color": "#4a4a4a"
},
"keyword2": {
"value": "红火早餐店",
"color": "#9b9b9b"
},
"keyword3": {
"value": "5元",
"color": "#9b9b9b"
},
"keyword4": {
"value": "包子、豆浆",
"color": "#9b9b9b"
},
"keyword5": {
"value": "5元",
"color": "#9b9b9b"
},
"keyword6": {
"value": "2019年11月18日 12:30",
"color": "#9b9b9b"
}
};
console.log(d)
wx.request({
url: l,
//注意不要用value代替data
data: {
touser: '',//用户的openid
template_id: '',//申请的模板消息id,
page: '/pages/test/test',
form_id: formId ,
data: d,
color: '#ccc',
emphasis_keyword: 'keyword1.DATA'
},
method: 'POST',
success: function (res) {
console.log("发送成功");
console.log(res);
},
fail: function (err) {
// fail
console.log("push err")
console.log(err);
}
});
},
二、后台发起请求(这里我用的java写的)
1、懒得解释,直接贴后台代码,大部分都有注释(这里有些代码是借用别人的博客总结过来的,具体地址做的早了也忘了,不好意思)
/*
* 小程序推送所需数据
* */
public class WxMssVo {
private String touser;//用户openid
private String template_id;//模版id
private String page = "pages/index/index";//默认跳到小程序首页
private String form_id;//收集到的用户formid
// private String emphasis_keyword = "keyword1.DATA";//放大那个推送字段
private Map<String, TemplateDataVo> data;//推送文字
public String getTouser() {
return touser;
}
public void setTouser(String touser) {
this.touser = touser;
}
public String getTemplate_id() {
return template_id;
}
public void setTemplate_id(String template_id) {
this.template_id = template_id;
}
public String getForm_id() {
return form_id;
}
public void setForm_id(String form_id) {
this.form_id = form_id;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public Map<String, TemplateDataVo> getData() {
return data;
}
public void setData(Map<String, TemplateDataVo> data) {
this.data = data;
}
}
/*
* 设置推送的文字和颜色
* */
public class TemplateDataVo {
//字段值例如:keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
private String value;//依次排下去:需要推送的内容
// private String color;//字段颜色(微信官方已废弃,设置没有效果)
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package com.cqe.service;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.JSONObject;
import com.cqe.entity.TemplateDataVo;
import com.cqe.entity.WxMssVo;
@Service
public class WeChatService {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
/**
*
* @param access_token app的token
* @param openid 用户openid
* @param formId 表单ID
* @param templateId 模板ID
* @param keywords {与模板字段一一对应}
* @return
*/
public String pushOneUser(String appid,String appsecret,String openid, String formId,String templateId,String[] keywords) {
//如果access_token为空则从新获取
String access_token = getAccess_token(appid,appsecret);
String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +
"?access_token=" + access_token;
//拼接推送的模版
WxMssVo wxMssVo = new WxMssVo();
wxMssVo.setTouser(openid);//用户openid
wxMssVo.setForm_id(formId);//formId
wxMssVo.setTemplate_id(templateId);//模版id
Map<String, TemplateDataVo> m = new HashMap<String, TemplateDataVo>();
//封装数据
if(keywords.length>0){
for(int i=1;i<=keywords.length;i++){
TemplateDataVo keyword = new TemplateDataVo();
keyword.setValue(keywords[i-1]);
m.put("keyword"+i, keyword);
}
wxMssVo.setData(m);
}else{
System.out.println("keywords长度为空");
return null;
}
if(restTemplate==null){
restTemplate = new RestTemplate();
}
ResponseEntity<String> responseEntity =
restTemplate.postForEntity(url, wxMssVo, String.class);
System.out.println("小程序推送结果={}"+ responseEntity.getBody());
return responseEntity.getBody();
}
/*
* 获取access_token
* appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
* */
public String getAccess_token(String appid,String appsecret) {
//获取access_token
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
"&appid=" + appid + "&secret=" + appsecret;
if(restTemplate==null){
restTemplate = new RestTemplate();
}
String json = restTemplate.getForObject(url, String.class);
JSONObject myJson = JSONObject.parseObject(json);
return myJson.get("access_token").toString();
}
public static void main(String[] args) {
String appid = "";
String appsecret = "";
System.out.println(new WeChatService().getAccess_token(appid,appsecret));
WeChatService weChatUtil = new WeChatService();
String values[] ={"Jack方","2019-5-8 10:10:10","xxx有限公司","JAVA开发","xx区xx广场xx号","请带好入职材料"};
weChatUtil.pushOneUser(appid,appsecret,"openid","formid","模板id",values);//执行这部分代码会推送
}
}
以上两种方法亲测可用,由于我用的模板是项目中的和我测试用的推送信息不符,所以就不上图了,但是两种方法都是测试通过的
版权声明:本文为wy123123000原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。