# wx_server **Repository Path**: xuezi/wx_server ## Basic Information - **Project Name**: wx_server - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2016-05-30 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #微信第三方服务 本服务为第三方微信服务器框架,用于第三方的微信公众号开发 本服务基于为点纳微站微信需求制作,同时支持第三方项目使用 本地调试请运行命令行开发模式:nodemon server -dev:dotnar -dev是开发模式,不会在本地生成log日志文件 请用nginx代理服务去监听80端口,服务不要直接运行在80端口上,服务应运行在80端口以外的任意端口 如果是代理https服务则是监听443端口 对于nginx如何代理node服务,请参考网络文档 ####配置文件 /tools/config/wx.conf.json 文件包含了微信公众号的基本配置参数 ####获取客户端的ip 在微信校验签名的时候有时候需要用到客户端的ip参与加密签名算法 如果通过服务端ip+port访问接口,获取客户端的ip为 ````javascript client_ip_address = ctx.socket.remoteAddress; ```` 如果通过nginx配置域名代理服务端口,获取ip ````javascript client_ip_address = ctx.headers['x-forwarded-for']; ```` 同时,nginx代理此服务的时候应该添加如下配置 ``` location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:yourAppPort; } ``` ####参数签名 微信需要对参数进行签名的时候,需要先将参数进行url键值对排列,排列顺序需要按照字典排序 如果参数列是一个数组,js数组的默认排序是字典排序,直接排序即可 `````javascript Array.sort(); ```` 如果参数列是一个json,将json进行字典排序,可以调用Object类的keys(json)得到参数名的数组,然后进行排序 ````javascript var ov = Object.keys(json).sort(); ```` ov是一个参数名字典排序数组,还要根据ov对json进行解析排序 ````javascript var str = '' for(var i = 0; i< ov.length; i++){ i == 0 ? str+ = ov[i] + '=' + json[ov[i]] : str+ = '&' + ov[i] + '=' + json[ov[i]]; } ```` 得到一个url键值对字符串,类似 ````javascript str = key1=value1&key2=value2&key3=value3......&keyn=valuen; ```` 最后对字符串添加api密钥,进行MD5加密,并将结果转为大写 ````javascript var md5 = require("md5"); var signString = str + "&key=apiKEY"; var sign = md5(signString).toUpperCase(); ```` ####接口处理xml数据 微信大部分接口的参数传递都是xml格式,服务默认参数传递为x-www-form-urlencoded,不能获取xml数据。 为使接口具有处理xml数据的能力,引入了koa-buddy。 对于需要传递xml数据的接口需要单独处理,在接口对象的des和method之间加入参数xmlParser:true, 获取微信发送过来的xml数据为var xml = this.request.body; ````javascript module.exports = { post : { 'example_interface/' : { des : { name : 'interface_name', content : 'interface_content', params : [ { key : 'key_name', type : 'key_type' }, ... ] }, xmlParser : true, method :function *(){ var xml = this.request.body; } } } } ````