微信小程序消息模板设计及实现

这篇具有很好参考价值的文章主要介绍了微信小程序消息模板设计及实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文以微信小程序内置的两个模板:购买成功和评论回复提醒为例来阐述第三方微信小程序平台的设计。

小程序端

    微信用户支付成功后,微信服务通知中会收到支付成功服务提醒。见下图:

微信小程序消息模板设计及实现

商家端

用户完成评价后,商家管理端可以查看评论。见下图:

微信小程序消息模板设计及实现

商家进行回复:

微信小程序消息模板设计及实现

商家回复微信小程序用户的评论后,微信用户在微信的服务通知会收到评价回复提醒,用户点开后可以查看回复的详情。

微信小程序消息模板设计及实现

这些效果如何实现的呢? 

 1 首先介绍表设计

 1.1 服务评价及留言表设计

  这张表关键字段是订单ID(order_id)、服务评价留言(msg)、商家管理员后台回复信息(reply_msg)及商家管理员的帐号ID(admin_id) 。 一个订单服务只可被评价一次和回复一次。

CREATE TABLE `t_order_comment` (

  `id` bigint NOT NULL,

  `stars` smallint DEFAULT '0',

  `order_id` bigint NOT NULL,

  `msg` varchar(200) DEFAULT NULL,

  `openid` varchar(64) NOT NULL,

  `submit_time` datetime DEFAULT NULL,

  `reply_time` datetime DEFAULT NULL,

  `reply_msg` varchar(200) DEFAULT NULL,

  `admin_id` bigint DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `uniq_order_id` (`order_id`),

  KEY `index_openid` (`openid`),

  KEY `index_adminid` (`admin_id`)

) ;

1.2 小程序消息模板设置表

 描述商家小程序与小程序模板的关联关系。一个小程序可以设置多个消息模板。

component_appid: 微信第三方平台应用appid;

authorizer_appid: 商家小程序appid;

business_type: 业务枚举字典,如:购买成功(buy_success)和评价回复(order_comment_reply);

msg_template_id: 微信小程序的模板ID 

CREATE TABLE `t_mini_msg_set` (

  `id` bigint NOT NULL,

  `component_appid` varchar(64) NOT NULL,

  `authorizer_appid` varchar(64) NOT NULL,

  `business_type` varchar(32) NOT NULL,

  `business_type_des` varchar(64) DEFAULT NULL,

  `msg_template_id` varchar(64) NOT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `component_appid_msg_template_id` (`component_appid`,`authorizer_appid`,`msg_template_id`)

) ;

2 前端设计

2.1 小程序端提交评价

 小程序端订单服务评价设计。 源码参考:

<van-action-sheet show="{{ commentShow }}" title="订单服务评价" bind:close="onMsgClose">
  <view style="height: 160px">

  <van-cell-group>

   <van-rate value="{{ stars }}" bind:change="onStarsChange" />

    <van-field
      value="{{ msg }}"
      label="留言建议 "
      type="textarea"
      placeholder="请输入留言"
      autosize="{maxHeight: 100, minHeight: 50}"
      input-class="textarea"
      border="{{ false }}" bind:change="msgChange"
    />

     <van-button type="info" size="small"  block bindtap="submitComment">提交评价</van-button>


  </van-cell-group>

效果如下: 

微信小程序消息模板设计及实现

2.2 小程序端订阅消息模板

其中,tmplIds 是从表 《1.2 小程序消息模板设置表》中动态读取的小程序模板ID集合,用户在小程序上支付成功后,会提示微信用户是否订阅消息模板。

wx.requestSubscribeMessage({

         tmplIds: app.globalData.miniMsgTemplateIds,
         success (res) {
            console.log('--->接受订阅返回 :'+JSON.stringify(res));
         }
})

2.3  商家端设计

商家登录商家端后,进入订单评价界面。前面已介绍。

3 平台端

平台端可以对多个商家小程序进行统一管理。包括对各个商家小程序的消息模板进行管理设置。

平台管理员登录后,在授权小程序管理栏目打开授权小程序的管理页面。点操作栏的“小程序分类及消息模板设置”图标

微信小程序消息模板设计及实现

从上图可以看出,商家小程序已选择了 “评论回复提醒”和“支付成功通知”两个模板消息。

