From 88bffaa5d0479e79fc1acb3a52f8b35239ccade3 Mon Sep 17 00:00:00 2001 From: YeomaiPC Date: Tue, 29 Sep 2026 01:22:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=98=BE=E7=A4=BA=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/mine/mine.wxml | 2 +- server/db.js | 1 + server/index.js | 4 ++++ server/store-mysql.js | 3 +++ server/test.js | 14 +++++++++++++- 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/pages/mine/mine.wxml b/pages/mine/mine.wxml index 1fbb756..af0c4c4 100644 --- a/pages/mine/mine.wxml +++ b/pages/mine/mine.wxml @@ -13,7 +13,7 @@ {{item.timeText}} crypto.createHash('sha1').update(text).digest('hex') const isPaid = (status) => status >= 2 && status <= 4 // 2 已支付待发货 / 3 发货中 / 4 已发货 +// 订单渠道:7 / 8 是苹果 iOS(内购)订单,开发者不能主动退款 +const isAppleOrder = (order) => [7, 8].includes(Number(order && order.order_type)) // 从推送的 XML 里取字段,值可能在 CDATA 里 function xmlTag(xml, name) { @@ -244,6 +246,7 @@ async function deliverRecord(record, order) { const delivered = await store.assignCode(record.outTradeNo, { wxOrderId: detail.wx_order_id || record.wxOrderId || '', paidFee: detail.paid_fee || 0, + channel: isAppleOrder(detail) ? 'apple' : 'wxpay', }) const notify = await tryNotify(delivered) return { @@ -343,6 +346,7 @@ async function myCodes(code) { productId: record.productId, productName: await nameOf(record.productId), env: record.env || 0, + channel: record.channel || '', deliveredAt: record.deliveredAt, }) } diff --git a/server/store-mysql.js b/server/store-mysql.js index 24bd0c8..1f83ec0 100644 --- a/server/store-mysql.js +++ b/server/store-mysql.js @@ -8,6 +8,7 @@ const ORDER_COLUMNS = [ 'openid', 'product_id', 'env', + 'channel', 'amount', 'status', 'wx_order_id', @@ -34,6 +35,7 @@ function toRecord(row) { openid: row.openid, productId: row.product_id, env: row.env, + channel: row.channel || '', amount: row.amount, status: row.status, code: row.code || '', @@ -55,6 +57,7 @@ async function saveOrder(record) { record.openid, String(record.productId), record.env || 0, + record.channel || null, record.amount || 0, record.status || 'created', record.wxOrderId || null, diff --git a/server/test.js b/server/test.js index e0c5074..1051387 100644 --- a/server/test.js +++ b/server/test.js @@ -84,7 +84,14 @@ const fakeWx = http.createServer((req, res) => { return reply({ errcode: 0, errmsg: 'ok', - order: { order_id: orderId, status, paid_fee: 10, left_fee: 10, wx_order_id: `wx-${env}-${orderId}` }, + order: { + order_id: orderId, + status, + order_type: 0, // 0 普通虚拟支付(7 才是苹果内购) + paid_fee: 10, + left_fee: 10, + wx_order_id: `wx-${env}-${orderId}`, + }, }) } if (urlPath === '/xpay/notify_provide_goods') { @@ -336,6 +343,11 @@ async function main() { [sandboxDelivered.code, '补单专用'], ].sort() ) + // 退款按钮的显隐看订单渠道:普通虚拟支付记成 wxpay,苹果内购记成 apple + assert.deepStrictEqual( + Array.from(new Set(mine.list.map((item) => item.channel))), + ['wxpay'] + ) const others = await fetchJson(port, '/pay/my', { code: 'code-other' }) assert.deepStrictEqual(others.list, [])