企业php回调模式,回调配置
中老年营养奶粉[TOC]
1. 什么时候需要回调服务
在集成企业与内部系统时,我们往往需要搭建⼀个回调服务。回调服务,可以实现:
⾃定义丰富的服务⾏为。⽐如,⽤户向应⽤发消息时,识别消息关键词,回复不同的消息内容;⽤户点击应⽤菜单时,转化为指令,执⾏⾃动化任务。
可以及时获取到状态变化。⽐如,通讯录发⽣变化时,不需要定时去拉取通讯录对⽐,⽽是实时地获取到变化的通讯录结点,进⾏同步。
2. 回调服务需要哪些配置
配置回调服务,需要有三个配置项,分别是:URL, Token, EncodingAESKey。
⾸先,URL为回调服务地址,由开发者搭建(需要满⾜接⼝要求,参考第3部分说明),⽤于接收通知消息或者事件。
其次,Token⽤于计算签名,由英⽂或数字组成且长度不超过32位的⾃定义字符串。开发者提供的URL是公开可访问的,这就意味着拿到这个URL,就可以往该链接推送消息。那么URL服务需要解决两个问题:
如何分辨出是否为企业来源
如何分辨出推送消息的内容是否被篡改
通过数字签名就可以解决上述的问题。具体为:约定Token作为密钥,仅开发者和企业知道,在传输中不可见,⽤于参与签名计算。企业在推送消息时,将消息内容与Token计算出签名。开发者接收到推送消息时,也按相同算法计算出签名。如果为同⼀签名,则可信任来源为企业,并且内容是完整的。
如果⾮企业来源,由于攻击者没有正确的Token,⽆法算出正确的签名;
如果消息内容被篡改,由于开发者会将接收的消息内容与Token重算⼀次签名,该值与参数的签名不⼀致,则会拒绝该请求。
最后,EncodingAESKey⽤于消息内容加密,由英⽂或数字组成且长度为43位的⾃定义字符串。由于消息是在公开的因特⽹上传输,消息内容是可被截获的,如果内容未加密,则截获者可以直接阅读消息内容。若消息内容包含⼀些敏感信息,就⾮常危险了。EncodingAESKey就是在这个背景基础上提出,将发送的内容进⾏加密,并组装成⼀定格式后再发送。
3. 回调服务需要实现哪些功能
配置回调服务时,需要能同时⽀持HttpGet以及HttpPost两种能⼒,
企业会先判断URL服务是否具备解析企业推送消息的能⼒。
具体⽅式是,企业往URL服务上发⼀条Get请求带签名及密⽂参数到URL服务上,如果URL服务
检查签名通过,并能正确返回密⽂参数对应的明⽂字符串,则验证通过。此时在企业的配置就开始⽣效。
后续的业务请求(⽐如应⽤菜单的点击事件,⽤户消息等),都会类似的⽅式(签名+密⽂)向服务URL推送消息。URL服务验证签名通过后,
需要将POST数据解密,就可以得到对应的业务消息明⽂。
3.1 ⽀持Http Get请求验证URL有效性
企业管理员在保存回调配置信息时,企业会发送⼀条验证消息到填写的URL,请求内容如下:
请求⽅式:GET
参数说明:
参数
类型
说明
msg_signature
企业加密签名,msg_signature计算结合了企业填写的token、请求中的timestamp、nonce、加密的消息体。签名计算⽅法参考 消息体签名检验
timestamp
Integer
时间戳。与nonce结合使⽤,⽤于防⽌请求重放攻击。
nonce
String
随机数。与timestamp结合使⽤,⽤于防⽌请求重放攻击。
echostr
String
加密的字符串。需要解密得到消息内容明⽂,解密后有random、msg_len、msg、receiveid四个字段,其中msg即为消息内容明⽂
回调服务需要作出正确的响应才能通过URL验证,具体操作如下:
对收到的请求,解析上述的各个参数值(参数值需要做Urldecode处理)
根据已有的token,结合第1步获取的参数timestamp, nonce, echostr重新计算签名,然后与参数msg_signature检查是否⼀致,确认调⽤者的合法性。计算⽅法参考:消息体签名检验
解密echostr参数得到消息内容(即msg字段)
在1秒内响应GET请求,响应内容为上⼀步得到的明⽂消息内容(不能加引号,不能带bom头,不能带换⾏符)
步骤2~3可以直接使⽤验证URL函数⼀步到位。
你可以访问 接⼝调试⼯具 (接⼝类型:建⽴连接,接⼝列表:测试回调模式)进⾏调试
3.2 ⽀持Http Post请求接收业务数据
当⽤户触发回调⾏为时,企业会发送回调消息到填写的URL,请求内容如下:
请求⽅式:POST
接收数据格式 :上海苏泊尔维修点
参数说明:
参数
类型
说明
msg_signature
String
企业加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体
timestamp
Integer
时间戳。与nonce结合使⽤,⽤于防⽌请求重放攻击。
nonce
随机数。与timestamp结合使⽤,⽤于防⽌请求重放攻击。
ToUserName
String
新年见闻作文企业的CorpID,当为第三⽅应⽤回调事件时,CorpID的内容为suiteid
AgentID
String
接收的应⽤id,可在应⽤的设置页⾯获取。仅应⽤相关的回调会带该字段。
Encrypt
String
消息结构体加密后的字符串
企业收到消息后,需要作如下处理:
对msg_signature进⾏校验
如何取消黄钻解密Encrypt,得到明⽂的消息结构体(消息结构体后⾯章节会详说)
寻梦追忆如果需要被动回复消息,构造被动响应包
正确响应本次请求
· 企业服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次
· 当接收成功后,http头部返回200表⽰接收ok,其他错误码企业后台会⼀律当做失败并发起重试
步骤1~2可以直接使⽤解密函数⼀步到位。
步骤3其实包含加密被动回复消息、⽣成新签名、构造被动响应包三个步骤,可以直接使⽤加密函数⼀步到位。
步骤4中,不同的业务回调要求返回不同内容。⽐如回复空串,或者特定字符串(如success),以及上⼀步构造的加密被动回复消息。具体要求在各个回调业务⽂档会有说明。
被动响应包的数据格式:
timestamp
参数说明
参数
是否必须
说明
Encrypt
是
经过加密的消息结构体
MsgSignature
是
消息签名
TimeStamp
是
时间戳国产眼霜排行榜
Nonce
是
随机数,由企业⾃⾏⽣成
3.3 获取企业服务器的ip段
企业在回调企业指定的URL时,是通过特定的IP发送出去的。如果企业需要做防⽕墙配置,那么可以通过这个接⼝获取到所有相关的IP 段。IP段有变更可能,当IP段变更时,新旧IP段会同时保留⼀段时间。建议企业每天定时拉取IP段,更新防⽕墙设置,避免因IP段变更导致⽹络不通。
请求⽅式:GET(HTTPS)
参数说明:
参数
必须
说明
access_token
是
调⽤接⼝凭证
权限说明:
⽆限定。
返回结果:
{
"ip_list": ["101.226.103.*", "101.226.62.*"]
}
参数说明:
参数
类型
说明
ip_list
StringArray
企业回调的IP段
若调⽤失败,会返回errcode及errmsg(判断是否调⽤失败,根据errcode存在并且值⾮0)
4. 回调服务demo
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论