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();
}
}
}
至此 发送模板消息接口完成
值得优化的点
祝:IT 之路越走越远 越走越宽!