Authored by 郭成尧

wechat-pay-asyn

/**
/*
* 支付
* @author: jing.li<jing.li@yoho.cn>
* @date: 2016/10/25
* @Author: Targaryen
* @Date: 2017-01-04 15:17:51
* @Last Modified by: Targaryen
* @Last Modified time: 2017-01-04 17:59:37
*/
'use strict';
... ... @@ -94,6 +96,7 @@ const goAlipay = (req, res, next) => {
let uid = req.user.uid;
let sessionKey = req.session.TOKEN;
let payment = req.query.payment;
let openId = req.session['weixinOpenId' . orderCode];
if (!orderCode || !uid || !sessionKey) {
res.redirect('/');
... ... @@ -122,7 +125,10 @@ const goAlipay = (req, res, next) => {
}).redirect(url);
}
Payment.pay(user, orderDetail.data, payment, req.protocol).then(result => {
Payment.pay(user, orderDetail.data, payment, {
protocol: req.protocol,
openId: openId
}).then(result => {
if (result && result.data && result.data.href) {
res.redirect(result.data.href);
} else {
... ...
... ... @@ -2,7 +2,7 @@
* @Author: Targaryen
* @Date: 2017-01-03 17:42:41
* @Last Modified by: Targaryen
* @Last Modified time: 2017-01-04 14:54:47
* @Last Modified time: 2017-01-04 18:19:06
*/
'use strict';
... ... @@ -12,6 +12,7 @@ const _ = require('lodash');
const logger = global.yoho.logger;
const rp = require('request-promise');
const Promise = require('bluebird');
const co = Promise.coroutine;
/**
* 微信支付相关工具类
... ... @@ -36,6 +37,23 @@ const tools = {
},
/**
* 生成指定长度的随机字符串
*/
createRandomString(len) {
let strlen = len || 32;
let originString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let resultString = '';
for (let i = 0; i < strlen; i++) {
let position = parseInt(100 * Math.random(), 0) % 62;
resultString += originString.slice(position - 1, position);
}
return resultString;
},
/**
* 构造获取code的url连接
*/
createOauthUrlForCode(redirectUrl) {
... ... @@ -88,22 +106,72 @@ const tools = {
}).catch(err => {
logger.error(err);
});
},
/**
* 微信统一下单接口
*/
unifiedOrder(params) {
let unifiedParams = {
appid: WxPayConfig.APPID,
mch_id: WxPayConfig.MCHID,
device_info: 'WEB',
nonce_str: tools.createRandomString(),
body: '有货订单号:' + params.orderCode,
out_trade_no: 'YOHOBuy_' + params.orderCode,
total_fee: params.totalFee,
trade_type: 'JSAPI',
openid: params.openId,
sign: '', // TODO 签名算法
sign_type: 'MD5',
};
}
};
// TODO 微信支付
const Wechat = {
/**
* 支付中心微信支付相关处理
*/
getOpenid(code, originalUrl) {
if (!code) {
let baseUrl = 'http://m.yohobuy.com' + originalUrl;
let redirectUrl = tools.createOauthUrlForCode(baseUrl);
return Promise.resolve({redirectUrl: redirectUrl});
return Promise.resolve({ redirectUrl: redirectUrl });
} else {
return tools.getOpenidFromMp(code).then(openid => {
return {openid: openid};
return { openid: openid };
});
}
},
/**
* 异步拉起微信支付相关处理
*/
pay(user, order, openId) {
co(function* () {
let unifiedOrderResult = yield tools.unifiedorder({
orderCode: order.order_code,
totalFee: parseFloat(order.payment_amount),
openId: openId
});
if (unifiedOrderResult) {
let nonceStr = tools.createRandomString();
return {
appId: unifiedOrderResult.appid,
timeStamp: Date.parse(new Date()),
nonceStr: nonceStr,
package: 'prepay_id=' + unifiedOrderResult.prepay_id,
signType: 'MD5',
paySign: '' // TODO 签名算法
};
} else {
return {};
}
})();
}
};
... ...
... ... @@ -16,7 +16,12 @@ const co = Promise.coroutine;
const logger = global.yoho.logger;
const Payment = {
pay(user, order, payType, protocol) {
/**
* 统一支付入口
* reqParams: 需要从 controller 传递的参数,支付宝需要 req.protocol,微信需要 openId
*/
pay(user, order, payType, reqParams) {
return co(function*() {
let result = {
code: 400,
... ... @@ -48,8 +53,7 @@ const Payment = {
let method = paymentPars[0] * 1;
if (method === PayModel.payments.wechat) {
// 如果是微信支付,不需要调用获取支付方式详情接口
result = yield Wechat.pay(user, order, { id: PayModel.payments.wechat });
result = yield Wechat.pay(user, order);
} else {
payInfo = yield PayModel.getPaymentInfo(method);
... ... @@ -59,12 +63,12 @@ const Payment = {
switch (payInfo.id) {
case PayModel.payments.alipay:
result = Alipay.pay(user, order, payInfo, protocol);
result = Alipay.pay(user, order, payInfo, reqParams.protocol);
break;
case PayModel.payments.alibank:
bankCode = paymentPars[1];
payInfo.bankCode = bankCode; // 设置默认银行
result = Alibank.pay(user, order, payInfo, protocol);
result = Alibank.pay(user, order, payInfo, reqParams.protocol);
break;
default:
break;
... ...
... ... @@ -27,10 +27,7 @@ const payments = {
const _getBanner = (param) => {
return serviceAPI.get('operations/api/v5/resource/get', {
content_code: param.contentCode
}, {
code: 200
}).then((result) => {
}, { code: 200 }).then((result) => {
result = result.data;
return result;
... ... @@ -46,10 +43,7 @@ const _getOthersBuy2 = (param) => {
rec_pos: '100005',
limit: 2,
client_id: param.client_id
}, {
code: 200
}).then((result) => {
}, { code: 200 }).then((result) => {
if (result && result.data && result.data.product_list) {
return productProcess.processProductList(result.data.product_list);
}
... ... @@ -64,12 +58,8 @@ const _getOtherDetail = (param) => {
uid: param.uid,
order_code: param.orderCode,
session_key: param.sessionKey
}, {
code: 200
}).then((result) => {
}, { code: 200 }).then(result => {
return result;
});
};
... ... @@ -98,7 +88,7 @@ const _getOthersBuy = (param) => {
* @param id
*/
const getBankByOrder = (id) => {
return co(function*() {
return co(function* () {
let result = yield payApi.getBankByOrder(id);
if (result && result.code === 200 && result.data) {
... ... @@ -115,7 +105,7 @@ const getBankByOrder = (id) => {
* @param bankCode
*/
const setOrderPayBank = (code, payment, bankCode) => {
return co(function*() {
return co(function* () {
let data = yield payApi.setOrderPayBank(code, payment, bankCode);
return data;
... ... @@ -127,7 +117,7 @@ const setOrderPayBank = (code, payment, bankCode) => {
* @param id
*/
const getPaymentInfo = (id) => {
return co(function*() {
return co(function* () {
let result = yield payApi.getPaymentInfo(id);
if (result && result.code === 200 && result.data) {
... ... @@ -144,7 +134,7 @@ const getPaymentInfo = (id) => {
* @param uid
*/
const sendPayConfirm = (code, payment, uid) => {
return co(function*() {
return co(function* () {
let data = yield payApi.sendPayConfirm(code, payment, uid);
return data;
... ... @@ -174,7 +164,7 @@ const updateOrderPayment = (code, payment, uid) => {
* @param bankCode
*/
const updateOrderPayBank = (code, payment, bankCode) => {
return co(function*() {
return co(function* () {
let data = yield payApi.updateOrderPayBank(code, payment, bankCode);
return data;
... ... @@ -188,7 +178,7 @@ const updateOrderPayBank = (code, payment, bankCode) => {
* @param sessionKey
*/
const procOrderData = (payResult, uid, sessionKey) => {
return co(function*() {
return co(function* () {
let orderCode = payResult.orderCode;
let result = { code: 400, message: '' };
... ...
... ... @@ -110,6 +110,7 @@ module.exports = {
},
WxPayConfig: {
APPID: 'wx75e5a7c0c88e45c2',
MCHID: '1227694201',
APPSECRET: 'ce21ae4a3f93852279175a167e54509b'
}
};
... ...
... ... @@ -88,9 +88,10 @@ function callpay(orderCode) {
} else {
$.ajax({
type: 'GET',
url: '/shopping/pay/wechatwapapi',
url: '/cart/index/new/pay/goalipay',
data: {
order_code: orderCode
order_code: orderCode,
payment: '22_platform',
},
dataType: 'json',
success: function(res) {
... ...