Authored by 郭成尧

pay-ctx

... ... @@ -6,74 +6,77 @@
'use strict';
const api = global.yoho.API;
const serviceAPI = global.yoho.ServiceAPI;
const utils = '../../../utils';
const productProcess = require(`${utils}/product-process`);
const ApipayConfig = global.yoho.config.alipayConfig;
const md5 = require('yoho-md5');
const payApi = require('./pay-api');
const helpers = global.yoho.helpers;
const payApiModel = require('./pay-api');
const _ = require('lodash');
const co = require('bluebird').coroutine;
const logger = global.yoho.logger;
const stringProcess = require(`${global.utils}/string-process`);
// 支付方式
const payments = {
alipay: 18,
wechat: 22
};
class payModel extends global.yoho.BaseModel {
constructor(ctx) {
super(ctx);
this.ctx = _.get(ctx, 'req.ctx');
}
// 资源位
const _getBanner = (param) => {
return serviceAPI.get('operations/api/v5/resource/get', {
// 资源位
_getBanner(param) {
return this.get({
api: serviceAPI,
url: 'operations/api/v5/resource/get',
data: {
content_code: param.contentCode,
platform: 'iphone'
}, { code: 200 }).then((result) => {
},
param: { code: 200 }
}).then((result) => {
result = result.data;
return result;
});
};
}
// 购买此商品的用户也购买了
const _getOthersBuy2 = (param) => {
return api.get('', {
// 购买此商品的用户也购买了
_getOthersBuy2(param) {
return this.get({data: {
method: 'app.recommend.purchased',
productSkn: param.skn,
udid: param.uid,
rec_pos: '100005',
limit: 2,
client_id: param.client_id
}, { code: 200 }).then((result) => {
}, param: { code: 200 }}).then((result) => {
if (result && result.data && result.data.product_list) {
return productProcess.processProductList(result.data.product_list);
}
});
};
}
// 订单信息
const _getOtherDetail = (param) => {
// 订单信息
getOtherDetail(param) {
if (!param.uid || !param.orderCode || !stringProcess.isNumeric(param.orderCode)) {
return Promise.resolve({});
}
return api.get('', {
return this.get({data: {
method: 'app.SpaceOrders.detail',
uid: param.uid,
order_code: param.orderCode,
session_key: param.sessionKey
}, { code: 200 }).then(result => {
}, param: { code: 200 }}).then(result => {
return result;
});
};
}
// 购买此商品的用户也购买了,要先从订单详情获取商品skn
const _getOthersBuy = (param) => {
return api.all([
_getOtherDetail(param)
// 购买此商品的用户也购买了,要先从订单详情获取商品skn
_getOthersBuy(param) {
return Promise.all([
this.getOtherDetail(param)
]).then((result) => {
let goodSkn = '';
... ... @@ -82,109 +85,121 @@ const _getOthersBuy = (param) => {
goodSkn = result[0].data.order_goods[0].product_skn;
}
return _getOthersBuy2(Object.assign(param, { skn: goodSkn }));
return this._getOthersBuy2(Object.assign(param, { skn: goodSkn }));
}).then((result) => {
return result;
});
};
}
/**
/**
* 获取订单支付银行信息
* @param id
*/
const getBankByOrder = (id) => {
getBankByOrder(id) {
let self = this;
return co(function* () {
let result = yield payApi.getBankByOrder(id);
let result = yield self.ctx(payApiModel).getBankByOrder(id);
if (result && result.code === 200 && result.data) {
return result.data;
}
return {};
})();
};
}
/**
/**
* 设置订单支付银行
* @param code
* @param payment
* @param bankCode
*/
const setOrderPayBank = (code, payment, bankCode) => {
setOrderPayBank(code, payment, bankCode) {
let self = this;
return co(function* () {
let data = yield payApi.setOrderPayBank(code, payment, bankCode);
let data = yield self.ctx(payApiModel).setOrderPayBank(code, payment, bankCode);
return data;
})();
};
}
/**
/**
* 获取支付方式的相关参数, (密钥等信息)
* @param id
*/
const getPaymentInfo = (id) => {
getPaymentInfo(id) {
let self = this;
return co(function* () {
let result = yield payApi.getPaymentInfo(id);
let result = yield self.ctx(payApiModel).getPaymentInfo(id);
if (result && result.code === 200 && result.data) {
return result.data;
}
return {};
})();
};
}
/**
/**
* 支付确认
* @param code
* @param payment
* @param uid
*/
const sendPayConfirm = (code, payment, uid) => {
sendPayConfirm(code, payment, uid) {
let self = this;
return co(function* () {
let data = yield payApi.sendPayConfirm(code, payment, uid);
let data = yield self.ctx(payApiModel).sendPayConfirm(code, payment, uid);
return data;
})();
};
}
/**
/**
* 更新订单支付方式
* @param code
* @param payment
* @param uid
* @returns {*}
*/
const updateOrderPayment = (code, payment, uid) => {
return api.get('', {
updateOrderPayment(code, payment, uid) {
return this.get({data: {
method: 'app.SpaceOrders.updateOrdersPaymentByCode',
order_code: code,
payment: payment,
uid: uid
});
};
}});
}
/**
/**
* 更新订单支付银行
* @param code
* @param payment
* @param bankCode
*/
const updateOrderPayBank = (code, payment, bankCode) => {
updateOrderPayBank(code, payment, bankCode) {
let self = this;
return co(function* () {
let data = yield payApi.updateOrderPayBank(code, payment, bankCode);
let data = yield self.ctx(payApiModel).updateOrderPayBank(code, payment, bankCode);
return data;
})();
};
}
/**
/**
* 支付成功,前端回调时,处理订单信息
* @param payResult
* @param uid
* @param sessionKey
*/
const procOrderData = (payResult, uid, sessionKey) => {
procOrderData(payResult, uid, sessionKey) {
let self = this;
return co(function* () {
let orderCode = payResult.orderCode;
let result = { code: 400, message: '' };
... ... @@ -193,7 +208,7 @@ const procOrderData = (payResult, uid, sessionKey) => {
result.message = '未查到订单信息,订单状态更新失败!';
return result;
} else {
let orderInfo = yield _getOtherDetail({
let orderInfo = yield self._getOtherDetail({
uid: uid,
orderCode: orderCode,
sessionKey: sessionKey
... ... @@ -206,7 +221,7 @@ const procOrderData = (payResult, uid, sessionKey) => {
if (order.is_cancel === 'Y') {
logger.warn('front pay success but order is cancel.', { payResult: payResult, order: order });
payApi.sendMessage(order.mobile, 'error_sms', '支付成功,但订单已取消,订单号为' + orderCode);
self.ctx(payApiModel).sendMessage(order.mobile, 'error_sms', '支付成功,但订单已取消,订单号为' + orderCode);
return { code: 417, message: '支付成功,但订单已取消,需联系客服!' };
}
... ... @@ -239,78 +254,29 @@ const procOrderData = (payResult, uid, sessionKey) => {
return result;
})();
};
/**
* 支付相关的数据处理函数
*/
const payTool = {
/**
* 支持的支付方式列表
* @returns {[*,*]}
*/
payAppInfo(orderCode) {
return [{
appIcon: '',
payLink: helpers.urlFormat('/cart/index/new/pay', {
payment: payments.alipay + '_platform',
order_code: orderCode
}),
appId: 'alipay',
app: '支付宝支付',
hint: '支付宝钱包支付',
subHint: '推荐支付宝用户使用'
}, {
appIcon: '',
payLink: '',
appId: 'weixin',
app: '微信支付',
hint: '推荐使用',
subHint: ''
}];
},
/**
* 计算购买商品总数量
* @param goodsArray
* @returns {number}
* @private
*/
calBuyNumCount(goodsArray) {
let buyNumCount = 0;
if (_.isArray(goodsArray)) {
_.forEach(goodsArray, value => {
buyNumCount = value.buy_number ? parseInt(value.buy_number, 10) : 0;
});
}
return buyNumCount;
}
};
/**
/**
* 支付中心
* @param params
*/
const payCenter = (params) => {
payCenter(params) {
return _getOtherDetail({
return this.getOtherDetail({
uid: params.uid,
orderCode: params.orderCode,
sessionKey: params.sessionKey
}).then(result => {
return _.get(result, 'data', {});
});
};
// 货到付款
const getPayCod = (param) => {
return api.all([
_getBanner(param),
_getOthersBuy(param),
_getOtherDetail(param)
}
// 货到付款
getPayCod(param) {
return Promise.all([
this._getBanner(param),
this._getOthersBuy(param),
this.getOtherDetail(param)
]).then((result) => {
let resu = {
... ... @@ -346,9 +312,9 @@ const getPayCod = (param) => {
return resu;
});
};
}
const _raw = (args) => {
_raw(args) {
let keys = Object.keys(args);
keys = keys.filter(k => {
... ... @@ -365,34 +331,33 @@ const _raw = (args) => {
return keys.map(k => {
return k + '=' + decodeURI(args[k]);
}).join('&');
};
}
/**
/**
* 验证返回结果的正确性
*/
const _checkResponse = (params) => {
_checkResponse(params) {
if (!params.sign) {
return false;
}
let rawResult = _raw(params);
let rawResult = this._raw(params);
let sign = rawResult + ApipayConfig.alipayKey;
let md5Result = md5(sign);
return md5Result === params.sign;
};
}
/**
/**
* 支付宝支付结果校验
*/
const alipayResultVerify = (params) => {
alipayResultVerify(params) {
let checkResult = {};
if (params.q) {
delete params.q;
}
if (!_checkResponse(params)) {
if (!this._checkResponse(params)) {
checkResult.payResult = false;
} else {
_.assign(checkResult, {
... ... @@ -409,14 +374,14 @@ const alipayResultVerify = (params) => {
}
return checkResult;
};
// 支付宝支付
const getPayAli = (param) => {
return api.all([
_getBanner(param),
_getOthersBuy(param),
_getOtherDetail(param)
}
// 支付宝支付
getPayAli(param) {
return Promise.all([
this._getBanner(param),
this._getOthersBuy(param),
this.getOtherDetail(param)
]).then((result) => {
let resu = {
... ... @@ -464,21 +429,7 @@ const getPayAli = (param) => {
return resu;
});
};
module.exports = {
payments,
getOtherDetail: _getOtherDetail,
updateOrderPayment,
updateOrderPayBank,
getBankByOrder,
getPaymentInfo,
setOrderPayBank,
sendPayConfirm,
procOrderData,
payCenter,
payTool,
getPayCod,
getPayAli,
alipayResultVerify
};
}
}
module.exports = payModel;
... ...