请稍等 ...
×

采纳答案成功!

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

关注和取消都获取不到XML数据

config/wechat.txt

1


libs/utils.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
'use strict'
 
var fs = require('fs');
var Promise = require('bluebird');
 
 
// 读取文件
exports.readFileAsync = function(fpath, encoding){
 
return new Promise(function(resolve, reject){
fs.readFile(fpath, encoding, function(err, content){
// console.log("err : " + JSON.stringify(err));
if(err){
reject(err);
}
else {
 
// console.log("content : " + JSON.stringify(content));
resolve(content);
}
})
})
}
 
 
// 写入文件
exports.writeFileAsync = function(fpath, content){
return new Promise(function(resolve, reject){
fs.writeFile(fpath, content, function(err){
if(err){
reject(err);
}
else {
resolve();
}
})
})
}


wechat/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
47
48
49
50
51
52
'use strict'
 
var sha1 = require('sha1');
var getRawBody = require('raw-body');
var Wechat = require('./wechat');
 
 
 
// 中间件
module.exports = function(opts){
// 初始化wechat 管理票据的更新
var wechat = new Wechat(opts);
 
console.log("++++++");
return function *(next){
console.log(this.query);
 
// 加密逻辑
var token = opts.token;
var signature = this.query.signature;
var nonce = this.query.nonce;
var timestamp = this.query.timestamp;
var echostr = this.query.echostr;
var str = [token, timestamp, nonce].sort().join('');
var sha = sha1(str);
 
console.log(this.method);
if(this.method === 'GET'){
if(sha === signature){
this.body = echostr + '';
}
else {
this.body = 'get wrong';
}
}
else if(this.method === 'POST'){
if(sha !== signature){
this.body = 'post wrong';
return false;
}
 
var data = yield getRawBody(this.req, {
length : this.length,
limit : '1mb',
encoding : this.charset
});
 
console.log('post ' + data.toString());
 
}
}
}


wechat/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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
'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'
}
//https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
 
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.isValidAccessToken(data)){
// 如果合法 传下去
return Promise.resolve(data);
}
else {
// 如果不合法过期 则更新票据
return that.updateAccessToken();
}
})
.then(function(data){   // 最终票据结果
 
// 把access_token挂到实例上
that.access_token = data.access_token;
 
// 把过期时间挂到实例上
that.expires_in = data.expires_in;
 
// 储存票据
that.saveAccessToken(data);
})
};
 
 
// 合法性检查
Wechat.prototype.isValidAccessToken = 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){
 
// console.log(response);
 
var data = response.body;
var now = (new Date().getTime());
 
// 过期时间提前20秒更新 考虑网络延迟
var expires_in = now + (data.expires_in - 20)*1000;
 
// 缩短后的过期时间复制给数据本身
data.expires_in = expires_in;
 
// 继续向下传递
resolve(data);
})
});
 
};
 
 
module.exports = Wechat;


app.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
'use strict'
 
var Koa = require('koa');
var path = require('path');
 
var wechat = require('./wechat/g');
var util = require('./libs/util');
 
 
var wechat_file = path.join(__dirname, './config/wechat.txt');
 
var config = {
wechat : {
appID : 'wx987f75bb63a127b7',
appSecret : '202a0ae869cfffd0cb24d18d32686577',
token : 'whjtest',
getAccessToken : function(){
return util.readFileAsync(wechat_file)
},
saveAccessToken : function(data){
data = JSON.stringify(data);
return util.writeFileAsync(wechat_file, data)
}
}
};
 
 
var app = new Koa();
 
// functioan 后 加 * 生成器函数  是一种可以从中退出并在之后重新进入的函
app.use(wechat(config.wechat));
 
app.listen(80);
console.log('localhost:80');


package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"name""mp",
"version""1.0.0",
"description""",
"main""index.js",
"scripts": {
"test""echo \"Error: no test specified\" && exit 1"
},
"author": {
"name""whj",
"email""1004609378@qq.com"
},
"license""ISC",
"dependencies": {
"bluebird""^3.5.0",
"koa""^1.2.0",
"sha1""^1.1.1"
},
"devDependencies": {
"raw-body""^2.2.0",
"request""^2.81.0"
}
}


