调用已创建微信公用模版消息类
紧接着上一遍继续微信公众号模版(一) 其实调用不难 只是中间可能会出现的问题 ,调用了 传过去值没有处理,没有按照微信的要求讲结构传过去 ,或者说传值不对,那么将会出现的问题
正常的
所以我们调用前可以自己写一个小的测试demo将数据测试一下
String str = "我是外边第一个";
String strOne = "我是外边第二个";
String strTwo = "我是外边第三个";
String strFirst = "我是里边头部";
String stOne = "我是里边第一个";
String stTwo = "我是里边第二个";
String stThere = "我是里边第三个";
String stRemark = "我是里边尾部";
// 外部内容
JSONObject object =new JSONObject();
object.put("touSer",str);
object.put("template_id",strOne);
object.put("url",strTwo);
// data内容
String[] strArray = {"First","keyword1","keyword2","keyword3","remark"};
String[] strArr = {strFirst,stOne,stTwo,stThere,stRemark};
JSONObject jsonObject = new JSONObject();
for (int i = 0; i < strArray.length; i++) {
JSONObject Json = new JSONObject();
Json.put("value",strArr[i]);
jsonObject.put(strArray[i], Json);
}
object.put("date",jsonObject);
System.out.println(object);
使用JSON拼接或者数组拼接都可以直接运行这个代码 放在psvm中
运行过是这个样子的直接吧所有的复制然后在百度搜索一个JSON格式化
这个挺好用
https://www.bejson.com/json/format/
这个效验过的 与微信要求的是一致的 顺序没有关系
这样的所有测试工作就OK了
调用公用类
我们去看上一章所要求的值微信公众号模版(一)然后仔细的可以看到有的是不用传的有的是必须传的 但是不必传的 也需要传个null
根据这些值 直接上demo
package com.WeChat;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author: LIJia
* @date: 2021-09-17 15:27
**/
@RestController
@RequestMapping("/action/buy/WeChatTemp")
public class WeChatTempController {
private static Logger logger = Logger.getLogger(WeChatTempController.class);
@Autowired
private WeChatTempService weCharTempService;
// @ApiOperation(value = "发送微信模版消息",response = WeChatTempController.class,notes = "查询商品信息调用微信模版发送模版消息")
// @ApiImplicitParams({
// @ApiImplicitParam(paramType = "query",dataType = "String",name = "serialNumber",value = "订单流水号",required = true),
// @ApiImplicitParam(paramType = "query",dataType = "String",name = "accessToken",value = "accessToken",required = true),
// @ApiImplicitParam(paramType = "query",dataType = "String",name = "openId",value = "openId",required = true)})
@RequestMapping(value = "/selOrderMainByNum",method = RequestMethod.POST)
public JSONObject selOrderMainByNum(@RequestParam("serialNumber")String serialNumber,
@RequestParam("accessToken")String accessToken,
@RequestParam("openId")String openId){
// 查询订单信息
WeChatTemp weChatTemp = weCharTempService.selOrderMainByNum(serialNumber);
// 尾部
//这里因为业务的要求所有做了两个尾部 是根据特殊字短限定
//这个模版主要的用途是 微信支付成功相关的
//如果说你也是处理相关业务的话可以直接用
//根据不同的商品显示不同的尾部信息
String remark = "尾部1";
//String remarkTwo = "尾部2";
//这个部分是处理业务需要的 大部分的业务用不到话这个
//List<ItemCenterProduct> product = weChatTemp.getItemCenterProductsList();
//List<String> specialList = new ArrayList<>();
//for (int i = 0; i < product.size() ; i++) {
// Integer special = product.get(i).getSpecial();
// if (special == 0 || special == 1) {
// specialList.add(remark);
// }else if(special == 2){
// specialList.add(remarkTwo);
// }
// }
//Set<String> setHash = new HashSet<>();
// setHash.addAll(specialList);
// String specialTwo = StringUtils.join(setHash,",")+"。";
// 获取模版需要跳转的商城——我的页面
String url = "https://www.baidu.com/";
// 获取模版Id
//这个可以提前陪知道数据库或者存入配置文件 相信我你们一定有读取配置文件的办法
//如果没有 也不想存数据库 那么直接在放进去
//这个模版Id是在你登陆微信公众号平台后选择的固定模版 他会生成相应Id
String tempId = "模版ID";
// 调用公用模版消息
WeChetUtil weCherUtil =new WeChetUtil();
// 时间转换字符串 下边多处复用提前定义
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 支付价格转换为字符串
BigDecimal bigDecimal =weChatTemp.getTotalPrice();
String pay = bigDecimal.setScale(2,BigDecimal.ROUND_HALF_DOWN).toString();
// 通用信息提前获取
// data里边内容
// 头部
String first = "恭喜您,支付成功!";
// keyWord1
String keyWord1 = weChatTemp.getSerialNumber();
// keyWord2
String keyWord2 = dateFormat.format(weChatTemp.getPaymentTime());
// keyWord3
String keyWord3 = pay;
// keyWord4
String keyWord4 = null;
if(weChatTemp.getPaymentType().equals("weixin")){
keyWord4 = "微信支付";
}else if(weChatTemp.getPaymentState().equals("alipay")){
keyWord4 = "银行卡支付";
}
return weCherUtil.WeChetTemp(accessToken,openId,tempId,url,first,keyWord1,keyWord2,keyWord3,keyWord4,remark);
}
}
这样就算是调用完成了
调用成功的你会在公众号收到模版。
你的肯定是白色的 我这是因为系统的原因到点了自动就变成暗色的
这个就是对的
这里提一个比较重要的 我这里的 access_token 和 openId 的获取方式是在其他服务所以 我在网关层调用的相应的微服务,将值传进来的
不过微信提供的也有获取access_token的接口
openId的话也是有相应的接口
总结
这就算是接完了。其实代码没多少最恶心的就是这个数据结构,不过我给你们列举了两种在微信公众号模版(一)
第一种 通过JSON字符串拼接
第二种 通过数组拼接
不过使用 ArrayList应该也可以
不过尽量举一反三 程序嘛 不可能有最好的,也不可能只有一种形式实现,
所以说程序没有最好的。也没有最还坏的。
下次准备出一个 发送短信的 、Itext7的教程 或者 一些基础的增删改查