微信公众平台开发接口-subscribe事件的处理

本文介绍微信公众平台升级后的新用户订阅事件处理方法,从旧事件Hello2BizUser的处理方式过渡到新事件subscribe的处理,并提供代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于微信公众平台升级,涉及到得接口也有所变动。最为重要的变动是:新用户订阅,将由之前推送一条“Hello2BizUser”文本,变化为推送一条“subscribe”的事件。最近碰到好几个朋友询问新用户订阅事件后代码要怎么改,现在将详细过程讲解如下:

一、Hello2BizUser旧事件的处理

在老的关注事件中,用户关注微信公众平台账号后,系统会帮用户发送一条Hello2BizUser的文本给公众账号,公众账号后台开发模式下通过判断Hello2BizUser这个词来实现发送欢迎词。

代码样例如下:

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. if ($keyword == "Hello2BizUser"){  
  2.     $contentStr = "欢迎关注白云机场交流论坛,这其实是老的欢迎词,你收不到了";  
  3.     $resultStr = $this->transmitText($object$contentStr$funcFlag);  
  4.     return $resultStr;  
  5. }  

做出基础接口上的修改,影响会是所有人。一般不会轻易做这样的改动。

为什么微信要修改这一事件了,这个方法的弊端在于,如果用户没有判断这一事件,那么就不会有欢迎词,本来这也没什么关系,不出现欢迎词也不影响什么。但很多人的程序代码里面,所有流程直接就是判断关键词。比如我们曾看到过一家医院的微信账号,用户发送挂号的号码,就显示前面有多少人排列,但后台程序没有做区分,把Hello2BizUser也当成挂号单发送过去,返回没有找到Hello2BizUser这一挂号,不知道前面有多少人,搞得用户莫名奇妙。还有就是用户如果主动发送一个Hello2BizUser过去,那么得到的也是和欢迎词一样的内容,虽然很少有用户会去发这个东西。

另一方面,将用户关注做成事件,更有利于统计功能的实现。利用这个事件,我们就更能容易的判断出关注人数和退订人数,而原来的Hello2BizUser文本推送判断是有可能不准确的,因为用户可以手工发送,形成虚假关注统计。

 

二、“subscribe”订阅事件判断

subscribe是一种新的事件,我们先需要做事件类型做判断,我们在官方样例中增加对这一事件的判断,修改如下:

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA);  
  2. $RX_TYPE = trim($postObj->MsgType);  
  3.   
  4. switch ($RX_TYPE)  
  5. {  
  6.     case "text":  
  7.         $resultStr = $this->receiveText($postObj);  
  8.         break;  
  9.     case "event":  
  10.         $resultStr = $this->receiveEvent($postObj);  
  11.         break;  
  12.     default:  
  13.         $resultStr = "unknow msg type: ".$RX_TYPE;  
  14.         break;  
  15. }  

然后在事件接收处理函数中再判断订阅事件 :

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private function receiveEvent($object)  
  2. {  
  3.     $contentStr = "";  
  4.     switch ($object->Event)  
  5.     {  
  6.         case "subscribe":  
  7.             $contentStr = "您好,欢迎关注白云机场交流论坛";  
  8.             break;  
  9.     }  
  10.     $resultStr = $this->transmitText($object$contentStr);  
  11.     return $resultStr;  
  12. }  

这样就完成了“subscribe”的订阅事件下的处理。

