From 968396bed596aa447f6e9360b6e46e53db4ee5ae Mon Sep 17 00:00:00 2001 From: txai-dev Date: Mon, 14 Sep 2026 12:20:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9B=9E=E8=B0=83=E8=AF=BB=E5=8F=96Coin?= =?UTF-8?q?Info.Quantity=E5=B5=8C=E5=A5=97=E5=AD=97=E6=AE=B5+=E8=A1=A5?= =?UTF-8?q?=E5=8F=91=E5=88=B0=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/routes/wxmsg.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/server/src/routes/wxmsg.js b/server/src/routes/wxmsg.js index c783e04..6579d55 100644 --- a/server/src/routes/wxmsg.js +++ b/server/src/routes/wxmsg.js @@ -53,13 +53,35 @@ module.exports = function registerWxMsgRoutes(app) { try { const { User, Order } = require('../models') const outTradeNo = fields.OutTradeNo || '' - const coins = parseInt(fields.BuyQuantity || fields.buyQuantity || '0') + // 微信回调格式:CoinInfo.Quantity(嵌套)——兼容 JSON 和 XML 两种 + const coinInfo = fields.CoinInfo || fields.coinInfo || {} + const coins = parseInt( + (typeof coinInfo === 'object' ? coinInfo.Quantity : coinInfo) || + fields.BuyQuantity || fields.buyQuantity || '0' + ) + console.log(`[wx-msg] 充值回调解析: order=${outTradeNo} coins=${coins} coinInfo=${JSON.stringify(coinInfo)}`) if (outTradeNo && coins > 0) { + // 先查订单,没有也直接给用户加币(Attach 里带了 uid) const order = await Order.findOne({ orderNo: outTradeNo }) if (order && order.status === 'pending') { await Order.updateOne({ _id: order._id }, { status: 'paid', paidAt: new Date() }) await User.updateOne({ _id: order.userId }, { $inc: { vpayCoins: coins } }) - console.log(`[wx-msg] 星尘充值到账: ${outTradeNo} +${coins}`) + console.log(`[wx-msg] ✓ 星尘充值到账(有订单): ${outTradeNo} +${coins} → user=${order.userId}`) + } else { + // 订单可能未落库或已处理——从 Attach 里拿 uid 直接加 + try { + const attach = typeof coinInfo === 'object' ? coinInfo.Attach || '' : '' + const uid = attach ? JSON.parse(attach).uid : '' + if (uid) { + await User.updateOne({ _id: uid }, { $inc: { vpayCoins: coins } }) + if (order) await Order.updateOne({ _id: order._id }, { status: 'paid', paidAt: new Date() }) + console.log(`[wx-msg] ✓ 星尘充值到账(从Attach): ${outTradeNo} +${coins} → user=${uid}`) + } else if (order) { + await Order.updateOne({ _id: order._id }, { status: 'paid', paidAt: new Date() }) + await User.updateOne({ _id: order.userId }, { $inc: { vpayCoins: coins } }) + console.log(`[wx-msg] ✓ 星尘充值到账(订单补偿): ${outTradeNo} +${coins}`) + } + } catch (e2) { console.error('[wx-msg] Attach解析失败:', e2.message) } } } } catch (e) { console.error('[wx-msg] 充值到账失败:', e.message) }