打印出来的内容

1
2
3
4
5
6
localhost:80
{ signature: '483cccc745a6be740609452a7ab25936f98b18cc',
  echostr: '1071629943448784895',
  timestamp: '1492076093',
  nonce: '748994395' }
GET



再之后,无论是关注,取消关注,都没有任何打印出来了



如图,课程有打印出xml的内容,但是我的并没有

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

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

插入代码

4回答

Scott 2017-04-18 08:10:12

嘿,这就说明不是这块 this.method 下面的代码的问题啊,发过来的请求貌似就不正常呢。


你把代码,先格式缩进处理好,发我邮箱吧 wolf18387@qq.com


我测试一下

0 回复 有任何疑惑可以回复我~
  • 提问者 大丢 #1
    已发送至您的邮箱, 邮件名为 -  【慕课网】关注和取消都获取不到XML数据-源码
    回复 有任何疑惑可以回复我~ 2017-04-18 09:31:30
Scott 2017-04-17 12:53:00

看代码,没看到你用来回复给微信服务器的代码啊,是没有写,还是忘了贴了


关注和取消关注,微信会推送过来数据,你这里接收到推送数据,做相应处理后,再返回给微信服务器,才会流程继续,你再往后面听两节,先不要跟着敲代码,然后回过头来,看下这个地方。

0 回复 有任何疑惑可以回复我~
  • 提问者 大丢 #1
    在 wechat/g.js 里 console.log了 关注后返回的数据data(48行),但是并没有打印出返回的数据。
    好的  那先去听了2节课后再看看  谢谢老师了~
    回复 有任何疑惑可以回复我~ 2017-04-17 13:13:08
  • 提问者 大丢 #2
    在问题的最后补充了应该打印出xml内容,但却没有打印出的位置 是这节课程的 8"00
    回复 有任何疑惑可以回复我~ 2017-04-17 13:36:09
  • Scott 回复 提问者 大丢 #3
    48 行没有执行的话,看看 29 行, 39 43 49 行,在这些位置,都放上 console,看看是 29行都没有执行,还是在 29~48行之间停掉了。
    回复 有任何疑惑可以回复我~ 2017-04-17 19:29:09
Scott 2017-04-14 23:43:32

先把 koa 退回到 1.2.0 试一下


npm i koa@1.2.0 -save

0 回复 有任何疑惑可以回复我~
  • 提问者 大丢 #1
    已经降至1.2.0版本 还是没有返回
    回复 有任何疑惑可以回复我~ 2017-04-16 12:15:47
  • 提问者 大丢 #2
    老师 您啥时候有空 要不我发您源码和服务器的 麻烦您那边运行一下? 现在这么卡着 后面的课程无法学下去了
    回复 有任何疑惑可以回复我~ 2017-04-16 12:16:58
  • Scott 回复 提问者 大丢 #3
    你把从 app.js 到 g.js 所有项目的手写代码,都贴到这里,我再 review 一遍看下,以及 package.json
    回复 有任何疑惑可以回复我~ 2017-04-16 16:36:57
Scott 2017-04-13 22:04:06

koa 的版本是多少?

另外用的哪个代理。

我目测代码没问题,后面都不打印了,因为是 http 请求没成功接收,或者是没有成功进入到这个中间件中,感觉是哪个小环节断了


0 回复 有任何疑惑可以回复我~
  • 提问者 大丢 #1
    koa是2版本的,只是警告,并没有报错。
    代理是买的腾讯云服务器
    回复 有任何疑惑可以回复我~ 2017-04-14 10:07:36
  • 提问者 大丢 #2
    按照这个教程 部署的node服务器 直接用IP是可以打开的 
    https://segmentfault.com/a/1190000004051670?utm_source=tuicool&utm_medium=referral
    回复 有任何疑惑可以回复我~ 2017-04-14 10:53:09
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

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

帮助反馈 APP下载

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

公众号

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