UNPKG

koishi-plugin-pay-tool

Version:

适用于Koishi框架的易支付工具插件,支持订单创建、查询、退款、分配等功能

101 lines (100 loc) 4.71 kB
"use strict"; 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}`); } }