koishi-plugin-pay-tool
Version:
适用于Koishi框架的易支付工具插件,支持订单创建、查询、退款、分配等功能
101 lines (100 loc) • 4.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.setupCallback = setupCallback;
const utils_1 = require("./utils");
const commands_1 = require("./commands");
function setupCallback(ctx, config, orderDb, logger) {
// 处理路由前缀,确保以/开始和结束
let routePrefix = config.callbackRoute;
if (!routePrefix.startsWith('/')) {
routePrefix = '/' + routePrefix;
}
if (!routePrefix.endsWith('/')) {
routePrefix = routePrefix + '/';
}
// 注册支付回调路由
ctx.server.get(routePrefix, async (koaCtx) => {
try {
const callbackData = koaCtx.request.query;
if (config.devMode) {
logger.info(`收到支付回调: ${JSON.stringify(callbackData)}`);
}
// 验证签名
if (!(0, utils_1.verifySign)(callbackData, config.merchantKey)) {
logger.error('支付回调签名验证失败');
koaCtx.status = 400;
koaCtx.body = 'fail';
return;
}
// 查询本地订单
const localOrder = await orderDb.getOrderByOutTradeNo(callbackData.out_trade_no);
if (!localOrder) {
logger.error(`未找到订单: ${callbackData.out_trade_no}`);
koaCtx.status = 404;
koaCtx.body = 'fail';
return;
}
// 验证订单金额
if (parseFloat(localOrder.amount) !== parseFloat(callbackData.money)) {
logger.error(`订单金额不匹配: 本地=${localOrder.amount}, 回调=${callbackData.money}`);
koaCtx.status = 400;
koaCtx.body = 'fail';
return;
}
// 处理支付状态
if (callbackData.trade_status === 'TRADE_SUCCESS') {
// 避免重复处理
if (localOrder.status === 'paid') {
logger.info(`订单 ${callbackData.out_trade_no} 已支付完成,收到回调通知但跳过处理`);
koaCtx.body = 'success';
return;
}
// 更新订单状态
await orderDb.updateOrderStatus(callbackData.out_trade_no, 'paid');
if (config.devMode) {
logger.info(`订单 ${callbackData.out_trade_no} 支付成功`);
}
// 构建支付成功消息 - 使用创建订单时的支付方式,而不是API返回的
const paymentTypeText = (0, utils_1.formatPaymentType)(localOrder.payment_type, config.paymentMethods);
const successMessages = [
`🎉 支付成功!`,
`📋 订单号: ${callbackData.out_trade_no}`,
`💰 支付金额: ¥${callbackData.money}`,
`💳 支付方式: ${paymentTypeText}`,
`⏰ 支付时间: ${new Date().toLocaleString('zh-CN')}`
];
// 如果订单有归属人,添加归属人信息
if (localOrder.customer_qq) {
successMessages.splice(4, 0, `👤 订单归属人: ${localOrder.customer_qq}`);
}
// 发送通知到原会话
try {
// 调试日志:对比订单数据
if (config.devMode) {
logger.info(`回调通知订单数据: guild_id=${localOrder.guild_id}, channel_id=${localOrder.channel_id}, user_id=${localOrder.user_id}`);
}
await (0, commands_1.sendPaymentSuccessNotification)(ctx, config, logger, localOrder, successMessages, "回调通知");
}
catch (error) {
// 内部错误 - 只在devMode下显示
if (config.devMode) {
logger.error(`发送支付成功通知失败: ${error?.message || '未知错误'}`);
}
}
koaCtx.body = 'success';
}
else {
logger.warn(`订单 ${callbackData.out_trade_no} 支付状态异常: ${callbackData.trade_status}`);
koaCtx.body = 'success'; // 即使状态异常也要返回success避免重复通知
}
}
catch (error) {
logger.error(`处理支付回调失败: ${error?.message || '未知错误'}`, error);
koaCtx.status = 500;
koaCtx.body = 'fail';
}
});
if (config.devMode) {
logger.info(`支付回调路由已注册: GET ${routePrefix}`);
}
}