g.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 'use strict' var sha1 = require( 'sha1' ); var getRawbody = require( 'raw-body' ); var Wechat = require( './wechat' ); var util = require( './util' ); module.exports = function (opts) { var wechat = new Wechat(opts); return ( function *(ctx, next) { var token = opts.token; var signature = ctx.query.signature; var echostr = ctx.query.echostr; var timestamp = ctx.query.timestamp; var nonce = ctx.query.nonce; var str = [token, timestamp, nonce].sort().join( '' ); var sha = sha1(str); if (ctx.method === 'GET' ) { if (sha === signature) { ctx.body = echostr + '' ; } else { ctx.body = 'wong' ; } } else if (ctx.method === 'POST' ){ if (sha !== signature) { ctx.body = 'wrong' ; return false ; } var data = yield getRawbody(ctx.req, { length: ctx.length, limit: '1mb' , encoding: ctx.charset }) var content = yield util.parseXMLAsync(data); console.log(content); } }) } |
wechat.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | 'use strict' var Promise = require( 'bluebird' ); var request = Promise.promisify(require( 'request' )); var prefix = 'https://api.weixin.qq.com/cgi-bin/' ; var api = { accessToken: prefix + 'token?grant_type=client_credential' } function Wechat(opts) { var that = this ; this .appID = opts.appID; this .appSecret = opts.appSecret; this .getAccessToken = opts.getAccessToken; this .saveAccessToken = opts.saveAccessToken; this .getAccessToken() .then( function (data) { try { data = JSON.parse(data); } catch (e) { return that.updateAccessToken(); } if (that.isValidAccressToken(data)) { return Promise.resolve(data); } else { return that.updateAccessToken(); } }) .then( function (data) { that.access_token = data.access_token; that.expires_in = data.expires_in; that.saveAccessToken(data); }) } Wechat.prototype.isValidAccressToken = function (data) { if (!data || !data.access_token || !data.expires_in) { return false ; } var access_token = data.access_token; var expires_in = data.expires_in; var now = ( new Date().getTime()); if (now < expires_in) { return true ; } else { return false ; } } Wechat.prototype.updateAccessToken = function () { var appID = this .appID; var appSecret = this .appSecret; var url = api.accessToken + '&appid=' + appID + '&secret=' + appSecret; return new Promise( function (resolve, reject) { request({url: url, json: true }).then( function (response) { var data = response.body; var now = ( new Date().getTime()); var expires_in = now + (data.expires_in - 20) * 1000; data.expires_in = expires_in; resolve(data); }) }) } module.exports = Wechat; |
只能打印出关注的,如何解决