oak-pay-business/es/utils/pay.js

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;
}