Authored by 郝肖肖

银联支付

... ... @@ -82,7 +82,7 @@ const toPay = (req, res, next) => {
PayData.orderDetail(uid, orderCode).then(result => {
if (result && result.data) {
return PayHelpers.pay(user, result.data, payType, req.protocol);
return PayHelpers.pay(Object.assign({IP: req.id}, user), result.data, payType, req.protocol);
} else {
return {
code: 400,
... ...
/**
* Handlebars helpers
* dongjinhu jinhu.dong@yoho.cn
* 2016-07-14
*/
'use strict';
/**
* 乘法
* @param {[Number]} num1
* @param {[Number]} num2
* @return {[boolen]}
*/
exports.multiple = (num1, num2) => {
num1 = typeof num1 === 'number' ? num1 : parseFloat(num1, 10);
num2 = typeof num2 === 'number' ? num2 : parseFloat(num2, 10);
if (num1 && num2) {
return num1 * num2;
}
};
/**
* 小于等于
* @param {[Number]} num1
* @param {[Number]} num2
* @param {[object]} options 上下文环境,一般不手动传
* @return {[boolen]}
*/
exports.lte = (num1, num2, options) => {
num1 = typeof num1 === 'number' ? num1 : parseFloat(num1, 10);
num2 = typeof num2 === 'number' ? num2 : parseFloat(num2, 10);
if (num1 <= num2) {
return options.fn(this);
}
return options.inverse(this);
};
/**
* 显示剩余库存
* @param {[Number]} leftNumber
* @return {[boolen]}
*/
exports.showStorage = (leftNumber) => {
leftNumber = +leftNumber;
if (leftNumber <= 3 && leftNumber >= 0) {
return '余量有限';
} else if (leftNumber < 0) {
return '库存不足';
}
};
... ... @@ -24,7 +24,6 @@ const Alibank = {
sign_id_ext: user.uid,
defaultbank: param.bankCode || ''
});
let params = {
service: 'create_direct_pay_by_user',
partner: payParams.merchant_id,
... ... @@ -40,9 +39,6 @@ const Alibank = {
seller_email: payParams.merchant_other_code,
extra_common_param: extraParam
};
// TODO 防钓鱼配置,参考php
let signStr = md5(sign.raw(params) + payParams.merchant_key);
let body = sign.rawUncode(params) + '&sign=' + signStr + '&sign_type=MD5';
... ... @@ -54,7 +50,7 @@ const Alibank = {
};
},
notify(data, param) {
let payParams = JSON.parse(param.payParams);
let payParams = JSON.parse(param.payParams || '{}');
let orderCode = parseInt(data.out_trade_no, 10);
let extraParam = data.extra_common_param && JSON.parse(data.extra_common_param) || {};
let bankName = payHelpersBank.getList()[extraParam.defaultbank] &&
... ... @@ -71,8 +67,6 @@ const Alibank = {
orderCode: orderCode,
payResult: data.trade_status === 'TRADE_SUCCESS' ? 200 : 400,
totalFee: data.total_fee,
resultMsg: data.notify_type,
payOrderCode: orderCode,
tradeNo: data.trade_no,
bankBillNo: data.bank_seq_no || ''
};
... ...
... ... @@ -37,9 +37,6 @@ const Alipay = {
seller_email: payParams.merchant_other_code,
extra_common_param: extraParam
};
// TODO 防钓鱼配置,参考php
let signStr = md5(sign.raw(params) + payParams.merchant_key);
let body = sign.rawUncode(params) + '&sign=' + signStr + '&sign_type=MD5';
... ... @@ -51,7 +48,7 @@ const Alipay = {
};
},
notify(data, param) {
let payParams = JSON.parse(param.payParams);
let payParams = JSON.parse(param.payParams || '{}');
let orderCode = parseInt(data.out_trade_no, 10);
logger.info(`Alipay notify, params = ${JSON.stringify(data)}`);
... ... @@ -65,8 +62,6 @@ const Alipay = {
orderCode: orderCode,
payResult: data.trade_status === 'TRADE_SUCCESS' ? 200 : 400,
totalFee: data.total_fee,
resultMsg: data.notify_type,
payOrderCode: orderCode,
tradeNo: data.trade_no,
bankBillNo: ''
};
... ...
/**
* @author: xiaoxiao.hao<xiaoxiao.hao@yoho.cn>
* @date: 2017/3/23
*/
'use strict';
const helpers = global.yoho.helpers;
const md5 = require('md5');
const PAY_URL = 'https://pay3.chinabank.com.cn/PayGate';
const Chinabank = {
pay(user, order, param, protocol) {
let payParams = JSON.parse(param.payParams);
let extraParam = JSON.stringify({
sign_id_ext: user.uid
});
let params = {
v_mid: payParams.merchant_id, // 商户号
v_oid: order.order_code, // 商户订单号
v_amount: order.payment_amount, // 总金额 以元为单位
v_moneytype: 'CNY', // 以人民币为单位
v_url: protocol + ':' + helpers.urlFormat('/shopping/pay/callback/chinabank'), // 同步地址
v_md5info: '', // 签名
remark1: extraParam
};
params.v_md5info = md5(
`${params.v_amount}${params.v_moneytype}${params.v_oid}` +
`${params.v_mid}${params.v_url}${payParams.merchant_key}`
).toUpperCase();
return {
code: 200,
data: Object.assign({reqType: PAY_URL}, params)
};
},
notify(data, param) {
let payParams = JSON.parse(param.payParams || '{}');
let orderCode = parseInt(data.v_oid, 10);
if (!this.checkResponse(data, payParams)) {
return {payResult: -1};
}
return {
bankName: '',
orderCode: orderCode,
payResult: 200,
totalFee: data.v_amount,
tradeNo: '',
bankBillNo: ''
};
},
// 验证验证
checkResponse(data, payParams) {
let signText;
if (parseInt(data.v_pstatus, 10) !== 20) {
return false;
}
signText = md5(
`${data.v_oid}${data.v_pstatus}${data.v_amount}${data.v_moneytype}${payParams.merchant_key}`
).toUpperCase();
return data.v_md5str === signText;
}
};
module.exports = Chinabank;
... ...
... ... @@ -18,8 +18,7 @@ const Tenpay = {
pay(user, order, param, protocol) {
let payParams = JSON.parse(param.payParams);
let extraParam = JSON.stringify({
sign_id_ext: user.uid,
defaultbank: param.bankCode || ''
sign_id_ext: user.uid
});
let params = {
partner: payParams.merchant_id, // 商户号
... ... @@ -29,7 +28,7 @@ const Tenpay = {
notify_url: protocol + ':' + helpers.urlFormat('/shopping/pay/notify/tenpay'), // 异步通知地址
body: '有货订单号:' + order.order_code, // 商品描述
bank_type: 'DEFAULT', // 银行类型,默认为财付通
spbill_create_ip: '127.0.0.1', // 客户端IP
spbill_create_ip: user.IP, // 客户端IP
fee_type: '1', // 币种
subject: '有货订单号:' + order.order_code, // 商品名称,(中介交易时必填)
sign_type: 'MD5',
... ... @@ -41,7 +40,7 @@ const Tenpay = {
attach: extraParam // 附加数据,原样返回
};
let signStr = md5(sign.raw(params) + '&key=' + payParams.merchant_key).toLowerCase();
let signStr = md5(sign.raw(params) + '&key=' + payParams.merchant_key).toLocaleUpperCase();
let body = sign.rawUncode(params) + '&sign=' + signStr;
return {
... ... @@ -52,7 +51,7 @@ const Tenpay = {
};
},
notify(data, param) {
let payParams = JSON.parse(param.payParams);
let payParams = JSON.parse(param.payParams || '{}');
let orderCode = parseInt(data.out_trade_no, 10);
logger.info(`Alipay notify, params = ${JSON.stringify(data)}`);
... ... @@ -64,23 +63,26 @@ const Tenpay = {
return {
bankName: '',
orderCode: orderCode,
payResult: data.trade_status === 'TRADE_SUCCESS' ? 200 : 400,
totalFee: data.total_fee,
resultMsg: data.notify_type,
payOrderCode: orderCode,
tradeNo: data.trade_no,
payResult: 200,
totalFee: data.total_fee * 0.01,
tradeNo: '',
bankBillNo: ''
};
},
checkNotify(data, payParams) {
let signValue = data.sign;
let signValue;
if (data && parseInt(data.trade_state, 10) !== 0) {
return false;
}
signValue = data.sign;
delete data.sign;
delete data.sign_type;
delete data.code;
let signStr = md5(sign.raw(data) + payParams.merchant_key);
let signStr = md5(sign.raw(data) + payParams.merchant_key).toLocaleUpperCase();
console.log(signValue, signStr, ' ==2222222222= ');
return signValue === signStr;
}
... ...
... ... @@ -6,10 +6,9 @@
const ServiceAPI = global.yoho.ServiceAPI;
const helpers = global.yoho.helpers;
const sign = require('./sign');
const PAY_URL = 'https://gateway.95516.com/gateway/api/frontTransReq.do?';
const PAY_URL = 'https://gateway.95516.com/gateway/api/frontTransReq.do';
const unionpay = {
const Unionpay = {
pay(user, order, info) {
return ServiceAPI.get('payment/unionpay_data', {
order_code: order.order_code,
... ... @@ -19,10 +18,8 @@ const unionpay = {
}).then(result => {
if (result && result.code === 200 && result.data) {
return {
code: 200,
data: {
href: `${PAY_URL}${sign.raw(result.data)}`
}
code: 200, // reqType是post方式,默认
data: Object.assign({reqType: PAY_URL}, result.data)
};
}
... ... @@ -32,8 +29,7 @@ const unionpay = {
};
});
},
notify(data, param) {
let payParams = JSON.parse(param.payParams);
notify(data) {
let orderCode = parseInt(data.orderId, 10);
// https://open.unionpay.com/ajweb/help/faq/list?id=234&level=0&from=0
... ... @@ -46,12 +42,10 @@ const unionpay = {
orderCode: orderCode,
payResult: 200,
totalFee: data.txnAmt * 0.01,
resultMsg: data.notify_type,
payOrderCode: orderCode,
tradeNo: data.queryId,
bankBillNo: ''
};
}
};
module.exports = unionpay;
module.exports = Unionpay;
... ...
... ... @@ -7,13 +7,14 @@
'use strict';
const Promise = require('bluebird');
const PayData = require('../models/pay');
const Alipay = require('./pay/alipay');
const Alibank = require('./pay/alibank');
const Wechat = require('./pay/wechat');
const Tenpay = require('./pay/tenpay');
const Unionpay = require('./pay/unionpay');
const Promise = require('bluebird');
const Alibank = require('./pay/alibank');
const Tenpay = require('./pay/tenpay');
const Chinabank = require('./pay/chinabank');
const common = require('./pay/common');
const co = Promise.coroutine;
const logger = global.yoho.logger;
... ... @@ -74,6 +75,9 @@ const Payment = {
case PayData.payments.tenpay:
result = Tenpay.pay(user, order, payInfo, protocol);
break;
case PayData.payments.chinabank:
result = Chinabank.pay(user, order, payInfo, protocol);
break;
case PayData.payments.alibank:
bankCode = paymentPars[1];
payInfo.bankCode = bankCode;// 设置默认银行
... ... @@ -140,7 +144,11 @@ const Payment = {
} else if (payId === PayData.payments.alibank) {
payResult = Alibank.notify(query, payInfo);
} else if (payId === PayData.payments.unionpay) {
payResult = Unionpay.notify(query, payInfo);
payResult = Unionpay.notify(query);
} else if (payId === PayData.payments.tenpay) {
payResult = Tenpay.notify(query, payInfo);
} else if (payId === PayData.payments.chinabank) {
payResult = Chinabank.notify(query, payInfo);
}
payResult.bankName = payName = (payResult.bankName || payInfo.payName || '');
... ...
/**
* 订单支付
* @author: jiangfeng<jeff.jiang@yoho.cn>
* @author: xiaoxiao.hao<xiaoxiao.hao@yoho.cn>
* @date: 2016/07/18
*/
... ... @@ -14,6 +14,8 @@ const logger = global.yoho.logger;
const _ = require('lodash');
const helpers = global.yoho.helpers;
const FRAUD_CONTENT_CODE = '78d0fb6c97d691863286edcb4d8abfa9';
// chinabank、tenpay 未完成,差异步回调地址和签名验证及订单状态更改
const payments = {
alipay: 2, // 支付宝
wechat: 21, // 微信支付
... ...
... ... @@ -20,5 +20,6 @@ router.post('/pay/sendPayConfirm', auth, pay.sendPayConfirm);
// 支付回调
router.get('/pay/callback/:type', auth, pay.callback);
router.post('/pay/callback/:type', auth, pay.callback);// 银联是post方式返回的
module.exports = router;
... ...
... ... @@ -97,23 +97,31 @@ payPage = {
return new Alert(d.message).show();
}
if (!d.data.href) {
return new Alert('订单信息获取失败!').show();
}
$lightBox.show();
if (payType === '25_platform') {
$formGo.attr('action', d.data.href);
d = d.data;
if (d.reqType) {
$lightBox.show();
$formGo.attr('action', d.reqType);
$.each(d, function(key, val) {
if (key === 'reqType') {
return true;
}
$formGo.append('<input type="text" name="' + key + '" value="' + val + '" />');
});
$formGo.submit();
setTimeout(function() {
$formGo.attr('action', '');
$formGo.html('');
}, 10);
return true;
} else if (!d.href) {
return new Alert('订单信息获取失败!').show();
}
$lightBox.show();
$open = window.open();
$open.location = d.data.href;
$open.location = d.href;
},
error: function() {
$this.data('use', false);
... ...