开发问题
与微信服务器交互问题:
开发微信需要和微信服务器来回不断的请求和测试,微信公众号后台需要预先配置一个url地址,才会推送消息给url地址对应的服务器,这会导致一个问题:我们在家里/公司的IP是动态变化的,没有办法提供一个稳定的域名环境。
解决:
1、我们可以把代码发布到服务器上,通过服务器的固定IP来对应到某个固定域名,这样效率太低,每次我们都需要登录到服务器修改代码,或者把本地代码重新发布到服务器上重新启动。
2、借助代理工具(内网穿透工具)实现内网端口的映射,把内网的服务提供出去。mac建议使用Ngrok工具(ngrok.cc)。
3、开通隧道。
4、使用隧道,下载完ngrok客户端,进入执行 ./sunny clientid 隧道id
注:Ngrok是一个内网穿透工具。
内网计算机都至少通过一层网关或者网桥连接公网,如果没有自己独立的IP和端口,其他计算机看到你的IP是网关的IP,别人也就无法与你建立连接。而你能获取外部信息,是你上网时,网关临时给你分配一个端口与外网计算机建立udp连接,从而接受到外网计算机返回给你的udp包。
Ngrok做到内网穿透,是给我们一个域名,域名和我们网关的IP+我们自定义的端口来DNS关联映射,从而其他计算机能够访问到我们的域名。
如何首次验证微信公众号服务器?
我们在 微信公众平台-开发者工具中-公众平台测试号申请时:
appID和appsecret是平台给出的,Token需要我们自己设置并给出,URL是我们的服务器接受微信服务器发出请求的url地址,需要我们自己编写接口。 微信公众号需要我们的服务器和微信服务器 有一些基于消息/资源相关http请求的交互,所以在我们的项目中需要一层专门用来处理微信发出消息的中间件。
我们需要利用koa-router来编写一个接口地址,来获取微信服务器对我们服务器发出请求给到的信息:
1、传给我们的信息(nonce、timestamp、echostr)。
2、微信根据自己给出信息和我们给出token进行计算得到的签名(signature)。
我们自己根据微信提供的信息和token根据相同规则计算出的签名和微信给到的签名相同,就返回给微信 echostr,代表验证成功。
注意:我们Ngrok进行内网穿透时,我们设置的我们电脑本地服务器端口必须是80端口,不然是无法接收到微信服务器发出的请求的。
微信消息管理
微信消息架构(用户消息-微信服务器-开发者服务器 之间的处理逻辑)是怎么样的?
微信消息架构逻辑微信数据管理不用给客户端提供接口,在项目服务端和微信服务端交互完成。
场景:用户会在公众号聊天窗口上发送 文字、语音、图片等消息,开发者是如何接收到消息并返回给指定内容的?
首先,用户的消息是如何发送到开发者的? 用户发送的每个消息都是一个事件,微信服务器接收到消息 根据不同的消息内容格式封装成不同的XML数据来通知到开发者(微信公众后台配置的url地址)。
其次,内容在开发者中经过哪些处理?数据进入node服务之后,会通过koa2路由中间件,根据Get/Post请求做相应解析。Get请求是首次验证微信号,Post请求的话会把数据包解析出来,根据数据包内容指定回复策略(其中可能会查数据库、读取本地json数据文件)确定回复内容。
最后,开发者如何把内容传回给微信服务器?在回复给微信服务器之前,需要同步全局的票据AccessToken1(它是传数据给微信服务器的一把钥匙),把AccessToken1和内容进行拼接生成标准回复的数据格式并套入XML模版,最终把XML模版数据发送给微信服务器,由微信服务器下发给用户。
微信数据管理
微信数据管理不用给客户端提供接口,在项目服务端和微信服务端交互完成。
通过appID和appSecret拿到全局票据AccessToken1。
通过微信指定的接口及参数,去上传/获取数据(素材模块、菜单模块、用户信息模块等)。
微信网页开发
其主要分为2大部分:
1、微信SDK的接口调用(难点是通过config接口注入权限验证配置)。
2、微信网页授权 (比如获取用户的资料)。
微信SDK接口调用():
微信SDK调用需要给客户端准备1个接口,客户端获取到appId、nonce、timestamp、signature。客户端引入wx指定js文件后,通过wx.config({...})完成身份验证,再通过wx.ready({..})调用微信SDK接口。
1、客户端通过服务端指定的接口发送请求(带上当前页面url,不包含#及其后面部分)。
2、后端接收到请求,向mongoDB或者微信服务器,先去获取accessToken,再通过获取到的accessToken1去获取ticket(jsapi_ticket)。
通过url(客户端传过来)、ticket、nonce(随机字符串)、timestamp(时间戳),算出签名signature。
返回{nonce,timestamp,signature,appId}对象给客户端。
3、客户端引入wx的js文件,通过wx.config({请求到的信息})异步验证身份,再通过wx.ready()调用微信api(对于由用户动作触发的接口,可以不再ready中执行,因为肯定已经验证完成)。
注意:记得在微信公众平台-测试号管理,配置JS接口安全域名。
微信网页授权及用户信息获取:
必须认证过的服务号才能通过oauth机制获取用户信息。
微信网页授权,需要给客户端准备2个接口。
第1个接口,用户进入后第1个接口后,拼接好“权验url”,其中包括微信提供的url地址,appid、redirect_uri(权验成功后要跳转的url)、scope(权验类型)、state(其他参数)等。跳转到权验页面。
第2个接口,用户同意授权后,跳转到这个接口(这时url后面会带一个code参数),通过code参数获取accessToken2(和以上接口中的accessToken1不同)和openId,最后通过这两者去获取用户信息
注意:记得在微信公众平台-测试号管理-体验接口权限表-网页服务-网页帐号-修改,配置 “ 授权回调页面域名”。