微信消息推送

微信消息推送

注意:

1.公众号(目前只考察了服务号)推送需要用户关注公众号,推送时要知道用户的openId;

  次数限制:一个公众号默认每天可发10万次,如果粉丝量超过10w,限制会提升,发送消息不违规就行;

  对时间要求比较严格的同学注意,发消息需要申请消息模板需要审核数日;

2.小程序允许发订阅消息,原来的“模板消息”在今年1月10号停止申请,订阅消息,可以实现大量信息发送;

  次数限制:开通支付能力3kw/日,没开通1kw/日

  对时间要求比较严格的同学注意,订阅消息需要申请模板需要审核3~7日,小程序上线也需要审核数日。

3.通知消息位置

  小程序的通知是在服务窗口,公众号如果是服务号就在好友列表,订阅号则在订阅号里;

 

微信消息推送

微信公众平台和小程序虽然都是腾讯开发,但是其是俩个独立的平台,包括账号也是独立存在,所以小程序和公众平台不可以使用同一个账号注册使用。

因是俩个平台,所以微信公众平台的用户openId和小程序用户openId不同,当然消息推送实现方式也不同

如果本地测试接口,需要在公众平台后台配置ip白名单,否则请求不成功

公众号消息推送

  • 模版消息通知位置:公众号详情聊天页面

  • 推送前提:模版id、参数、接收人openId、接收人必须关注公众号。

  • 模板跳转能力:点击查看详情可以跳转到指定的任意http链接

  • 1.小程序后台配置模版消息

    • 进入模版页面,点击右上角”从模版库添加“,搜索符合需求的模版消息并且配置勾选需要的参数

       

      ADEFB6A4-2897-4B05-9FB9-7BA5D395535F.png

    • 添加成功之后,模版列表页面复制该模版id,为后续接口调用模版消息使用
  • 2.请求接口

    请注意,URL置空,则在发送后,点击模版消息会进入一个空白页面(ios),或无法点击(android)。

    POST请求

    https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
    请求包为一个json:

     {
         "touser":"OPENID",
         "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
         "url":"http://weixin.qq.com/download",
         "topcolor":"#FF0000",
         "data":{
             "User": {
                 "value":"黄先生",
                 "color":"#173177"
              },
             "Date":{
                 "value":"06月07日 19时24分",
                 "color":"#173177"
             },
             "CardNumber":{
                 "value":"0426",
                 "color":"#173177"
             },
             "Type":{
                 "value":"消费",
                 "color":"#173177"
             },
             "Money":{
                 "value":"人民币260.00元",
                 "color":"#173177"
             },
             "DeadTime":{
                 "value":"06月07日19时24分",
                 "color":"#173177"
             },
             "Left":{
                 "value":"6504.09",
                 "color":"#173177"
             }
         }
     }
    

    发送效果图:

    image

    返回码说明

    在调用模版消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

      {
          "errcode":0,
          "errmsg":"ok",
          "msgid":200228332
      }
    

    错误时的返回JSON数据,形式类似,错误返回码说明:

返回码说明
-1系统繁忙
0请求成功
40001验证失败
40002不合法的凭证类型
40003不合法的OpenID
40004不合法的媒体文件类型
40005不合法的文件类型
40006不合法的文件大小
40007不合法的媒体文件id
40008不合法的消息类型
40009不合法的图片文件大小
40010不合法的语音文件大小
40011不合法的视频文件大小
40012不合法的缩略图文件大小
40013不合法的APPID
41001缺少access_token参数
41002缺少appid参数
41003缺少refresh_token参数
41004缺少secret参数
41005缺少多媒体文件数据
41006access_token超时
42001需要GET请求
43002需要POST请求
43003需要HTTPS请求
44001多媒体文件为空
44002POST的数据包为空
44003图文消息内容为空
45001多媒体文件大小超过限制
45002消息内容超过限制
45003标题字段超过限制
45004描述字段超过限制
45005链接字段超过限制
45006图片链接字段超过限制
45007语音播放时间超过限制
45008图文消息超过限制
45009接口调用超过限制
46001不存在媒体数据
47001解析JSON/XML内容错误

小程序消息推送

  • 模版消息通知位置:服务通知
  • 推送前提:用户有过支付行为或者提交表单操作,会生成对应的form_id,一次生成一个form_id,每次都不一样,一个form_id只可以用一次。
    (1次提交表单可下发1条,多次提交下发条数独立,相互不影响)
  • 模板跳转能力:点击查看详情仅能跳转下发模板的该帐号的小程序各个页面

     

    4250933-76d4c5ed3f994df3.png

     

    1.小程序后台配置模版消息

    • 进入模版页面,点击右上角添加按钮,搜索符合需求的模版消息并且配置勾选需要的参数

    • 添加成功之后,模版列表页面复制该模版id,为后续接口调用模版消息使用
      2.获取access_token

    • access_token 的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效。

    • 接口地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

    • HTTP请求方式:GET

    • 请求参数说明

参数必填说明
grant_type获取 access_token 填写 client_credential
appid第三方用户唯一凭证
secret第三方用户唯一凭证密钥,即appsecret

返回参数说明

正常情况下,微信会返回下述 JSON 数据包给开发者:

        {"access_token": "ACCESS_TOKEN", "expires_in": 7200}

access_token:获取到的凭证

expires_in:凭证有效时间,单位:秒

错误时微信会返回错误码等信息,JSON 数据包示例如下(该示例为 AppID 无效错误):

        {"errcode": 40013, "errmsg": "invalid appid"}

