101 lines
2.7 KiB
JavaScript
101 lines
2.7 KiB
JavaScript
import { getPayClazz } from './payClazz';
|
|
import assert from 'assert';
|
|
import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid';
|
|
import { PAY_CHANNEL_ACCOUNT_NAME, PAY_WECHAT_CHANNELS } from '../types/PayConfig';
|
|
export const fullPayProjection = {
|
|
id: 1,
|
|
applicationId: 1,
|
|
price: 1,
|
|
meta: 1,
|
|
iState: 1,
|
|
channel: 1,
|
|
paid: 1,
|
|
refunded: 1,
|
|
timeoutAt: 1,
|
|
forbidRefundAt: 1,
|
|
orderId: 1,
|
|
order: {
|
|
id: 1,
|
|
title: 1,
|
|
desc: 1,
|
|
},
|
|
accountId: 1,
|
|
};
|
|
export async function payNotify(context, body, payId, headers) {
|
|
const [pay] = await context.select('pay', {
|
|
data: {
|
|
id: 1,
|
|
price: 1,
|
|
iState: 1,
|
|
channel: 1,
|
|
meta: 1,
|
|
applicationId: 1,
|
|
},
|
|
filter: {
|
|
id: payId,
|
|
}
|
|
}, {});
|
|
if (!pay) {
|
|
console.error('接受到无效的payId', payId);
|
|
return;
|
|
}
|
|
const { applicationId, channel, price } = pay;
|
|
const payClazz = await getPayClazz(applicationId, channel, context);
|
|
const { payId: payId2, iState, extra } = await payClazz.decodePayNotification({
|
|
headers,
|
|
}, body);
|
|
assert(payId2 === payId);
|
|
if (iState !== pay.iState) {
|
|
let action = 'close';
|
|
const updateData = {};
|
|
switch (iState) {
|
|
case 'closed': {
|
|
// action = 'close';
|
|
break;
|
|
}
|
|
case 'paid': {
|
|
action = 'succeedPaying';
|
|
updateData.paid = price;
|
|
if (extra) {
|
|
Object.assign(updateData, extra);
|
|
}
|
|
break;
|
|
}
|
|
default: {
|
|
assert(false);
|
|
}
|
|
}
|
|
await context.operate('pay', {
|
|
id: await generateNewIdAsync(),
|
|
action,
|
|
data: updateData,
|
|
filter: {
|
|
id: payId,
|
|
}
|
|
}, {});
|
|
}
|
|
return;
|
|
}
|
|
/**
|
|
* 计算充值的损耗比例
|
|
* @param context
|
|
* @param channel
|
|
* @param application
|
|
*/
|
|
export function getDepositRatio(channel, application) {
|
|
const { payConfig, system } = application;
|
|
const { payConfig: systemPayConfig } = system;
|
|
const accountConfig = systemPayConfig.find(ele => ele.channel === PAY_CHANNEL_ACCOUNT_NAME);
|
|
const { depositLoss, depositLossRatio } = accountConfig;
|
|
if (!depositLoss) {
|
|
return 0;
|
|
}
|
|
if (depositLossRatio) {
|
|
return depositLossRatio;
|
|
}
|
|
const config = systemPayConfig?.find(ele => ele.channel === channel) || payConfig?.find(ele => ele.channel === channel);
|
|
assert(config && PAY_WECHAT_CHANNELS.includes(channel));
|
|
const { lossRatio } = config;
|
|
return lossRatio || 0;
|
|
}
|