...
|
...
|
@@ -9,7 +9,7 @@ |
|
|
const util = require('util');
|
|
|
const _ = require('lodash');
|
|
|
const md5 = require('md5');
|
|
|
const Strategy = require('passport-strategy');
|
|
|
const passport = require('passport-strategy');
|
|
|
|
|
|
// 支付宝网关地址
|
|
|
const ALIPAY_URL = 'https://mapi.alipay.com/gateway.do';
|
...
|
...
|
@@ -30,52 +30,50 @@ function paramsToRaw(params) { |
|
|
let keys = Object.keys(params);
|
|
|
|
|
|
keys = keys.sort();
|
|
|
let newArgs = {};
|
|
|
let string = '';
|
|
|
|
|
|
keys.forEach((key) => {
|
|
|
newArgs[key] = params[key];
|
|
|
string += '&' + key + '=' + params[key];
|
|
|
});
|
|
|
|
|
|
let string = '';
|
|
|
|
|
|
for (let k of newArgs) {
|
|
|
string += '&' + k + '=' + newArgs[k];
|
|
|
}
|
|
|
string = string.substr(1);
|
|
|
return string;
|
|
|
}
|
|
|
|
|
|
function AlipayStrategy(options) {
|
|
|
Strategy.call(this);
|
|
|
function AlipayStrategy(options, verify) {
|
|
|
if (typeof options === 'function') {
|
|
|
verify = options;
|
|
|
options = {};
|
|
|
}
|
|
|
options = options || {};
|
|
|
passport.Strategy.call(this);
|
|
|
this.name = 'alipay';
|
|
|
this._passReqToCallback = options.passReqToCallback;
|
|
|
this._verify = verify;
|
|
|
this._options = options;
|
|
|
}
|
|
|
|
|
|
util.inherits(AlipayStrategy, Strategy);
|
|
|
util.inherits(AlipayStrategy, passport.Strategy);
|
|
|
|
|
|
AlipayStrategy.prototype.authenticate = (req, options) => {
|
|
|
if (req.query && req.query.is_success && req.query.sign && req.query.sign_type) {
|
|
|
|
|
|
// sign check
|
|
|
AlipayStrategy.prototype.authenticate = function(req, options) {
|
|
|
|
|
|
if (req.query && req.query.is_success && req.query.sign && req.query.sign_type) {
|
|
|
let query = req.query;
|
|
|
let sign = query.sign;
|
|
|
let signType = query.sign_type;
|
|
|
|
|
|
delete query.sign_type;
|
|
|
delete query.sign;
|
|
|
let signString = paramsToRaw(query) + options.key;
|
|
|
let signString = paramsToRaw(query) + this._options.key;
|
|
|
|
|
|
if (signType === 'MD5' && sign !== md5(signString)) {
|
|
|
this.error('alipay callback sign check fail');
|
|
|
this.fail('alipay callback sign check fail');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (req.query.is_success === 'T') {
|
|
|
let user = {
|
|
|
userId: req.query.user_id,
|
|
|
realName: req.query.realName,
|
|
|
realName: req.query.real_name,
|
|
|
email: req.query.email
|
|
|
};
|
|
|
|
...
|
...
|
@@ -85,20 +83,24 @@ AlipayStrategy.prototype.authenticate = (req, options) => { |
|
|
this.fail(req.error_code);
|
|
|
}
|
|
|
} else {
|
|
|
let params = _.extends(defaultOptions, options);
|
|
|
let params = _.assign(defaultOptions, this._options, options);
|
|
|
let signType = params.sign_type;
|
|
|
let key = params.key;
|
|
|
|
|
|
delete params.sign_type;
|
|
|
delete params.sign;
|
|
|
let signString = paramsToRaw(params) + options.key;
|
|
|
delete params.key;
|
|
|
let signString = paramsToRaw(params) + key;
|
|
|
|
|
|
if (signType === 'MD5') {
|
|
|
params.sign = md5(signString);
|
|
|
params.sign_type = 'MD5';
|
|
|
}
|
|
|
|
|
|
this.redirect(ALIPAY_URL + '?' + paramsToRaw(params));
|
|
|
}
|
|
|
};
|
|
|
|
|
|
module.exports.Strategy = AlipayStrategy; |
|
|
exports = module.exports = AlipayStrategy;
|
|
|
|
|
|
exports.Strategy = AlipayStrategy;
|
|
|
|
...
|
...
|
|