关于微信第三方平台开发几个事件推送的解读

更新时间:2019-09-18 12:10:02 浏览次数:1587

温馨提示:当前尚未登录,请先登录后才能下载,评论,收藏和分享

  • 收藏
  • 评论
  • 分享

首先看官方描述

关于第一句话 解读,这里有提到三个事件:进行授权、取消授权、更新授权后。

其实是四个事件:因为进行授权中,包含每隔 10分钟的component_verify_ticket的推送事件,然后是用户扫码后成功授权成功事件。

用户可以取消授权(在公众号平台--授权管理中操作)触发取消授权事件。

用户可以更新授权会触发一个事件,怎么触发呢?

重新扫授权二维码后 会提示你已经授权,是否继续授权,左下角有一个选项,更改权限集。就是这里,更新权限集后 就会触发。

以上是四个事件的场景说明。    接下来说接收方式。

注意官方描述:微信服务器会向第三方平台方的授权事件接收 URL(创建时由第三方平台时填写)以 POST 的方式推送相关通知。

好的,先确定我们的URL,在哪呢?看图!!!


就是这个,以上四个事件只会访问这个url ,其他的url 你暂时不用管。

好的,接下来 说说怎么接收!

我的url 会请求到这个index 方法中。这个方法里同时处理了四个事件,谁来就处理谁!并做了统一回复。

这里说明一下我的框架,这里采用Easywechat 微信框架去处理这些事件,挺好用的。

安装和使用可以参考我的另外两篇文章:

安装easywechat 遇到的坑:https://blog.qian-hong.com/detail-5-25-253.html

如何使用微信开放平台进行开发:https://blog.qian-hong.com/detail-5-7-252.html


继续说明:如果你愿意使用 Easywechat 框架 的话 可以完全参照我的写法。各个事件里push z中的匿名函数里 可以继续你的业务逻辑。

------------------------------------------------------------------------------分------割---------线-----------------------------------------------------------------------

如果你不用这个框架,我简单说一下,对于第一次尝试微信开发来说,挺懵的,不知道微信推过来的东西是什么。

开发期间如果不明确参数和返回值,强烈建议采用写文件的形式,去记录过程方便排错。

同时你 可以利用官方提供的参数,用postman 等工具去模拟微信服务器,这样你可以随时发送消息给你的服务端,排除 各类错误。

这个时候你需要第一行的代码:

你先使用file_get_contents('php://input') 去接收微信推过来的xml (微信一般都是推送xml 流参数,只能用php://input 接收,$_post $_REQUEST 都收不到)。

<xml><AppId><![CDATA[wxxxxxxxxxxxd]]></AppId><Encrypt><![CDATA[/GXQ0fqRF6Nrthr5th416r58cs3vJU

CXTpVhMGO4uZucvme28LEb66bJ16gH8dHs5Sc8dB/orGvDTkxtntnSSeZcOBCLL0jXW7rNU405AoJg1a+zH

k6APkAvrththr55441655CQYqBPiveh1LIZl7U9WrtR3+8kCptEw1Gzm000IfVgnc92vGvsc7Smol3sbIs9ozDCG

OokpdSJWSWUBukAZDdndndyjer6wa54s54trtKYeG/y1ARUGtjtbLA4QBOvnOaSt5Qmf7ADx04Tmfcjo45mB

8Ew8r82BvOT4iLCBN4JUHPFAktr1eEwAUJw0S9aMoWxgHrnJxpYThKwGzUthriJSPkEQ==]]></Encrypt>

</xml>

这是接收到的xml结果,这个时候你只能看出appid 其他参数你不知道是什么,你还需要去解密。

消息体验证和解密

开发者先验证消息体签名的正确性,验证通过后,再对消息体进行解密。

验证方式:微信对服务端推送时,我们可以从它的url 上获取msg_signature参数的值

token是你开发平台填写的校验token

msg_encrypt是收到的xml里面的<Encrypt>内容</Encrypt>

timestamp和nonce自己在计算过程生成就可以

1. 开发者计算签名,dev_msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))

2. 比较dev_msg_signature和URL上带的msg_signature是否相等,相等则表示验证通过。


解密方式如下:上面验证通过后开始解密,解密流程如下。

1. aes_msg=Base64_Decode(msg_encrypt)
2. rand_msg=AES_Decrypt(aes_msg)
3. 验证尾部
4. 去掉rand_msg头部的16个随机字节,4个字节的msg_len,和尾部的

四、例子:服务方代替授权方向用户回复消息

最后你需要对微信就行回复,告诉微信我收到了推送。

现有消息格式:

<xml>
  <ToUserName></ToUserName>
  <FromUserName></FromUserName>
  <CreateTime>12345678</CreateTime>
  <MsgType></MsgType>
  <Content></Content>
</xml>

加密后消息格式:

<xml>
  <Encrypt></Encrypt>
  <MsgSignature></MsgSignature>
  <TimeStamp></TimeStamp>
  <Nonce></Nonce>
</xml>

其中,msg_encrypt=Base64_Encode(AES_Encrypt [random(16B)+ msg_len(4B) + msg + ])

random(16B)为 16 字节的随机字符串;msg_len 为 msg 长度,占 4 个字节(网络字节序);

AESKey =Base64_Decode(EncodingAESKey + “=”),32 个字节 msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))timestamp、nonce 回填请求中的值即可

以上解密过程可以使用微信第三方提供的SDK:   https://wximg.gtimg.com/shake_tv/mpwiki/cryptoDemo.zip

具体代码实践要以后补充了。暂时说到这些。

发布评论:

提 交