Skip to content

微信模板消息发送

sqmax edited this page Sep 21, 2018 · 4 revisions

微信模板消息的接口在微信公众平台的模板消息接口章节

我们下拉到发送模板消息部分,可以看到如下的接口调用请求说明:

http请求方式: POST
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

可以看到微信要求这是一个post请求,而且给出了如下一个post示例:

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

上面参数的说明文档已说明清楚,可以看到必须要传入的参数有,touser是接受者的openid,然后还有必填项template_id,data是什么东西呢。这是在自己的公众号里设置的,由于我们个人的公众号权限不够,这里可以到申请的测试账号里设置,填写模板消息的界面如下:

看到需要填写这么多请求参数,是不是觉得自己构造请求会很复杂,不用担心,我们仍然可以有现成的SDK可以使用,weixin-java-tools,来到SDK文档说明的MP_发送模板消息部分,我们可以看到使用方式非常简单,仅仅需要构造一个WxMpTemplateMessage对象,传入动态的参数,然后使用WxMpService的sendTemplateMsg(templateMessage),模板消息就发送成功了。

WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
.toUser(...)
.templateId(...)
.url(...)
.build();

templateMessage.getData().add(new WxMpTemplateData(name1, value1, color2));
templateMessage.getData().add(new WxMpTemplateData(name2, value2, color2));

wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);

在我们自己的项目里,我们可以按如下的方式使用:

WxMpTemplateMessage templateMessage=new WxMpTemplateMessage();
        templateMessage.setTemplateId(accountConfig.getTemplateId().get("orderStatus"));//我们把模板消息得templateId写在我们的配置文件里了所以可以这样使用
        templateMessage.setToUser(orderDTO.getBuyerOpenid());//openid:"ozswp1Ojl2rA57ZK97ntGw2WQ2CA"

        List<WxMpTemplateData> data= Arrays.asList(
                new WxMpTemplateData("first","亲,记得收货"),
                new WxMpTemplateData("keyword1","微信点餐"),
                new WxMpTemplateData("keyword2","15712363915"),
                new WxMpTemplateData("keyword3",orderDTO.getOrderId()),
                new WxMpTemplateData("keyword4",orderDTO.getOrderStatusEnum().getMessage()),
                new WxMpTemplateData("keyword5","¥"+orderDTO.getOrderAmount()),
                new WxMpTemplateData("remark","欢迎再次光临"));
        templateMessage.setData(data);

        try {
            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        }catch (WxErrorException e){
            log.error("【微信模板消息】发送失败,{}",e);
        }

最后我们是在处理订单的Service里的完结订单方法里使用推送模板消息的PushMessageService业务对象的。

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMasterRepository orderMasterRepository;

    @Autowired
    private PushMessageService pushMessageService;

    @Autowired
    private WebSocket webSocket;

    @Override
    @Transactional
    public OrderDTO finish(OrderDTO orderDTO) {
        //判断订单状态
        if(!orderDTO.getOrderStatus().equals(OrderStatusEnum.NEW.getCode())){
            log.error("【完结订单】 订单状态不正确,orderId={},orderStatus={}",orderDTO.getOrderId(),orderDTO.getOrderStatus());
            throw new SellException(ResultEnum.ORDER_STATUS_ERROR);
        }
        //修改订单状态
        orderDTO.setOrderStatus(OrderStatusEnum.FINISHED.getCode());
        OrderMaster orderMaster=new OrderMaster();
        BeanUtils.copyProperties(orderDTO,orderMaster);
        OrderMaster updateResult=orderMasterRepository.save(orderMaster);
        if(updateResult==null){
            log.error("【完结订单】更新失败,orderMaster={}",orderMaster);
            throw new SellException(ResultEnum.ORDER_UPDATE_FAIL);
        }
        //推送微信模板消息
        pushMessageService.orderStatus(orderDTO);

        return orderDTO;
    }

这样关注我们公众号的用户就可以收到如下样式的提醒消息。

Clone this wiki locally