微信消息推送

微信消息推送

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

因是俩个平台,所以微信公众平台的用户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 缺少多媒体文件数据
41006 access_token超时
42001 需要GET请求
43002 需要POST请求
43003 需要HTTPS请求
44001 多媒体文件为空
44002 POST的数据包为空
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"
    }
    ```

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

返回码 说明
40037 template_id不正确
41028 form_id不正确,或者过期
41029 form_id已被使用
41030 page不正确
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'));
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 水与一座城市甚至整个国家的关系都极为密切,文明大多始于水源处,人们在岸边取水、捕鱼、洗衣、盥洗,久了就成一个聚落。...
    季子弘阅读 309评论 0 1
  • 桃花五瓣瓣瓣香,春风点蕊蕊蕊黄。 十六嘌呤儿女江,不怪杨过误郭襄。
    良柳如烟阅读 345评论 0 3
  • 【伞】 小花最喜欢雨天,因为她有一把不寻常的伞。 伞面绘着一圈海草,腰肢细软,交缠蜿蜒。水蓝的底色柔和清凉,仿佛散...
    夏半阅读 1,847评论 0 2
  • 走在大街上,看到儿时的小人书,吃过的小零食,玩过的小玩具。你一定会停住脚步,多看两眼,再加上销售人员的几句煽情的话...
    Miss墨菲阅读 1,153评论 1 9