微信小程序发送一次性订阅消息
作者:admin 来源: 2023/2/2 14:43:28

    本文记录用户在微信小程序中主动订阅一次性消息,服务器接收订阅请求,定时通过发送订阅消息,最终在微信“服务通知”中显示。

    

    一次性订阅消息用于解决用户使用小程序后,后续服务环节的通知问题。用户自主订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。

    一、在微信小程序后台启用并配置消息推送

    登录微信小程序后台,在开发->开发管理->开发设置,下拉到消息推送面板,填写自己的服务器推送地址。

    

    Token(令牌)和EncodingAESKey(消息加密密钥)随意,设置后最好不要再改变也不要泄露。

    二、搭建服务器推送接口服务

    步骤一中提到的服务器推送地址,需要自己编写代码搭建一个web api服务。

    此接口服务要求,包括2个同名的接口,一个支持http get ,另外一个是http post。

    在步骤一中设置推送地址时,腾讯服务器将请求http get的接口以进行权限归属认证,只调用一次。

    当用户在微信小程序中主动订阅一次性消息时,腾讯服务器将请求http post的接口,发送用户的相关行为事件结果到开发者服务器。

    http get接口示例:

        [HttpGet]
        public string Get(string signature, string timestamp, string nonce, string echostr)
        {
            return echostr;
        }
    http post接口示例:


        [HttpPost]
        public string Get()
        {
            try
            {
                StreamReader stream = new StreamReader(Request.Body);
                string requestContent = stream.ReadToEndAsync().GetAwaiter().GetResult();
                stream.Close();
                //Tools.Log.WriteLog($"接收:{requestContent}");
            return string.Empty;
        }
    请注意到这两个接口名称都是Get,其中http post接口中的参数requestContent就是当用户触发订阅消息弹框后,用户的相关行为事件结果。开发者须保存并解析这些数据,后续发送订阅消息时将会用到。


    requestContent数据示例:

{
  "ToUserName": "gh_123456789abc",
  "FromUserName": "o7esq5OI1Uej6Xixw1lA2H7XDVbc",
  "CreateTime": "1620973045",
  "MsgType": "event",
  "Event": "subscribe_msg_popup_event",
  "List": [   {
        "TemplateId": "hD-ixGOhYmUfjOnI8MCzQMPshzGVeux_2vzyvQu7O68",
        "SubscribeStatusString": "accept",
        "PopupScene": "0"
    }],
 }
     三、获取模板 ID


    登录微信小程序后台,打开功能->订阅消息,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。

    

    四、在微信小程序获取下发权限

    在微信小程序中引导用户订阅消息,调用wx.requestSubscribeMessage(Object object)获取权限。

    参考文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html

    注意,wx.requestSubscribeMessage函数不能在回调函数中触发,可以在bindtap事件中绑定。

wx.requestSubscribeMessage({
  tmplIds: [''],
  success (res) { }
})
     其中tmplIds填写的是步骤三中的模板ID


    如图在微信小程序“密码盾”中的“习惯打卡”功能模块。

    

    点击消息提醒按钮,选择提醒时间

    

    确定后,提醒次数加1

    

    五、服务器接收处理用户的相关行为事件结果

    用户订阅消息后,腾讯将调用步骤二中的http post接口,并发送用户订阅的相关行为事件结果。最好在服务器后台保存这些事件结果,包括模板ID,发送者,订阅次数、发送时间等信息。

    六、服务器按时发送订阅消息

    参考文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/sendMessage.html

    新建一个服务程序,定时查询用户的订阅消息列表,符合条件的组装数据下发订阅消息。

POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN

     获取ACCESS_TOKEN,参考文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html

    每小时定时发送代码参考:

            Thread t3 = new Thread(new ThreadStart(delegate ()
            {
                Tools.Log.WriteLog("定时发送订阅消息");
                while (action)
                {
                    try
                    {
                        DateTime now = DateTime.Now;
                        int nextMin = 60 - now.Minute;
                        Thread.Sleep(1000 * 60 * nextMin + 2000);
                        //调用发送订阅消息函数...
                        Thread.Sleep(1000 * 60 * 1);
                    }
                    catch (Exception ex)
                    {
                        Thread.Sleep(1000 * 60 * 1);
                    }
                }
            }));
            t3.IsBackground = true;
            t3.Start();

    七、问题记录

    1、一次性订阅必须是用户自主订阅后,开发者方可以不限时间地下发一条对应的服务消息。且订阅1次发送一次。

    2、目前发现发送的数据中包含“优惠券”等字眼,发送失败。

    3、当用户自主订阅时选择拒绝,则该模板的订阅次数将清0。如已经订阅了100次,一朝拒绝,次数清0。

    4、wx.requestSubscribeMessage不能传递业务参数,可以在订阅成功后再次调用自定义的接口,进而完善业务流程。

称      呼:
联系方式:
您的评论:
技术支持:l.w.dong@qq.com www.luweidong.cn
广州市   wx:lwdred
Copyright © 2014 三味书屋 All Rights Reserved
技术支持:l.w.dong@qq.com  sitemap xml  sitemap html

粤公网安备44010602011869号

粤ICP备13031080号-1