可以查看具体的小程序分类中所有可以选择的消息模板。如下图:

  

微信小程序消息模板设计及实现

点击“查看分类下的消息模板”后进入可以选择的消息模板列表,如下图:

微信小程序消息模板设计及实现

小程序的模板要求比较严格,不是所有的消息模板可以使用,根据小程序的商家营业范围来界定。故要在小程序的分类下去选择消息模板。在上图的操作栏中,点“修改”图标,可以进入任意一个消息模板选择消息模板中使用的关键词,如下图:

微信小程序消息模板设计及实现

选择好模板的关键词后点“确定”按钮进行保存, 这样就保存了商家小程序与消息模板的关联关系。,这样消息模板就在平台端配置好了。

商家的小程序在用户触发相关的动作后就用平台自动就会向用户发送小程序模板消息。

参考代码如下:

 平台向微信用户发送模板消息(服务通知消息)是异步的, 下面仅给出关键逻辑。

public void  handleSQSOrderCommentReply( JSONObject body) throws Exception {

    Long id = body.getLong("id");
    Optional<OrderComment> ocOp =  orderCommentRepository.findById(id);
    if (ocOp == null || !ocOp.isPresent()) {
        log.error("评论记录不存在{}", id);
        return ;
    }
    OrderComment  oc = ocOp.get();

    Optional<Order> orderOp = orderRepository.findById(oc.getOrder_id());

    if ( orderOp == null || !orderOp.isPresent()) {
        log.error("评论记录不存在{}", id);
        return ;
    }

    Order order = orderOp.get();

    OrderCommentReply reply = new  OrderCommentReply();
    reply.setReply_msg(oc.getReply_msg());
    reply.setReply_time(oc.getReply_time());
    reply.setMsg(oc.getMsg());

    JSONObject bizData = MiniMsgUtil.packageBizData(MiniMsgTypeEnum.comment_reply.getValue(), reply,  OrderCommentReply.class);

  /*
    {
 *     msg_type: XX ,
 *     component_appid: XX,
 *     authorizer_appid: XX,
 *     template_id: XX,
 *     touser: XX,
 *     data: JSON , //业务方的对象
 *     miniprogram_state: "formal",
 *     lang: "zh_CN",
       page: /pages/orderdetail/orderdetail?order_status={{order.order_status}}&id={{order.id}}"

  }  */

    JSONObject reqBody = new JSONObject();
    reqBody.put("msg_type", MiniMsgTypeEnum.comment_reply.getValue());
    reqBody.put("component_appid", platAppId);
    reqBody.put("authorizer_appid", order.getAppid());
    reqBody.put("touser", order.getMember_id());
    reqBody.put("miniprogram_state", "formal");
    reqBody.put("lang", "zh_CN");
    reqBody.put("page", "/pages/htabs/tabs?appid="+order.getAppid()+"&shopid="+order.getShopid());

    log.info("---> component_app_id {} mini_appid {} ",platAppId, order.getAppid());

    MiniMsgSet  set = miniMsgSetRepository.findMiniMsgSetByBusinessType(platAppId,order.getAppid(), MiniMsgTypeEnum.comment_reply.getValue());

    if (set == null) {
        log.error("未配置消息模板");
        return ;
    }
    reqBody.put("template_id", set.getMsg_template_id());

    wechatMiniTempMsgSendService.sendTemplateMsg(reqBody, bizData);



}


