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