消息同步示例

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>