public void  handleSQSBuySuccess( JSONObject body) throws Exception {

    Long order_id = body.getLong("order_id");
    Optional<Order> orderOp = orderRepository.findById(order_id);

    if ( orderOp == null || !orderOp.isPresent()) {
        log.error("购买记录不存在{}", order_id);
        return ;
    }

    Order order = orderOp.get();

    BuySuccess buy = new BuySuccess();
    buy.setFinish_time(order.getFinish_time());
    buy.setOrder_no(WechatTool.getOrderNo(order.getOrder_no()));
    buy.setProduct_name(order.getGoods_brief());
    buy.setTotal_fee(String.valueOf(order.getTotal_fee()));

    JSONObject bizData = MiniMsgUtil.packageBizData(MiniMsgTypeEnum.buy_success.getValue(),buy,  BuySuccess.class);
    log.info("--->发送信息业务JSON {}", bizData);
    log.info("---> component_appid {} miniId {}",order.getPlatform_appid(),order.getAppid() );
    MiniMsgSet  set = miniMsgSetRepository.findMiniMsgSetByBusinessType(order.getAppid(), MiniMsgTypeEnum.buy_success.getValue());

    if (set == null) {
        log.error("未配置消息模板");
        return ;
    }


  /*
    {
 *     msg_type: XX ,
 *     component_appid: XX,
 *     authorizer_appid: XX,
 *     template_id: XX,
 *     touser: XX,
 *     data: JSON , //业务方的对象
 *     miniprogram_state: "formal",
 *     lang: "zh_CN"

  }  */

    JSONObject reqBody = new JSONObject();
    reqBody.put("msg_type", MiniMsgTypeEnum.buy_success.getValue());
    reqBody.put("component_appid", platAppId);
    reqBody.put("authorizer_appid", order.getAppid());
    reqBody.put("touser", order.getMember_id());
    reqBody.put("miniprogram_state", "formal");
    reqBody.put("lang", "zh_CN");
    reqBody.put("template_id", set.getMsg_template_id());
    reqBody.put("page", "/pages/htabs/tabs?appid="+order.getAppid()+"&shopid="+order.getShopid());

    wechatMiniTempMsgSendService.sendTemplateMsg(reqBody, bizData);





}

第三方平台发送微信小程序消息的通用逻辑:

/**
 * 通用发送小程序模板消息
 *  @param body: 公共的部分协议
 *
 *  {
 *     msg_type: XX ,
 *     omponent_appid: XX,
 *     authorizer_appid: XX,
 *     template_id: XX,
 *     touser: XX,
 *     data: JSON , //业务方的对象
 *     miniprogram_state: "formal",
 *     lang: "zh_CN"
 *
 *  }
 * @param bizData:  业务部分协议
 * @return
 * @throws Exception
 * @ MiniMsgTypeEnum
 */
public void sendTemplateMsg(JSONObject body , JSONObject bizData) throws Exception {

    String msg_type = body.getString("msg_type");
    if (StringUtils.isEmpty(msg_type)) {

        throw new Exception("消息类型必传");
    }

    if (!MiniMsgTypeEnum.isValid(msg_type)) {

        throw new Exception("消息类型不合法");
    }

    String component_appid = body.getString("component_appid");
    String authorizer_appid = body.getString("authorizer_appid");


    PlatformGrant grant = getApiToken(component_appid, authorizer_appid);

    String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + grant.getAuthorizer_access_token();
    body.remove("msg_type");
    body.remove("component_appid");
    body.remove("authorizer_appid");

    log.info("--->发送模板消息 body {}", body); // body {touser=ojM8n5G69FSxiF8Cu1aBefp_3c04, miniprogram_state=formal, template_id=FNyV8MnOhDZ9KCQ8QWBy2KMZ2i5oj3n0auwrYf-4cV4, lang=zh_CN}

    body.put("data", bizData );


    log.info("--->发送模板消息完整业务协议 body {}", body); // body {touser=ojM8n5G69FSxiF8Cu1aBefp_3c04, miniprogram_state=formal, template_id=FNyV8MnOhDZ9KCQ8QWBy2KMZ2i5oj3n0auwrYf-4cV4, lang=zh_CN}

    String response = doPostStr(url, body);
    log.info("----> 发送模板消息返回 response {}", response);

    JSONObject res =  JSONObject.parseObject(response);

    Integer status = res.getInteger("errcode");
    if (status != null && status.intValue() == 0) {

        log.info("-->>模板消息成功发送<<-----");
    } else {

        throw new Exception(res.getString("errmsg"));

    }


}

详细的设计请参见:

https://github.com/alanjiang/mini-wechat-doc

也可参考这篇文章

小程序消息订阅和回复新功能上线文章来源地址https://www.toymoban.com/news/detail-457757.html

