微信小程序之消息模板推送

        微信小程序消息推送需要用户触发动作才能发送消息,比如用户提交订单、支付成功。一次只能发一条。也就是说只有用户点了小程序,操作了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版权协议,转载请附上原文出处链接和本声明。