如果要模板参数可配置化:可以让小程序端传入数组 服务端拿字符串转Map
例如小程序端:wx_data_parameter(自定义) 值请传入数组格式实现模板参数可配置,服务端解析放入map进行传参
[{"key":"amount1","value":"200"},{"key":"thing3","value":"赵"},{"key":"date4","value":"2021-01-07"},{"key":"thing5","value":"您的提现申请我们已发送给银行"},{"key":"thing6","value":"1235235"}]
// @OpenApi 项目中自己封装的校验,你们可以用@RequestBody
@RequestMapping(value = "/sendWeChatMsgByOpenid", method = RequestMethod.POST)
public ResponseEntity<RestResponse> sendWeChatMsgByOpenid(@OpenApi WxSendParam wxSendParam) {
try {
if(StringUtils.isBlank(wxSendParam.getOpenId())){
return RestResponse.createFailRes("微信标识ID为空");
}else {
System.out.printf(wxSendParam.getWx_data_parameter());
Object parse = JSONObject.parse(wxSendParam.getWx_data_parameter());
JSONArray jsonArray = JSON.parseArray(parse.toString());
List<JSONObject> jsonObjectList = jsonArray.toJavaList(JSONObject.class);
Map<String, String> mapParameter = jsonObjectList.stream().filter(Objects::nonNull).collect(Collectors.toMap(item -> item.getString("key"), item -> item.getString("value")));
//不是创建模板了么,模板几个参数map.put你就放几个
// touser; //接收者(用户)的 openid
// template_id; //所需下发的模板消息的id
// page; //点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
//Map<String,WeChatTemplateData> data; //模板内容,不填则下发空模板
// String emphasis_keyword; //模板需要放大的关键词,不填则默认无放大
RestTemplate restTemplate = new RestTemplate();
//这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken();
//拼接推送的模版
WeChatSendTemplateMessage wxMssVo = new WeChatSendTemplateMessage();
wxMssVo.setTouser(wxSendParam.getOpenId());//用户的openid(要发送给那个用户,通常这里应该动态传进来的)
wxMssVo.setTemplate_id(wxSendParam.getTemplate_id());//订阅消息模板id
wxMssVo.setPage(wxSendParam.getWx_page());
wxMssVo.setMiniprogram_state("developer");//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
Map<String, WeChatTemplateData> map = new HashMap<>();
for (String key : mapParameter.keySet()) {
System.out.println("key:" +key +" value:"+mapParameter.get(key));
map.put(key,new WeChatTemplateData(mapParameter.get(key)));
}
wxMssVo.setData(map);
ResponseEntity<String> responseEntity =
restTemplate.postForEntity(url, wxMssVo, String.class);
//System.out.println("responseEntity.getBody()"+responseEntity.getBody());
String errcode = String.valueOf(JSONObject.parseObject(responseEntity.getBody()).get("errcode"));
if(errcode.contains("43101")){
System.out.printf("用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系");
return RestResponse.createFailRes("用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系");
}else if(errcode.contains("40003")){
System.out.printf("touser字段openid为空或者不正确");
return RestResponse.createFailRes("touser字段openid为空或者不正确");
}else if(errcode.contains("40037")){
System.out.printf("订阅模板id为空不正确");
return RestResponse.createFailRes("订阅模板id为空不正确");
}else if(errcode.contains("47003")){
System.out.printf("模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错");
return RestResponse.createFailRes("模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错");
}else if(errcode.contains("41030")){
System.out.printf("page路径不正确,需要保证在现网版本小程序中存在,与app.json保持一致");
return RestResponse.createFailRes("page路径不正确,需要保证在现网版本小程序中存在,与app.json保持一致");
}
System.out.println(responseEntity.getBody());
return RestResponse.createSuccessRes(responseEntity.getBody());
}
} catch (Exception e) {
log.error(e.getMessage(), e);
return RestResponse.createFailRes("失败:" + e.getMessage());
}
}
private String getAccessToken() {
RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<>();
String appid ="";
String secret ="";
Properties properties=null;
try {
properties = PropertiesLoaderUtils.loadAllProperties("application.properties");
appid = properties.getProperty("weixin.appid");
secret = properties.getProperty("weixin.secret");
} catch (IOException e) {
e.printStackTrace();
}
params.put("APPID", appid);
params.put("APPSECRET", secret);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
String body = responseEntity.getBody();
JSONObject object = JSON.parseObject(body);
String Access_Token = object.getString("access_token");
String expires_in = object.getString("expires_in");
System.out.println("微信发送消息有效时长expires_in:" + expires_in);
return Access_Token;
}
import lombok.Data;
/**
* 微信发送通知
*/
@Data
public class WxSendParam {
private String loginName;
private String openId;
private String id;
private String template_id;
private String wx_page;//微信通知跳转页面
private String wx_data_parameter;//微信通知参数
}
public class WeChatTemplateData {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public WeChatTemplateData(String value) {
this.value = value;
}
public WeChatTemplateData() {
}
}
import java.util.Map;
/**
* 发送模板消息
* @Author: chufangbo
* @CreateDate: 2021/01/06 16:21
*/
public class WeChatSendTemplateMessage {
private String touser; //接收者(用户)的 openid
private String template_id; //所需下发的订阅模板id
private String page; //点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
private Map<String,WeChatTemplateData> data; //模板内容,不填则下发空模板
private String miniprogram_state; //跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
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 getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public Map<String, WeChatTemplateData> getData() {
return data;
}
public void setData(Map<String, WeChatTemplateData> data) {
this.data = data;
}
public String getMiniprogram_state() {
return miniprogram_state;
}
public void setMiniprogram_state(String miniprogram_state) {
this.miniprogram_state = miniprogram_state;
}
}