微信开发模式-真Token方案
1. 方案说明
1.1 方案简介
1)由于微信只允许一个中转服务和微信进行数据交互,所以,在此基础上,小能是无法直接和微信进行数据交互的。
而想在此场景下,企业公众微信接入小能在线客服系统,只能由中转服务和小能进行交互。
所有数据由中转服务在中间连接微信和小能,进行数据中转。小能定义此对接模式为复杂开发模式。
2)开发工作量:
上行消息,消息推送给小能方
下行消息,需集成方开发1个Token接口,小能访问此接口,中转服务返回与微信交互的真实Token
Token URL
1.2 运行原理
上行消息:用户 ---- 微信 ---- 中转服务 ---- 小能
下行消息:小能 ---- 微信 ---- 用户
1.3 方案流程
如上图所示,流程如下:
1)用户在微信聊窗中发起咨询,消息发给微信
2)微信把消息POST发送出去,将消息中转至中转服务
3)中转服务将消息转发送给小能服务器;小能自行处理连接到客服,显示到客户端上
4)客服在客户端中回复消息,小能服务器把消息回复给微信
5)微信将消息主动推送给微信用户
2. 名词解释
1)中转服务:和微信对接交互的服务。以配置到微信公众平台开发模式下的服务器url和token为主。一般配置此选项的对象为两个,一个是第三方,如:微盟、丁香 园、微信海。另一个是企业自行对接微信,开发的管理后台。小能把第三方和自行开发的管理后台,统称为中转服务。
2)接口:双方交互数据的一种约定。根据微信开发文档的要求,所有数据交互均采用接口进行互动。当A方调用B方接口发起请求,传递数据,B方收到数据之后,要及时给A方返回响应。接口说明
3)XML与JSON:最新微信公众开发文档要求,微信往外给接收方发送消息采用XML格式发送消息。当接收方给微信推送消息服务,需采用json格式。
3. 各消息流运行流程细节
红色数字部分为开发任务
如上图所示,流程如下:(1-5为上行消息流程,6-12为下行消息流程)
1)用户发送文本消息给微信
2)微信将文本消息,以XML格式,发送至中转服务,微信发送的对象为:在微信公众后台 -- 开发模式基本信息项中,配置的服务器地址Url和Token的XML消息微信给出规范要求文档:接收普通消息规范文档
示例格式:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName> //开发者微信号
<FromUserName><![CDATA[fromUser]]></FromUserName> //发送方帐号(一个OpenID)
<CreateTime>1348831860</CreateTime> //消息创建时间(整型)
<MsgType><![CDATA[text]]></MsgType> //text
<Content><![CDATA[this is a test]]></Content> //文本消息内容
<MsgId>1234567890123456</MsgId> //消息id,64位整型
</xml>
3)当中转服务收到微信的xml消息,请及时返回给微信一个响应。避免微信在5秒内收不到响应,提醒用户,该公众号暂时无法提供服务。(此过程在没有对接小能就应该处理好,已经处理过的,可忽略) 详细解释说明文档参考:接收普通消息规范文档
4)中转服务,需在自己的后台,定义一个方法,把微信的XML,转发给小能。这个时候需要小能提供接收消息的接口:
小能服务器人工对话接口,正式地址URL:https://thirdparty.ntalker.com/wechat
注意事项:
A:http请求小能方式:POST
B:Content-type类型需指定为:text/xml
C:可参考小能提供的demo,开发接口文档(仅供参考,php和java语言)
5)小能收到中转服务的请求,解析xml数据,然后呈现到小能客户端,同时返回响应给中转服务。 (返回的响应是一个空)截止到第五步,上行消息全部通过。联调标准以小能客户端收到消息为主。
中转服务在上行消息和小能交互,只需做第4步开发(第3步属于中转服务和微信的交互)
6)小能请求Token接口
小能是把和小能交互的一方,当做微信,所以在小能的角度,把中转服务当做了微信。
根据微信的开发文档规范要求,请求一个接收消息接口,需加上access_token,而access_token是通过接口获取。
所以这里中转服务,需模拟微信开发一个Token接口,模拟小能获取微信token,用于数据交互。此Token用于文本、图片、语音的交互。Token接口规范文档
示例:
A:http请求方式: GET
B:正确举例(请勿加参数):
https://api.weixin.qq.com/cgi-bin/token
C:错误举例:
https://api.weixin.qq.com/cgi-bin/token?name=123
D:参数要求(小能访问token接口自动加的参数):
其中appid和secret,这里是模拟微信的要求,所以,此处的这两个值,是假值,并非真的appid和secret
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证 |
secret | 是 | 第三方用户唯一凭证密钥,即appsecret |
7)小能请求中转服务模拟的Token接口,中转服务返回响应,返回格式要求:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200
}
参数 | 说明 |
---|---|
access_token | 获取到的凭证 |
expires_in | 凭证有效时间,单位:秒 |
由于Token接口,appid和secret都是模拟出来的假的,所以,返回的响应,也是按照微信的格式要求。
建议:
A:access_token为当前对应的微信号的真token(多个微信号可根据appid和secret来判断)
B:expires_in的值,并非固定的7200。凭证的有效时间可大可小,真token方案,建议低于7200,高于3600
8)小能取出access_token,发送消息给微信服务,微信会验证小能从中转服务的token接口,拿到的真token的合法性。(微信验证此token和微信自己库里面当前生效的token是否一致)
9)微信收到小能的文本消息,会返回响应给小能,返回信息格式如下:
{
"errcode" : 0,
"errmsg" : "ok",
}
10)微信把消息发送给用户
4. 客服端配置接口地址
4.1 选择"接入微信号"后,点击"开发模式"
4.2 填写:微信服务号名称、微信原始ID、微信APPID、AppSecret
4.3 填写接口地址URL
文本接收URL:https://api.weixin.qq.com/cgi-bin/message/custom/send
图片语音上传URL:https://api.weixin.qq.com/cgi-bin/media/upload
图片语音下载URL:https://api.weixin.qq.com/cgi-bin/media/get
Token URL:配置集成方开发的获取真实Token的URL地址