|
@@ -9,7 +9,7 @@ |
|
@@ -9,7 +9,7 @@ |
9
|
const util = require('util');
|
9
|
const util = require('util');
|
10
|
const _ = require('lodash');
|
10
|
const _ = require('lodash');
|
11
|
const md5 = require('md5');
|
11
|
const md5 = require('md5');
|
12
|
-const Strategy = require('passport-strategy');
|
12
|
+const passport = require('passport-strategy');
|
13
|
|
13
|
|
14
|
// 支付宝网关地址
|
14
|
// 支付宝网关地址
|
15
|
const ALIPAY_URL = 'https://mapi.alipay.com/gateway.do';
|
15
|
const ALIPAY_URL = 'https://mapi.alipay.com/gateway.do';
|
|
@@ -30,52 +30,50 @@ function paramsToRaw(params) { |
|
@@ -30,52 +30,50 @@ function paramsToRaw(params) { |
30
|
let keys = Object.keys(params);
|
30
|
let keys = Object.keys(params);
|
31
|
|
31
|
|
32
|
keys = keys.sort();
|
32
|
keys = keys.sort();
|
33
|
- let newArgs = {};
|
33
|
+ let string = '';
|
34
|
|
34
|
|
35
|
keys.forEach((key) => {
|
35
|
keys.forEach((key) => {
|
36
|
- newArgs[key] = params[key];
|
36
|
+ string += '&' + key + '=' + params[key];
|
37
|
});
|
37
|
});
|
38
|
|
38
|
|
39
|
- let string = '';
|
|
|
40
|
-
|
|
|
41
|
- for (let k of newArgs) {
|
|
|
42
|
- string += '&' + k + '=' + newArgs[k];
|
|
|
43
|
- }
|
|
|
44
|
string = string.substr(1);
|
39
|
string = string.substr(1);
|
45
|
return string;
|
40
|
return string;
|
46
|
}
|
41
|
}
|
47
|
|
42
|
|
48
|
-function AlipayStrategy(options) {
|
|
|
49
|
- Strategy.call(this);
|
43
|
+function AlipayStrategy(options, verify) {
|
|
|
44
|
+ if (typeof options === 'function') {
|
|
|
45
|
+ verify = options;
|
|
|
46
|
+ options = {};
|
|
|
47
|
+ }
|
|
|
48
|
+ options = options || {};
|
|
|
49
|
+ passport.Strategy.call(this);
|
50
|
this.name = 'alipay';
|
50
|
this.name = 'alipay';
|
51
|
- this._passReqToCallback = options.passReqToCallback;
|
51
|
+ this._verify = verify;
|
|
|
52
|
+ this._options = options;
|
52
|
}
|
53
|
}
|
53
|
|
54
|
|
54
|
-util.inherits(AlipayStrategy, Strategy);
|
55
|
+util.inherits(AlipayStrategy, passport.Strategy);
|
55
|
|
56
|
|
56
|
-AlipayStrategy.prototype.authenticate = (req, options) => {
|
|
|
57
|
- if (req.query && req.query.is_success && req.query.sign && req.query.sign_type) {
|
|
|
58
|
-
|
|
|
59
|
- // sign check
|
57
|
+AlipayStrategy.prototype.authenticate = function(req, options) {
|
60
|
|
58
|
|
|
|
59
|
+ if (req.query && req.query.is_success && req.query.sign && req.query.sign_type) {
|
61
|
let query = req.query;
|
60
|
let query = req.query;
|
62
|
let sign = query.sign;
|
61
|
let sign = query.sign;
|
63
|
let signType = query.sign_type;
|
62
|
let signType = query.sign_type;
|
64
|
|
63
|
|
65
|
delete query.sign_type;
|
64
|
delete query.sign_type;
|
66
|
delete query.sign;
|
65
|
delete query.sign;
|
67
|
- let signString = paramsToRaw(query) + options.key;
|
66
|
+ let signString = paramsToRaw(query) + this._options.key;
|
68
|
|
67
|
|
69
|
if (signType === 'MD5' && sign !== md5(signString)) {
|
68
|
if (signType === 'MD5' && sign !== md5(signString)) {
|
70
|
this.error('alipay callback sign check fail');
|
69
|
this.error('alipay callback sign check fail');
|
71
|
this.fail('alipay callback sign check fail');
|
70
|
this.fail('alipay callback sign check fail');
|
72
|
- return;
|
|
|
73
|
}
|
71
|
}
|
74
|
|
72
|
|
75
|
if (req.query.is_success === 'T') {
|
73
|
if (req.query.is_success === 'T') {
|
76
|
let user = {
|
74
|
let user = {
|
77
|
userId: req.query.user_id,
|
75
|
userId: req.query.user_id,
|
78
|
- realName: req.query.realName,
|
76
|
+ realName: req.query.real_name,
|
79
|
email: req.query.email
|
77
|
email: req.query.email
|
80
|
};
|
78
|
};
|
81
|
|
79
|
|
|
@@ -85,20 +83,24 @@ AlipayStrategy.prototype.authenticate = (req, options) => { |
|
@@ -85,20 +83,24 @@ AlipayStrategy.prototype.authenticate = (req, options) => { |
85
|
this.fail(req.error_code);
|
83
|
this.fail(req.error_code);
|
86
|
}
|
84
|
}
|
87
|
} else {
|
85
|
} else {
|
88
|
- let params = _.extends(defaultOptions, options);
|
86
|
+ let params = _.assign(defaultOptions, this._options, options);
|
89
|
let signType = params.sign_type;
|
87
|
let signType = params.sign_type;
|
|
|
88
|
+ let key = params.key;
|
90
|
|
89
|
|
91
|
delete params.sign_type;
|
90
|
delete params.sign_type;
|
92
|
delete params.sign;
|
91
|
delete params.sign;
|
93
|
- let signString = paramsToRaw(params) + options.key;
|
92
|
+ delete params.key;
|
|
|
93
|
+ let signString = paramsToRaw(params) + key;
|
94
|
|
94
|
|
95
|
if (signType === 'MD5') {
|
95
|
if (signType === 'MD5') {
|
96
|
params.sign = md5(signString);
|
96
|
params.sign = md5(signString);
|
97
|
params.sign_type = 'MD5';
|
97
|
params.sign_type = 'MD5';
|
98
|
}
|
98
|
}
|
99
|
-
|
|
|
100
|
this.redirect(ALIPAY_URL + '?' + paramsToRaw(params));
|
99
|
this.redirect(ALIPAY_URL + '?' + paramsToRaw(params));
|
101
|
}
|
100
|
}
|
102
|
};
|
101
|
};
|
103
|
|
102
|
|
104
|
-module.exports.Strategy = AlipayStrategy; |
103
|
+exports = module.exports = AlipayStrategy;
|
|
|
104
|
+
|
|
|
105
|
+exports.Strategy = AlipayStrategy;
|
|
|
106
|
+ |