feat(M08-B): 补保洁微信转账回调与轮询

This commit is contained in:
Codex
2026-06-29 10:47:54 +08:00
parent b07c451700
commit a1bace2dac
12 changed files with 446 additions and 21 deletions
+54
View File
@@ -159,6 +159,30 @@ const app = await buildApp({
transferState: input.mode === 'MOCK' ? 'SUCCESS' : 'WAIT_USER_CONFIRM',
idempotent: false
};
},
async syncWechatTransfer(input) {
calls.push(['syncWechatTransfer', input]);
return {
settlement: {
...settlementResponse('PAID'),
payoutChannel: 'WECHAT_TRANSFER',
payoutReference: 'wx-transfer-sync-501'
},
transferState: 'SUCCESS',
idempotent: false
};
},
async processWechatTransferNotification(headers, rawBody, traceId) {
calls.push(['processWechatTransferNotification', { headers, rawBody, traceId }]);
return {
settlement: {
...settlementResponse('PAID'),
payoutChannel: 'WECHAT_TRANSFER',
payoutReference: 'wx-transfer-notify-501'
},
transferState: 'SUCCESS',
idempotent: false
};
}
},
mediaStorage: {
@@ -395,6 +419,36 @@ assert.equal(calls.at(-1)[0], 'executeWechatTransfer');
assert.equal(calls.at(-1)[1].settlementId, '501');
assert.equal(calls.at(-1)[1].mode, 'API');
const syncedWechatTransfer = await app.inject({
method: 'POST',
url: '/admin-api/cleaning/settlements/501/wechat-transfer/sync',
headers: { authorization: `Bearer ${token}` },
payload: { note: 'poll wechat transfer' }
});
assert.equal(syncedWechatTransfer.statusCode, 200);
assert.equal(syncedWechatTransfer.json().data.transferState, 'SUCCESS');
assert.equal(syncedWechatTransfer.json().data.settlement.payoutReference, 'wx-transfer-sync-501');
assert.equal(calls.at(-1)[0], 'syncWechatTransfer');
assert.equal(calls.at(-1)[1].settlementId, '501');
const wechatTransferNotify = await app.inject({
method: 'POST',
url: '/app-api/cleaning/wechat-transfer/notify',
headers: {
'content-type': 'application/json',
'wechatpay-timestamp': '1782700001',
'wechatpay-nonce': 'notify-nonce',
'wechatpay-serial': 'PLATFORM-SERIAL',
'wechatpay-signature': 'signature'
},
payload: '{"resource":"encrypted"}'
});
assert.equal(wechatTransferNotify.statusCode, 200);
assert.equal(wechatTransferNotify.json().code, 'SUCCESS');
assert.equal(calls.at(-1)[0], 'processWechatTransferNotification');
assert.equal(calls.at(-1)[1].headers.serial, 'PLATFORM-SERIAL');
assert.equal(calls.at(-1)[1].rawBody, '{"resource":"encrypted"}');
const reclaimed = await app.inject({
method: 'POST',
url: '/admin-api/cleaning/reclaim-timeouts',