到了这里,关于微信小程序消息模板设计及实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序云开发通过服务号给用户推送模板消息

    主要参考下面两个文章 1、云函数接收公众号消息推送 | 微信开放社区 ​​​​​​2、微信小程序通过公众号(服务号)推送通知或提醒步骤及代码(一,获取推送前所需信息)_微信小程序推送服务通知_庆登登登的博客-CSDN博客  一些基本的概念就不讲了,这里主要讲下步骤和我

    2024年02月09日
    浏览(51)
  • 微信小程序打怪之定时发送模板消息(node版)

    背景描述 小程序答题签到功能,为了促进日活,需要每天定时向当日未签到的用户推送消息提醒签到。 读本篇之前最好已经了解微信关于发送模板消息的相关文档: 模板消息指南 模板消息服务接口 说明: 作者也是第一次写小程序的定时模板消息功能,作为一个纯种前端攻城

    2024年02月03日
    浏览(43)
  • 微信小程序 | 微信公众平台SpringBoot开发实例 │ 模板消息的应用开发

     在手机微信公众号中输入文本(如“你好”),公众号发送两条模板消息,如下图所示。 模板消息用来帮助公众号进行业务通知,是在模板内容中设定参数(参数必须以{ {开头,且以.DATA} }结尾)并在调用时为这些参数赋值并发送的消息。模板消息仅用于向用户发送重要的服务

    2024年02月03日
    浏览(51)
  • uniapp+微信小程序获取openId,获取access_token,订阅消息模板,java后台发送消息

    1.前期准备 2.用户订阅消息 3.获取openId(uniapp) 4.获取access_token 5.发送消息 6.请求的代码Springboot(自己写有发送请求方法的可以不用看) 在微信公众号申请订阅消息 在公共模板这里选用模板, 模板种类跟小程序设置的类目有关,只有特殊的类目有长期订阅模板 类目可以在设

    2024年02月03日
    浏览(43)
  • 【微信小程序】如何获得自己当前的定位呢?本文利用逆地址解析、uni-app带你实现

    目录 前言 效果展示 一、在腾讯定位服务配置微信小程序JavaScript SDK 二、使用uni-app获取定位的经纬度 三、 逆地址解析,获取精确定位 四、小提示 在浏览器搜索腾讯定位服务,找到官方网站,利用微信或者其他账号注册登录,登录后如下图操作 点进去之后,可以看到如下图

    2024年01月19日
    浏览(86)
  • 分享400个微信小程序模板和小程序设计模板

    分享的微信小程序模板和小程序设计模板,涵盖各行各业的微信小程序功能界面设计模板,也有各种小程序开发的一些特效模板,一共400个,有需要的自取。      

    2024年02月11日
    浏览(44)
  • 讲讲微信小程序分包——本文来自AI创作助手

    微信小程序分包是为了解决小程序包体积过大而引入的一个功能。通过将小程序分为多个子包,每个子包可以独立加载和升级,从而让小程序的启动速度更快,用户体验更好。 具体实现: 在小程序根目录下创建一个名为 subpackage 的目录,用于存放子包相关的文件和页面。 在

    2024年02月09日
    浏览(46)
  • 微信小程序实现订阅消息功能

             * 源码已经上传到资源处,需要的话点击跳转下载 |  源码下载         小程序中的订阅内容在日常中大家都会使用到,一般在支付的时候,会收到支持成功的消息,里面有一些基础信息花费多少以及是使用在什么地方,订阅消息是小程序向用户发送消息的方式

    2024年02月08日
    浏览(56)
  • 微信小程序实现订阅消息推送的实现步骤

    1、准备工作   准备小程序账号、开发环境,我小程序是基于uniapp开发,后台代码基于SpringBoot开发。同时先阅读官方文档,了解小程序订阅消息和后端如何发送订阅消息等相关知识,官方文档地址如下: 《小程序订阅消息》 《发送订阅消息》 2、实现步骤 2.1、启用并配置

    2024年02月15日
    浏览(45)
  • 微信小程序实现客服消息自动回复(回复图片消息)

    前提 小程序已经开通了“云开发”功能 在微信开发者工具中打开“云开发”,点“设置”,点击“其它设置”,点击“添加消息推送”(添加消息类型为“image”和“event”两种消息推送设置),点击“确定” 目前微信小程序用户使用客服功能,必须通过固定的按钮进行触发

    2024年02月10日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包