消息同步示例
1. 微信侧生成意图数据
以股票查询服务为例,其数据格式定义为:
key | 类型 | 示例 |
---|---|---|
stock_code | string | 00700 |
stock_market | string | hk |
假设用户搜索“腾讯股价”,微信在收到用户的query并进行意图识别之后会产生以下的数据包,其中Query为json_encode
之后的字符串
注:对于依赖地理位置的服务,用户在小程序内进行过地理位置授权后,意图数据会带上经纬度信息longitude和latitude。
json格式
{ "ToUserName":"gh_6ad1513a84d8", "FromUserName":"oHiD1v9MzTFE4f2lLasf123E1QJ0", "CreateTime":1499048811, "MsgType":"event", "Event":"wxa_widget_data", "Query":"{\"type\":10000,\"slot_list\":[{\"key\":\"stock_code\",\"value\":\"00700\"},{\"key\":\"stock_market\",\"value\":\"hk\"}],\"longitude\":113.319694519,\"latitude\":23.102640152}", "Scene":1 }
xml格式
<xml> <ToUserName>gh_6ad1513a84d8</ToUserName> <FromUserName>oHiD1v9MzTFE4f2lLasf123E1QJ0</FromUserName> <CreateTime>1499048811</CreateTime> <MsgType>event</MsgType> <Event>wxa_widget_data</Event> <Query><![CDATA[ {\"type\":10000, \"slot_list\":[{\"key\":\"stock_code\",\"value\":\"00700\"}, {\"key\":\"stock_market\",\"value\":\"hk\"}], \"longitude\":113.319694519,\"latitude\":23.102640152}]]></Query> <Scene>1</Scene> </xml>
2. 微信将上述请求包进行加密之后变成下面数据包
其中Encrypt就是对上述请求包进行加密和格式化之后的结果
json格式
{ "ToUserName":"gh_6ad1513a84d8", "Encrypt":"vys1ev/gqMW8ykkgBwe9K5He4S8YxyT3ZUssaknxvnqv+LQCENfMXvhKrG3CLn0QcOWqNugfQYp/+jZ3vk/EQ3k700gPuIcf0kouwPiGijThCT70aXUQHy72TiuSo/+j4ooC6AKNJw0kLe4E1qGBJfaAJeplzEz2AefpU6d2ed0sZHZSOETFUMDfYiAm32ZW5XfydSRvlMQF9mOIGvhtW9il3Te1uxEKndWOJ+PMLftLQGtqguxkqmsaelrmG0dLk5lJDUvjVXRRksX8vnBE/YWOSSepCSvUre1Yrz+rkAGZ1uIlLluJAT93ugKwNGuG7SfeLn67A3A/6QcH8R8hSOQmQPzTi1dEoZcX/BJddh9cU49yXJwXAVDzz5p/mYb6pd+LG9MMD09obUVkIdq+1YsWW7aIyrtLYO3TKIBhhPj1klonEQOPlyOizyIlgVBkFIv/erMobiA6uMraGz/8og==" }
xml格式
<xml> <ToUserName>gh_6ad1513a84d8</ToUserName> <Encrypt><![CDATA[vys1ev/gqMW8ykkgBwe9K5He4S8YxyT3ZUssaknxvnqv+LQCENfMXvhKrG3CLn0QcOWqNugfQYp/+jZ3vk/EQ3k700gPuIcf0kouwPiGijThCT70aXUQHy72TiuSo/+j4ooC6AKNJw0kLe4E1qGBJfaAJeplzEz2AefpU6d2ed0sZHZSOETFUMDfYiAm32ZW5XfydSRvlMQF9mOIGvhtW9il3Te1uxEKndWOJ+PMLftLQGtqguxkqmsaelrmG0dLk5lJDUvjVXRRksX8vnBE/YWOSSepCSvUre1Yrz+rkAGZ1uIlLluJAT93ugKwNGuG7SfeLn67A3A/6QcH8R8hSOQmQPzTi1dEoZcX/BJddh9cU49yXJwXAVDzz5p/mYb6pd+LG9MMD09obUVkIdq+1YsWW7aIyrtLYO3TKIBhhPj1klonEQOPlyOizyIlgVBkFIv/erMobiA6uMraGz/8og==]]></Encrypt> </xml>
3. 微信将上述请求包通过http post方式发送开发者在mp平台上配置的URL
json格式
POST
http://yourdomain/youdir?timestamp=XXX&nonce=XXX&msg_signature=XXX&signature=XXX
{"ToUserName":"gh_6ad1513a84d8","Encrypt":"vys1ev/gqMW8ykkgBwe9K5He4S8YxyT3ZUssaknxvnqv+LQCENfMXvhKrG3CLn0QcOWqNugfQYp/+jZ3vk/EQ3k700gPuIcf0kouwPiGijThCT70aXUQHy72TiuSo/+j4ooC6AKNJw0kLe4E1qGBJfaAJeplzEz2AefpU6d2ed0sZHZSOETFUMDfYiAm32ZW5XfydSRvlMQF9mOIGvhtW9il3Te1uxEKndWOJ+PMLftLQGtqguxkqmsaelrmG0dLk5lJDUvjVXRRksX8vnBE/YWOSSepCSvUre1Yrz+rkAGZ1uIlLluJAT93ugKwNGuG7SfeLn67A3A/6QcH8R8hSOQmQPzTi1dEoZcX/BJddh9cU49yXJwXAVDzz5p/mYb6pd+LG9MMD09obUVkIdq+1YsWW7aIyrtLYO3TKIBhhPj1klonEQOPlyOizyIlgVBkFIv/erMobiA6uMraGz/8og=="}
xml格式
POST
http://yourdomain/youdir?timestamp=XXX&nonce=XXX&msg_signature=XXX&signature=XXX
<xml><ToUserName>gh_6ad1513a84d8</ToUserName><Encrypt><![CDATA[vys1ev/gqMW8ykkgBwe9K5He4S8YxyT3ZUssaknxvnqv+LQCENfMXvhKrG3CLn0QcOWqNugfQYp/+jZ3vk/EQ3k700gPuIcf0kouwPiGijThCT70aXUQHy72TiuSo/+j4ooC6AKNJw0kLe4E1qGBJfaAJeplzEz2AefpU6d2ed0sZHZSOETFUMDfYiAm32ZW5XfydSRvlMQF9mOIGvhtW9il3Te1uxEKndWOJ+PMLftLQGtqguxkqmsaelrmG0dLk5lJDUvjVXRRksX8vnBE/YWOSSepCSvUre1Yrz+rkAGZ1uIlLluJAT93ugKwNGuG7SfeLn67A3A/6QcH8R8hSOQmQPzTi1dEoZcX/BJddh9cU49yXJwXAVDzz5p/mYb6pd+LG9MMD09obUVkIdq+1YsWW7aIyrtLYO3TKIBhhPj1klonEQOPlyOizyIlgVBkFIv/erMobiA6uMraGz/8og==]]></Encrypt></xml>
4. 第三方收到请求之后需要验证签名和解密
其中msg_signature为timestamp、nonce、Encrypt和token这四个字段进行的签名,不需要验证signature字段,只需要验证msg_signature。
5. 第三方需要处理业务逻辑后将数据按照以下json格式进行组织
lifespan: 告诉微信此次数据可以缓存多久,单位为秒
query: 步骤1中的query原封不动填到这里,为json_encode之后的字符串
scene: 固定为1,表明来自搜索
data: 根据各个业务数据数据文档进行编写,为json_encode之后的字符串;其中err_code和err_msg为必须字段,err_code中0代表正确,非0代表错误,请按规范返回错误码并且前端显示提示语:-1:无结果 -2:参数不对 -3:系统错误
{
"lifespan": 60,
"query": "{\"type\":1,\"slot_list\":[{\"key\":\"stock_code\",\"value\":\"00700\"}, {\"key\":\"stock_market\",\"value\":\"hk\"}],\"longitude\":113.319694519,\"latitude\":23.102640152}",
"scene": 1,
"data": "{\"err_code\":0, \"err_msg\":\"\", \"other custom data...\"}"
}
6. 第三方需要将数据按照以下格式进行组包
Content为步骤5的json进行json_encode之后的字符串
json格式
{ "ToUserName":"oAbb80HJy9Uqkpxxxxxxxxx", "FromUserName":"gh_54e07XXXXX", "CreateTime":1499048811, "MsgType":"widget_data", "Content": "{ \"lifespan\": 60,\"query\": \"{\\\"type\\\":1,\\\"slot_list\\\":[{\\\"key\\\":\\\"stock_code\\\",\\\"value\\\":\\\"0700\\\"}, {\\\"key\\\":\\\"stock_market\\\",\\\"value\\\":\\\"hk\\\"}],\\\"longitude\\\":113.319694519,\\\"latitude\\\":23.102640152}\", \"scene\": 1, \"data\": {\\\"err_code\\\":0, \\\"err_msg\\\":\\\"\\\", \\\"other custom data...\\\"}}" }
xml格式
<xml> <ToUserName>oAbb80HJy9Uqkpxxxxxxxxx</ToUserName> <FromUserName>gh_54e07XXXXX</FromUserName> <CreateTime>1499048811</CreateTime> <MsgType>widget_data</MsgType> <Content><![CDATA[ {"lifespan": 60, "query": "{\"type\":1,\"slot_list\":[{\"key\":\"stock_code\",\"value\":\"0700\"}, {\"key\":\"stock_market\",\"value\":\"hk\"}],\"longitude\":113.319694519,\"latitude\":23.102640152}\", "scene": 1, "data": {\"err_code\":0, \"err_msg\":\"\", \"other custom data...\"} } ]]></Content> </xml>
7. 第三方需要将数据进行加密和签名,并将数据包返回给微信
Encrypt为步骤6进行加密和编码之后的字符串,MsgSignature为Encrypt、Timestamp、Nonce和token进行的签名
json格式
{ "Encrypt":"unqZKge43FJn75RVHiAxGfIvrMgx+YbHABAIH7fiEgNgZgdTWGk13+uJvGwqE94LQ0oNDgHSPUcheVuriBTz+0IipenXLqLVQVnKtppkcH9awZAtuYhT2mg8wy4Z5BBst38VH7isWMeqC4ukwo+3hBYvLr2d7MEiGyDULWjlbIifCtZx3pLz0kbqUz0TacOINHfVBUmzk07TdkTdupdxL1CQWDyzBMb618HD31SIHuROTyTFXa1n5t3KWzni+eki7HTBQd3Vyz7Hi9Kke5gYdj8RkORahX0q+CUUun92eF9y2IUAVuiOWXgwqn0fRDDVr0Swz21GrRxWGRGP6NzCO7smp2b9c7ztbTuaxPbsxO4bDB1kg2Da3+Z5RcHSDEvwBtkU3ps88QA8/hk3lpBlcyfewBtsHqIyTqvx8/bZOzpT5rN4H8lKtPvKdQVZzcuyxH4VptuyfUx3DKMVZyXV9J0V8xmjsUWsb2hqqRPHEBIPwS0QDI23YnmlpyB4PxYqy+erENk4dyZZlQhRsv0AG24bw4ajovllfR4HjaI4XtY=", "MsgSignature":"ad75308035efbe84bb0b59fb90c5be966ff38d42", "TimeStamp":"1410329438", "Nonce":"12980754" }
xml格式
<xml> <Encrypt><![CDATA[unqZKge43FJn75RVHiAxGfIvrMgx+YbHABAIH7fiEgNgZgdTWGk13+uJvGwqE94LQ0oNDgHSPUcheVuriBTz+0IipenXLqLVQVnKtppkcH9awZAtuYhT2mg8wy4Z5BBst38VH7isWMeqC4ukwo+3hBYvLr2d7MEiGyDULWjlbIifCtZx3pLz0kbqUz0TacOINHfVBUmzk07TdkTdupdxL1CQWDyzBMb618HD31SIHuROTyTFXa1n5t3KWzni+eki7HTBQd3Vyz7Hi9Kke5gYdj8RkORahX0q+CUUun92eF9y2IUAVuiOWXgwqn0fRDDVr0Swz21GrRxWGRGP6NzCO7smp2b9c7ztbTuaxPbsxO4bDB1kg2Da3+Z5RcHSDEvwBtkU3ps88QA8/hk3lpBlcyfewBtsHqIyTqvx8/bZOzpT5rN4H8lKtPvKdQVZzcuyxH4VptuyfUx3DKMVZyXV9J0V8xmjsUWsb2hqqRPHEBIPwS0QDI23YnmlpyB4PxYqy+erENk4dyZZlQhRsv0AG24bw4ajovllfR4HjaI4XtY=]]></Encrypt> <MsgSignature>ad75308035efbe84bb0b59fb90c5be966ff38d42</MsgSignature> <TimeStamp>1410329438</TimeStamp> <Nonce>12980754</Nonce> </xml>