二、完整代码

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. define("TOKEN""weixin");  
  3. $wechatObj = new wechatCallbackapiTest();  
  4. $wechatObj->responseMsg();  
  5.   
  6. class wechatCallbackapiTest  
  7. {  
  8.     public function responseMsg()  
  9.     {  
  10.         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
  11.         if (!empty($postStr)){  
  12.             $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA);  
  13.             $RX_TYPE = trim($postObj->MsgType);  
  14.   
  15.             switch ($RX_TYPE)  
  16.             {  
  17.                 case "text":  
  18.                     $resultStr = $this->receiveText($postObj);  
  19.                     break;  
  20.                 case "event":  
  21.                     $resultStr = $this->receiveEvent($postObj);  
  22.                     break;  
  23.                 default:  
  24.                     $resultStr = "unknow msg type: ".$RX_TYPE;  
  25.                     break;  
  26.             }  
  27.             echo $resultStr;  
  28.         }else {  
  29.             echo "";  
  30.             exit;  
  31.         }  
  32.     }  
  33.   
  34.     private function receiveText($object)  
  35.     {  
  36.         $funcFlag = 0;  
  37.         $keyword = trim($object->Content);  
  38.         $resultStr = "";  
  39.         $cityArray = array();  
  40.         $contentStr = "";  
  41.         $needArray = false;  
  42.         $illegal = false;  
  43.         $saytome = false;  
  44.   
  45.         if ($keyword == "Hello2BizUser"){  
  46.             $contentStr = "欢迎关注白云机场交流论坛,这其实是老的欢迎词,你关注时收不到了";  
  47.             $resultStr = $this->transmitText($object$contentStr$funcFlag);  
  48.             return $resultStr;  
  49.         }else {  
  50.   
  51.         }  
  52.     }  
  53.   
  54.     private function receiveEvent($object)  
  55.     {  
  56.         $contentStr = "";  
  57.         switch ($object->Event)  
  58.         {  
  59.             case "subscribe":  
  60.                 $contentStr = "您好,欢迎关注白云机场交流论坛!";  
  61.                 break;  
  62.         }  
  63.         $resultStr = $this->transmitText($object$contentStr);  
  64.         return $resultStr;  
  65.     }  
  66.   
  67.     private function transmitText($object$content$flag = 0)  
  68.     {  
  69.         $textTpl = "<xml>  
  70. <ToUserName><![CDATA[%s]]></ToUserName>  
  71. <FromUserName><![CDATA[%s]]></FromUserName>  
  72. <CreateTime>%s</CreateTime>  
  73. <MsgType><![CDATA[text]]></MsgType>  
  74. <Content><![CDATA[%s]]></Content>  
  75. <FuncFlag>%d</FuncFlag>  
  76. </xml>";  
  77.         $resultStr = sprintf($textTpl$object->FromUserName, $object->ToUserName, time(), $content$flag);  
  78.         return $resultStr;  
  79.     }  
  80. }  
  81.   
  82. ?>  
### 微信小程序开发推送通知实现方法 #### 一、准备工作 为了实现在微信小程序中发送推送通知的功能,开发者需先完成一些必要的准备。这包括但不限于注册并认证微信公众平台账号以及创建相应的小程序项目[^2]。 #### 二、配置服务端环境 考虑到安全性等因素,实际的消息下发操作是由后台服务器执行而非前端直接处理。因此,在开始编写客户端逻辑之前,还需要搭建好支持HTTPS协议的服务端接口用于接收来自微信官方API返回的数据,并据此向特定用户群组广播或定向发送提醒信息[^4]。 #### 三、申请模板ID 根据业务需求选择合适的预设模版或者自定义创建新的消息样式(注意:每种类型的模板都有固定的参数格式),之后通过调用微信开放平台上提供的`wx.requestSubscribeMessage()` API来请求用户的订阅授权;只有当获得许可后才能继续后续流程[^1]。 ```javascript // 请求订阅权限示例代码 const res = await wx.requestSubscribeMessage({ tmplIds: ['your_template_id'], }); if (res.errMsg === 'requestSubscribeMessage:ok') { console.log('用户同意接收'); } else { console.error('用户拒绝接收'); } ``` #### 四、触发条件设定 确定何时何地应该触发展示给定的通知内容至关重要。通常情况下会结合具体应用场景设置相应的事件监听器,比如订单状态更新、活动倒计时结束等时刻点作为触发源[^3]。 #### 五、构建数据包体 一旦满足上述前提,则可按照所选模板的要求组装JSON结构化的负载对象,其中至少要包含收件方OpenID、页面路径以及其他可能涉及的文字描述等内容字段。 ```json { "touser": "OPENID", "template_id": "TEMPLATE_ID", "page": "/pages/index/index?query=1", "data": { "first": { "value":"您好,您有一条新消息" }, ... } } ``` #### 六、发起HTTP POST请求 最后一步就是利用诸如Node.js这样的运行时环境中封装好的http模块或者其他第三方库(如axios)构造POST请求并将精心准备过的payload传递至https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=TOKEN地址处等待响应结果确认是否成功投递目标设备上显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值