美洽 SDK 3.0 推送的数据结构签名算法,多语言示例。
该项目是 美洽 SDK 3.0
推送的数据结构签名的算法,具体推送的数据结构请移步 美洽 SDK 推送说明。
开发者收到美洽的推送数据后,开发者可以选择进行 签名验证
。
我们使用的签名算法是 HMAC-SHA1,key 使用的是美洽 App 的 Secret-Key
,请到工作台获取你的 Secret-Key
。Warning,请不要将 Secret-Key
暴露给任何人。
下图是获取 Secret-Key
截图:
开发者收到美洽的推送数据请求后,请获取头信息的 Authorization
,其中是美洽推送数据的签名。
我们提供 Java、Python、Ruby、JavaScript、PHP、Golang
五种语言的计算签名的代码,计算签名后,请和头信息的美洽数据签名进行比对,如果比对失败,则说明推送数据被修改过。
假如你填写的 URL 是 http://your.push.com/meiqia, 那么当有推送消息需要发送到你的服务器时,会有如下网络请求
POST /meiqia HTTP/1.1
Host: your.push.com
Authorization: meiqia_sign:YTgyMmFkMDY5OWJjYzI1ODRkNjBhNzAyMTdlY2M4YjU2NDNiYjhkZA==
Content-Type: application/json
{"clientId":"12vc86d41d1611e69e6f029346effd31","content":"test","contentType":"text","customizedData":{"name":"#4","avatar":"https://app.meiqia.com/api/static/client-avatar/11-01.png"},"deviceOS":"Android","deviceToken":"d2433d6ad2861515e24316ddcbdg05eea23d","fromName":"美洽","messageId":"111","messageTime":"2016-01-01T00:00:00.622580"}
{"clientId":"12vc86d41d1611e69e6f029346effd31","content":"test","contentType":"text","customizedData":{"name":"#4","avatar":"https://app.meiqia.com/api/static/client-avatar/11-01.png"},"deviceOS":"Android","deviceToken":"d2433d6ad2861515e24316ddcbdg05eea23d","fromName":"美洽","messageId":"111","messageTime":"2016-01-01T00:00:00.622580"}
如上数据,我们称之为 http-body。
sign 在网络请求的头部中的 Authorization
meiqia_sign:YTgyMmFkMDY5OWJjYzI1ODRkNjBhNzAyMTdlY2M4YjU2NDNiYjhkZA==
用 Secret-Key
对 http-body 进行 HMAC-SHA1 操作,然后就会得到 sign。
将两个 sign 进行比对,如果一样,就说明该请求合法,可以进行其他操作,如果不对,就舍弃。
开发者的回调接口开发完成后,请先自己发送一条消息,测试一下回调接口是否能正确接收数据,如发送:
curl -X POST -H "Accept: Application/json" -H "Content-Type: application/json" '你的回调 api 的地址' -d '{"content": "Hi, stranger!"}'
或发送 mock-message:
curl -X POST -H "Accept: Application/json" -H "Content-Type: application/json" '你的回调 api 的地址' -d '{"clientId":"1jk23u3i434jkdjkf","content":"test","contentType":"text","customizedData":{"name":"#4","avatar":"https://app.meiqia.com/api/static/client-avatar/11-01.png"},"deviceOS":"Android","deviceToken":"d2433d6ad2861515e24316ddcbdg05eea23d","fromName":"美洽","messageId":"111","messageTime":"2016-01-01T00:00:00.622580"}'
若开发者的回调接口能收到测试消息,但仍收不到美洽的离线推送消息,请到 app.meiqia.com 工作台找到要推送的那条对话,查看该顾客是否「已离线」,只有顾客「已离线」,美洽的服务端才会推送离线消息给开发者的回调接口。
.
├── Golang Golang 的 sign 代码及测试
├── Java Java 的 sign 代码及测试
├── LICENSE 许可证
├── Node.js Node.js 的 sign 代码及测试
├── PHP PHP 的 sign 代码及测试
├── Python Python 的 sign 代码及测试
├── README.md
├── Ruby Ruby 的 sign 代码及测试
└── sample.txt 确保 sign 正确的一些测试样例,与推送数据格式无关
感谢 @yangwenmai 提供了 go 语言版的代码样例。