3.消息推送

  • 这里需要获取到接收人的openId

  • form_id生成方式

    • 页面的 form 组件,属性report-submit为true时,可以声明为需发模板消息,此时点击按钮提交表单可以获取formId,用于发送模板消息。或者当用户完成支付行为,可以获取prepay_id用于发送模板消息。

      • form例子

          <form bindsubmit="formSubmit" report-submit="true">
              <input name="input" class="input" placeholder="please input here" />
               <button formType="submit">Submit</button> <button formType="reset">Reset</button> 
          </form>
        
      • js获取form_id

      formSubmit: function (e) {
           var form_id = e.detail.formId;
      }
      
    • 开始推送

参数必填说明
touser接收者(用户)的 openid
template_id所需下发的模板消息的id
page点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
form_id表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
data模板内容,不填则下发空模板
color模板内容字体的颜色,不填默认黑色
emphasis_keyword模板需要放大的关键词,不填则默认无放大

示例:

        {
          "touser": "OPENID",  
          "template_id": "TEMPLATE_ID", 
          "page": "index",          
          "form_id": "FORMID",         
          "data": {
              "keyword1": {
                  "value": "339208499", 
                  "color": "#173177"
              }, 
              "keyword2": {
                  "value": "2015年01月05日 12:30", 
                  "color": "#173177"
              }, 
              "keyword3": {
                  "value": "粤海喜来登酒店", 
                  "color": "#173177"
              } , 
              "keyword4": {
                  "value": "广州市天河区天河路208号", 
                  "color": "#173177"
              } 
          },
          "emphasis_keyword": "keyword1.DATA" 
        }

返回码说明:
在调用模板消息接口后,会返回JSON数据包。
正常时的返回JSON数据包示例:

    ```
    {
      "errcode": 0,
      "errmsg": "ok"
    }
    ```

错误时会返回错误码信息,说明如下:

返回码说明
40037template_id不正确
41028form_id不正确,或者过期
41029form_id已被使用
41030page不正确
45009接口调用超过限额(目前默认每个帐号日调用限额为100万)

效果图如下:

CE6E7116C5C453F28FBFDC9F11412B7D.png

事件队列发送消息

针对消息推送,当一条消息需要给很多人推送时或者同时给很多人推送消息时,为了保证服务器不会奔溃和用户请求等待时间,需要使用异步队列来推送消息,目前只有微信公众号这边的消息推送做了异步事件消息队列。

具体实现原理参照:Laravel 队列laravel 事件监听

  • 队列配置

    1. 配置

      将.env队列驱动配置为利用数据库的异步处理

       QUEUE_DRIVER=database
      
    2. 生成队列数据库表与失败队列数据库表

        php artisan queue:table
        
        php artisan queue:failed-table
        
        php artisan migrate   
    
    1. 开启队列监听进程

       php artisan queue:listen  
      

      或者 开启后台监听(不影响自己输入其他命令)

       php artisan queue:listen &  
      

      也能用work 后面参数是休息时间和尝试次数

       php artisan queue:work connection --daemon --sleep=3 --tries=3  
      
  • 创建事件监听

    1. 手动注册监听事件

      在文件“/Users/guoqing/work/LouWang/app/Providers/EventServiceProvider.php”的“$listen”数组中添加监听事件路径

      eg:

      protected $listen = [
          'App\Events\MessageRemind' => [// 事件
              'App\Listeners\SendSmsWeChatRemind',// 监听器
          ],
      ];
      

      当然这个时候这个事件监听类还没创建,执行如下命令生成事件和监听器

       php artisan event:generate
      

      这个时候“/app/Events/”目录下生成了MessageRemind.php事件类,"/app/Listeners/“下生成了SendSmsWeChatRemind.php监听类

    2. 定义事件

      在事件触发的时候,首先进入事件类,事件类接收到传来的参数,监听器再根据传来的参数做相应的处理操作,所以事件这边基本就是参数的定义和接收传递分发功能。

      我们使用构造器接收必要的参数,并将其设置为当前事件属性。

    3. 定义监听器

      监听器handle方法注入事件
      eg:

       public function handle(MessageRemind $event)// 注入事件
       {
            // 获取传来的参数
           $remindUsers = $event->remindUsers;
           $rel_guid = $event->rel_guid;
           $type = $event->type;
           $weChatTemplate = $event->weChatTemplate;
           $smsContent = $event->smsContent;
           $weChatData = $event->weChatData;
          
           // 根据参数相应处理,这里做开始发送消息
      }
      

      这里有一点注意,我们怎么将处理事件操作加入到队列中异步操作呢

      在开始使用监听器队列之前,请确保在你的服务器或本地开发环境中能够配置并启动 队列 监听器。

      要指定监听器启动队列,只需将 ShouldQueue 接口添加到监听器类。由 Artisan 命令 event:generate 生成的监听器已经将此接口导入到当前命名空间中,因此你可以直接使用它:

      <?php
      namespace App\Listeners;
      
      use App\Events\MessageRemind;
      use Illuminate\Queue\InteractsWithQueue;
      use Illuminate\Contracts\Queue\ShouldQueue;
      
      class SendSmsWeChatRemind implements ShouldQueue
      {
      }
      
    当这个监听器被事件调用时,事件调度器会自动使用 Laravel 的 队列系统。如果在队列中执行监听器时没有抛出异常,任务会在执行完成后自动从队列中删除。
    
  • 手动触发监听

    调用事件的时候就简单了,只需new event 传入必须的参数即可,而且不会影响后续程序的进行

    eg:

    event(new MessageRemind($managers, config('status.remind_log_type_find_house_help'), null, $smsContent, $weChatData, 'findHouseHelp'));
    

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值