请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

2-7 git中取消关注打印不出信息,关注可以打印信息,如何解决?

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;

只能打印出关注的,如何解决

https://img1.sycdn.imooc.com/szimg//58bacbab0001d01406930193.jpg

正在回答 回答被采纳积分+3

插入代码

3回答

Scott 2017-03-06 14:08:41

不合常理啊,你先往下面走,测试下发送文字消息之类的,看能不能收到其他的类型的 post 请求

0 回复 有任何疑惑可以回复我~
  • 提问者 menghuanbaolei #1
    不好意思,这么晚才看到,到了发送文字消息那块,能收到用户发过来的消息,可是设置的被动回复无法发送出去,对此,我已经绝望了!!!(ps:这个账号之前有注册过订阅号)我决定先缓缓,去看看相关的知识,在回过来解决这个问题。(或许,我的问题,只有我自己能解决。)
    回复 有任何疑惑可以回复我~ 2017-03-06 23:47:39
  • 提问者 menghuanbaolei #2
    我想到一个解决方法:我把所有服务开启来,然后你远程自己操作一次,看一次,这样子你或许可以知道问题出在哪,也方便很多;
    或者,我把文件发给你。
    回复 有任何疑惑可以回复我~ 2017-03-07 00:05:54
  • Scott 回复 提问者 menghuanbaolei #3
    能收到,但是自己设置的回复不能返回的话,是不是 next 调用栈断开了,你用的是 koa 2.0 吧,怀疑:
    
    var content = yield util.parseXMLAsync(data);
     
                console.log(content);
    
    也就是 ctx.body 赋值之后就不再执行了。
    
    你可以把 koa 降到 1.2.0,同时语法改成是 1.2.0 的 API 用法试试看,如果能跑通的话,再升到 2.0 之后,看看是不是一些 Promise 中间件是需要 koa-convert 一下才能使用
    回复 有任何疑惑可以回复我~ 2017-03-07 08:59:57
Scott 2017-03-05 09:42:08

在 if (sha !== signature) { 前面打印一下 ctx.req,看看取关时候,会不会过来正常的请求和数据,另外你使用的是公众测试号么

0 回复 有任何疑惑可以回复我~
  • 提问者 menghuanbaolei #1
    1、取关的时候不会有请求和数据,ps:关注收到的post请求是404
    2、是测试公众号
    回复 有任何疑惑可以回复我~ 2017-03-05 10:56:10
  • 提问者 menghuanbaolei #2
    data的时候就只能获取关注的信息,到content的时候也是只能获取关注的信息
    回复 有任何疑惑可以回复我~ 2017-03-05 11:51:24
提问者 menghuanbaolei 2017-03-04 22:19:08

关注能收到post,移除收不到post请求

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号