java 公众号发送模板消息

案例使用 okhttp3.* 发送模板消息


关键参数准备:

ACCEAA_TOKEN   appId 和密钥获取。注意:小程序appId与公众号的appId 并不是一样的;
公众号 	appId
密钥		secret
微信用户唯一码	openid 
模板消息Id	在pc端官网进行设置申请,具体相关规则、限制不在此赘述

微信生态 发送模板消息大同小异

例:服务号发送模板消息,官网文档自行仔细查看

发送模板消息文档:
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html#5

获取ACCESS_Token文档 :
https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html

一切皆对象先处理接口基础参数

发送模板消息 POST数据示例如下:

      {
           "touser":"OPENID",
           "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
           "url":"http://weixin.qq.com/download",  
           "miniprogram":{
             "appid":"xiaochengxuappid12345",
             "pagepath":"index?foo=bar"
           },          
           "data":{
                   "first": {
                       "value":"恭喜你购买成功!",
                       "color":"#173177"
                   },
                   "keyword1":{
                       "value":"巧克力",
                       "color":"#173177"
                   },
                   "keyword2": {
                       "value":"39.8元",
                       "color":"#173177"
                   },
                   "keyword3": {
                       "value":"2014年9月22日",
                       "color":"#173177"
                   },
                   "remark":{
                       "value":"欢迎再次购买!",
                       "color":"#173177"
                   }
           }
       }

实体类:WxTemplateParams

 @Data
public class WxTemplateParams {
    /** 发送给谁 openid*/
    private String touser;
    /** 模板id*/
    private String template_id;
    /** 跳转路径*/
    private String url;
    /** 跳转路径*/
    private String pagepath;
    /** data 中的参数*/
    private List<keyValueColor> valueColorList;
}
 @Data
public class keyValueColor {
    private String keys;
    private ValueColor valueColor;

    public keyValueColor(String keywordNumber, ValueColor valueColorFirst) {
        this.keys = keywordNumber;
        this.valueColor = valueColorFirst;
    }
}
@Data
public class ValueColor {

    public String value;
    public String color;

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

组装数据

 @Slf4j
@Component
public class WxSendTemplate {
	 public void demo() throws Exception {
        WxTemplateParams params = new WxTemplateParams();
        params.setTemplate_id("TN7z7vo9cUX***");
        params.setTouser("oRgQF6N******M");
        params.setUrl("https://wgsheep.top/");
        List<keyValueColor> colorList = new ArrayList<>();
        colorList.add(new keyValueColor("keyword1", new ValueColor("你猜我是谁", "#000000")));
        colorList.add(new keyValueColor("keyword2", new ValueColor("不猜?", "#000000")));
        colorList.add(new keyValueColor("keyword3", new ValueColor("猜猜吧,很好猜中", "#000000")));
        colorList.add(new keyValueColor("keyword4", new ValueColor("猜猜吧,很好猜中", "#000000")));
        colorList.add(new keyValueColor("remark", new ValueColor("猜猜吧,很好猜中", "#000000")));
        colorList.add(new keyValueColor("first", new ValueColor("第一阁", "#000000")));
        params.setValueColorList(colorList);
        JSONObject jsonObject = wx.sendWxTemplate(params);
 	  }
   }

发送模板消息

package com.videoplus.system.wx;

import com.alibaba.fastjson.JSONObject;
import com.videoplus.common.core.redis.RedisCache;
import com.videoplus.system.utils.OkhttpUtils;
import com.videoplus.system.wxTempMessage.WxTemplateParams;
import com.videoplus.system.wxTempMessage.keyValueColor;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Component
public class wx {
    @Autowired
    RedisCache redisCache; //redis
    private static final String APP_ID = "wx0b21*******";
    private static final String SECRET = "fb53477fa1*************";
    private static final String TOKEN_KEY = "wxAccessTokenKey";

    //获取token
    public  JSONObject getWxToken() throws Exception {
        JSONObject jsonObject = new JSONObject();
        try {
            String tokenString = redisCache.getCacheObject(TOKEN_KEY);
            if (StringUtils.isBlank(tokenString)) {
                JSONObject token = getHttpsWxToken();
                if (!token.containsKey("access_token")) {
                    throw new Exception("获取accessToken 失败"+token);
                } else {
                    tokenString = token.get("access_token").toString();
                    redisCache.setCacheObject(TOKEN_KEY, tokenString, 7000, TimeUnit.MILLISECONDS);
                }
            }
            jsonObject.put("accessToken", tokenString);
            return jsonObject;
        } catch (Exception e) {
            e.printStackTrace();
          throw new Exception("获取accessToken 失败"+e);
        }
    }

    //获取token
    protected static JSONObject getHttpsWxToken() {
        //娶个token
        String url = "https://api.weixin.qq.com/cgi-bin/token";
        RequestBody requestBody =new FormBody.Builder()
                .add("grant_type", "client_credential")
                .add("appid", APP_ID)
                .add("secret", SECRET)
                .build();
        return OkhttpUtils.okHttp(requestBody, url);
    }

    //发送模板消息
    public JSONObject sendWxTemplate(WxTemplateParams params) throws Exception {
        Map<String, Object> sv = new HashMap<>();
        List<keyValueColor>  keyValueColorList= params.getValueColorList();
        keyValueColorList.stream().forEach(me -> {
            sv.put(me.getKeys(), me.getValueColor());
        });
        JSONObject wxToken = getWxToken();
        String token = wxToken.getString("accessToken");
        String sendUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;
        Map<String,Object> jsonObject = new HashMap<>();
        jsonObject.put("data",sv );
        jsonObject.put("template_id", params.getTemplate_id());
        jsonObject.put("touser", params.getTouser());
        jsonObject.put("url", params.getUrl());
        System.out.println(JSONObject.toJSONString(jsonObject));
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody requestBody = RequestBody.create(JSON, JSONObject.toJSONString(jsonObject));
        JSONObject jsonObject1 = OkhttpUtils.okHttp(requestBody, sendUrl);
        return jsonObject1;
    }
}

OkHttp 方法封装

import com.alibaba.fastjson.JSONObject;
import okhttp3.*;

public class OkhttpUtils {
    public static JSONObject okHttp(RequestBody requestBody, String url) {
        try {
            Request.Builder request = new Request.Builder();
            //设置消息头
//            request.addHeader(key, String.valueOf(header.get(key)));key
            request.url(url).post(requestBody);
            // 发起请求
            OkHttpClient client = new OkHttpClient();
            Call call = client.newCall(request.build());
            //此处可以异步 call.enqueue();
            Response execute = call.execute();
            String cityBodyString = execute.body().string();
            JSONObject cityJOb = JSONObject.parseObject(cityBodyString);
            return cityJOb;
        } catch (Exception e) {
            return new JSONObject();
        }
    }
}

至此 发送模板消息接口完成
值得优化的点

  1. demo() 方法只是调用接口的实例,应该在组装个实体类 作为请求入参载体 传入demo(Entity entity)
    ,在方法内转化成 WxTemplateParams 实体。
  2. 模板消息 不能批量发送,多个用户只能循环发送 ,建议MQ推送
  3. 多个模板,可以存到数据库或项目启动时存入缓存
  4. 如果业务复杂,需要记录发送的模板避免重复发送
文章结束

祝:IT 之路越走越远 越走越宽!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值