|
|
/**
|
|
|
*
|
|
|
* @author: xiaoxiao.hao<xiaoxiao.hao>
|
|
|
* @date: 2017/3/24
|
|
|
*/
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
const helpers = global.yoho.helpers;
|
|
|
const moment = require('moment');
|
|
|
const sign = require('./sign');
|
|
|
const md5 = require('md5');
|
|
|
const logger = global.yoho.logger;
|
|
|
const PAY_URL = 'https://gw.tenpay.com/gateway/pay.htm?';
|
|
|
|
|
|
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 || ''
|
|
|
});
|
|
|
let params = {
|
|
|
partner: payParams.merchant_id, // 商户号
|
|
|
out_trade_no: order.order_code, // 商户订单号
|
|
|
total_fee: order.payment_amount * 100, // 总金额 以分为单位
|
|
|
return_url: protocol + ':' + helpers.urlFormat('/shopping/pay/callback/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
|
|
|
fee_type: '1', // 币种
|
|
|
subject: '有货订单号:' + order.order_code, // 商品名称,(中介交易时必填)
|
|
|
sign_type: 'MD5',
|
|
|
service_version: '1.0', // 接口版本号
|
|
|
input_charset: 'UTF-8', // 字符集
|
|
|
sign_key_index: '1', // 密钥序号
|
|
|
time_start: moment(order.create_time * 1000).format('YYYYMMDDHHmmss'), // 订单生成时间-yyyymmddhhmmss
|
|
|
time_expire: moment(order.pay_expire).format('YYYYMMDDHHmmss'), // 订单失效时间--yyyymmddhhmmss
|
|
|
attach: extraParam // 附加数据,原样返回
|
|
|
};
|
|
|
|
|
|
let signStr = md5(sign.raw(params) + '&key=' + payParams.merchant_key).toLowerCase();
|
|
|
let body = sign.rawUncode(params) + '&sign=' + signStr;
|
|
|
|
|
|
return {
|
|
|
code: 200,
|
|
|
data: {
|
|
|
href: PAY_URL + body
|
|
|
}
|
|
|
};
|
|
|
},
|
|
|
notify(data, param) {
|
|
|
let payParams = JSON.parse(param.payParams);
|
|
|
let orderCode = parseInt(data.out_trade_no, 10);
|
|
|
|
|
|
logger.info(`Alipay notify, params = ${JSON.stringify(data)}`);
|
|
|
|
|
|
if (!this.checkNotify(data, payParams)) {
|
|
|
return {payResult: -1};
|
|
|
}
|
|
|
|
|
|
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,
|
|
|
bankBillNo: ''
|
|
|
};
|
|
|
},
|
|
|
|
|
|
checkNotify(data, payParams) {
|
|
|
let signValue = data.sign;
|
|
|
|
|
|
delete data.sign;
|
|
|
delete data.sign_type;
|
|
|
delete data.code;
|
|
|
|
|
|
let signStr = md5(sign.raw(data) + payParams.merchant_key);
|
|
|
|
|
|
return signValue === signStr;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
module.exports = Tenpay; |
...
|
...
|
|