Authored by 郝肖肖

财付通支付 签名

@@ -14,7 +14,7 @@ const payHelpersBank = require('../bank'); @@ -14,7 +14,7 @@ const payHelpersBank = require('../bank');
14 const md5 = require('md5'); 14 const md5 = require('md5');
15 const logger = global.yoho.logger; 15 const logger = global.yoho.logger;
16 16
17 -const PAY_URL = 'https://mapi.alipay.com/gateway.do'; 17 +const PAY_URL = 'https://mapi.alipay.com/gateway.do?';
18 18
19 const Alibank = { 19 const Alibank = {
20 20
@@ -49,7 +49,7 @@ const Alibank = { @@ -49,7 +49,7 @@ const Alibank = {
49 return { 49 return {
50 code: 200, 50 code: 200,
51 data: { 51 data: {
52 - href: PAY_URL + '?' + body 52 + href: PAY_URL + body
53 } 53 }
54 }; 54 };
55 }, 55 },
@@ -13,7 +13,7 @@ const sign = require('./sign'); @@ -13,7 +13,7 @@ const sign = require('./sign');
13 const md5 = require('md5'); 13 const md5 = require('md5');
14 const logger = global.yoho.logger; 14 const logger = global.yoho.logger;
15 15
16 -const PAY_URL = 'https://mapi.alipay.com/gateway.do'; 16 +const PAY_URL = 'https://mapi.alipay.com/gateway.do?';
17 17
18 const Alipay = { 18 const Alipay = {
19 19
@@ -46,7 +46,7 @@ const Alipay = { @@ -46,7 +46,7 @@ const Alipay = {
46 return { 46 return {
47 code: 200, 47 code: 200,
48 data: { 48 data: {
49 - href: PAY_URL + '?' + body 49 + href: PAY_URL + body
50 } 50 }
51 }; 51 };
52 }, 52 },
  1 +/**
  2 + *
  3 + * @author: xiaoxiao.hao<xiaoxiao.hao>
  4 + * @date: 2017/3/24
  5 + */
  6 +
  7 +'use strict';
  8 +
  9 +const helpers = global.yoho.helpers;
  10 +const moment = require('moment');
  11 +const sign = require('./sign');
  12 +const md5 = require('md5');
  13 +const logger = global.yoho.logger;
  14 +const PAY_URL = 'https://gw.tenpay.com/gateway/pay.htm?';
  15 +
  16 +const Tenpay = {
  17 +
  18 + pay(user, order, param, protocol) {
  19 + let payParams = JSON.parse(param.payParams);
  20 + let extraParam = JSON.stringify({
  21 + sign_id_ext: user.uid,
  22 + defaultbank: param.bankCode || ''
  23 + });
  24 + let params = {
  25 + partner: payParams.merchant_id, // 商户号
  26 + out_trade_no: order.order_code, // 商户订单号
  27 + total_fee: order.payment_amount * 100, // 总金额 以分为单位
  28 + return_url: protocol + ':' + helpers.urlFormat('/shopping/pay/callback/tenpay'), // 同步地址
  29 + notify_url: protocol + ':' + helpers.urlFormat('/shopping/pay/notify/tenpay'), // 异步通知地址
  30 + body: '有货订单号:' + order.order_code, // 商品描述
  31 + bank_type: 'DEFAULT', // 银行类型,默认为财付通
  32 + spbill_create_ip: '127.0.0.1', // 客户端IP
  33 + fee_type: '1', // 币种
  34 + subject: '有货订单号:' + order.order_code, // 商品名称,(中介交易时必填)
  35 + sign_type: 'MD5',
  36 + service_version: '1.0', // 接口版本号
  37 + input_charset: 'UTF-8', // 字符集
  38 + sign_key_index: '1', // 密钥序号
  39 + time_start: moment(order.create_time * 1000).format('YYYYMMDDHHmmss'), // 订单生成时间-yyyymmddhhmmss
  40 + time_expire: moment(order.pay_expire).format('YYYYMMDDHHmmss'), // 订单失效时间--yyyymmddhhmmss
  41 + attach: extraParam // 附加数据,原样返回
  42 + };
  43 +
  44 + let signStr = md5(sign.raw(params) + '&key=' + payParams.merchant_key).toLowerCase();
  45 + let body = sign.rawUncode(params) + '&sign=' + signStr;
  46 +
  47 + return {
  48 + code: 200,
  49 + data: {
  50 + href: PAY_URL + body
  51 + }
  52 + };
  53 + },
  54 + notify(data, param) {
  55 + let payParams = JSON.parse(param.payParams);
  56 + let orderCode = parseInt(data.out_trade_no, 10);
  57 +
  58 + logger.info(`Alipay notify, params = ${JSON.stringify(data)}`);
  59 +
  60 + if (!this.checkNotify(data, payParams)) {
  61 + return {payResult: -1};
  62 + }
  63 +
  64 + return {
  65 + bankName: '',
  66 + orderCode: orderCode,
  67 + payResult: data.trade_status === 'TRADE_SUCCESS' ? 200 : 400,
  68 + totalFee: data.total_fee,
  69 + resultMsg: data.notify_type,
  70 + payOrderCode: orderCode,
  71 + tradeNo: data.trade_no,
  72 + bankBillNo: ''
  73 + };
  74 + },
  75 +
  76 + checkNotify(data, payParams) {
  77 + let signValue = data.sign;
  78 +
  79 + delete data.sign;
  80 + delete data.sign_type;
  81 + delete data.code;
  82 +
  83 + let signStr = md5(sign.raw(data) + payParams.merchant_key);
  84 +
  85 + return signValue === signStr;
  86 + }
  87 +};
  88 +
  89 +module.exports = Tenpay;
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 const ServiceAPI = global.yoho.ServiceAPI; 7 const ServiceAPI = global.yoho.ServiceAPI;
8 const helpers = global.yoho.helpers; 8 const helpers = global.yoho.helpers;
9 const sign = require('./sign'); 9 const sign = require('./sign');
10 -const PAY_URL = 'https://gateway.95516.com/gateway/api/frontTransReq.do'; 10 +const PAY_URL = 'https://gateway.95516.com/gateway/api/frontTransReq.do?';
11 11
12 const unionpay = { 12 const unionpay = {
13 pay(user, order, info) { 13 pay(user, order, info) {
@@ -21,7 +21,7 @@ const unionpay = { @@ -21,7 +21,7 @@ const unionpay = {
21 return { 21 return {
22 code: 200, 22 code: 200,
23 data: { 23 data: {
24 - href: `${PAY_URL}?${sign.raw(result.data)}` 24 + href: `${PAY_URL}${sign.raw(result.data)}`
25 } 25 }
26 }; 26 };
27 } 27 }
@@ -11,6 +11,7 @@ const PayData = require('../models/pay'); @@ -11,6 +11,7 @@ const PayData = require('../models/pay');
11 const Alipay = require('./pay/alipay'); 11 const Alipay = require('./pay/alipay');
12 const Alibank = require('./pay/alibank'); 12 const Alibank = require('./pay/alibank');
13 const Wechat = require('./pay/wechat'); 13 const Wechat = require('./pay/wechat');
  14 +const Tenpay = require('./pay/tenpay');
14 const Unionpay = require('./pay/unionpay'); 15 const Unionpay = require('./pay/unionpay');
15 const Promise = require('bluebird'); 16 const Promise = require('bluebird');
16 const common = require('./pay/common'); 17 const common = require('./pay/common');
@@ -70,6 +71,9 @@ const Payment = { @@ -70,6 +71,9 @@ const Payment = {
70 case PayData.payments.alipay: 71 case PayData.payments.alipay:
71 result = Alipay.pay(user, order, payInfo, protocol); 72 result = Alipay.pay(user, order, payInfo, protocol);
72 break; 73 break;
  74 + case PayData.payments.tenpay:
  75 + result = Tenpay.pay(user, order, payInfo, protocol);
  76 + break;
73 case PayData.payments.alibank: 77 case PayData.payments.alibank:
74 bankCode = paymentPars[1]; 78 bankCode = paymentPars[1];
75 payInfo.bankCode = bankCode;// 设置默认银行 79 payInfo.bankCode = bankCode;// 设置默认银行
@@ -151,44 +151,46 @@ const getPayInfo = (uid, code) => { @@ -151,44 +151,46 @@ const getPayInfo = (uid, code) => {
151 payDefault = payment[0][0].children[findIndex]; 151 payDefault = payment[0][0].children[findIndex];
152 } 152 }
153 153
154 - // 订单处理  
155 - if (orderInfo.attribute === 3) {  
156 - orderInfo.deliveryTimes = '自动发货 - 在您支付成功后,系统将立即为您发放二维码,您可以在您的订单中查看。';  
157 - } else {  
158 - orderInfo.deliveryTimes = orderInfo.delivery_time || '';  
159 - } 154 + if (orderInfo.order_code) {
  155 + // 订单处理
  156 + if (orderInfo.attribute === 3) {
  157 + orderInfo.deliveryTimes = '自动发货 - 在您支付成功后,系统将立即为您发放二维码,您可以在您的订单中查看。';
  158 + } else {
  159 + orderInfo.deliveryTimes = orderInfo.delivery_time || '';
  160 + }
160 161
161 - // 用于订单统计  
162 - orderInfo.uid = uid;  
163 - orderInfo.orderCount = 0;  
164 - if (payment[3].code === 200 && payment[3].data) {  
165 - orderInfo.orderCount = payment[3].data.count || 0;  
166 - }  
167 - orderInfo.isOldUser = orderInfo.orderCount > 1;  
168 - orderInfo.ordersGoodsNums = orderInfo.order_goods.length;  
169 - let sknList = [];  
170 - let skuList = [];  
171 - let goodsData = [];  
172 - let pinyouGoodsArr = [];  
173 -  
174 - _.each(orderInfo.order_goods, function(el) {  
175 - sknList.push(el.product_skn);  
176 - skuList.push(el.product_sku);  
177 - goodsData.push({  
178 - goods_name: el.product_name,  
179 - product_sku: el.product_sku,  
180 - price: el.goods_price,  
181 - number: el.buy_number 162 + // 用于订单统计
  163 + orderInfo.uid = uid;
  164 + orderInfo.orderCount = 0;
  165 + if (payment[3].code === 200 && payment[3].data) {
  166 + orderInfo.orderCount = payment[3].data.count || 0;
  167 + }
  168 + orderInfo.isOldUser = orderInfo.orderCount > 1;
  169 + orderInfo.ordersGoodsNums = orderInfo.order_goods.length;
  170 + let sknList = [];
  171 + let skuList = [];
  172 + let goodsData = [];
  173 + let pinyouGoodsArr = [];
  174 +
  175 + _.each(orderInfo.order_goods, function(el) {
  176 + sknList.push(el.product_skn);
  177 + skuList.push(el.product_sku);
  178 + goodsData.push({
  179 + goods_name: el.product_name,
  180 + product_sku: el.product_sku,
  181 + price: el.goods_price,
  182 + number: el.buy_number
  183 + });
  184 + pinyouGoodsArr.push(`${el.product_skn},${el.buy_number}`);
182 }); 185 });
183 - pinyouGoodsArr.push(`${el.product_skn},${el.buy_number}`);  
184 - });  
185 - orderInfo.sknList = sknList;  
186 - orderInfo.skuList = skuList;  
187 - orderInfo.goodsData = goodsData;  
188 - orderInfo.goodsDatas = JSON.stringify(goodsData); 186 + orderInfo.sknList = sknList;
  187 + orderInfo.skuList = skuList;
  188 + orderInfo.goodsData = goodsData;
  189 + orderInfo.goodsDatas = JSON.stringify(goodsData);
189 190
190 - // 品友统计需要的商品数据  
191 - orderInfo.pinyouGoods = pinyouGoodsArr.join(';'); 191 + // 品友统计需要的商品数据
  192 + orderInfo.pinyouGoods = pinyouGoodsArr.join(';');
  193 + }
192 194
193 return { 195 return {
194 pay: payment[0], 196 pay: payment[0],