fix: improve h5 payment return flow

This commit is contained in:
wushumin
2026-06-04 16:12:59 +08:00
parent 13c21ac67f
commit 46dae160be
13 changed files with 328 additions and 8 deletions

View File

@@ -320,6 +320,32 @@ try {
assertTrue(($launch['status'] ?? '') === 'pending', 'purchase should create pending payment');
assertTrue(($launch['cashier_url'] ?? '') !== '', 'purchase cashier_url missing');
$payment = latestPayment($notifyOrderId);
$requestJson = json_decode((string)$payment['request_json'], true);
$purchaseBody = is_array($requestJson) ? ($requestJson['body'] ?? []) : [];
assertTrue(
($purchaseBody['return_url'] ?? '') === 'https://m.example.com/?sqb_return_order_id=' . $notifyOrderId . '#/pages/order/detail?id=' . $notifyOrderId,
'purchase return_url should include H5 order detail fallback'
);
assertTrue(($purchaseBody['back_url'] ?? '') === ($purchaseBody['return_url'] ?? ''), 'purchase back_url should match return_url');
$staleReturnOrderId = createMockOrder($userId, 'STALERETURN');
$service->createOrReusePayment($staleReturnOrderId);
$stalePayment = latestPayment($staleReturnOrderId);
$staleRequestJson = json_decode((string)$stalePayment['request_json'], true);
if (is_array($staleRequestJson)) {
$staleRequestJson['body']['return_url'] = 'https://m.example.com/#/pages/order/detail?id=' . $staleReturnOrderId;
$staleRequestJson['body']['back_url'] = $staleRequestJson['body']['return_url'];
Db::name('shouqianba_payments')->where('id', (int)$stalePayment['id'])->update([
'request_json' => json_encode($staleRequestJson, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
]);
}
$replacement = $service->createOrReusePayment($staleReturnOrderId);
$stalePaymentAfterReplace = Db::name('shouqianba_payments')->where('id', (int)$stalePayment['id'])->find();
$latestReplacement = latestPayment($staleReturnOrderId);
assertTrue((string)($stalePaymentAfterReplace['status'] ?? '') === 'replaced', 'stale H5 payment should be marked replaced');
assertTrue((int)$latestReplacement['id'] !== (int)$stalePayment['id'], 'stale H5 payment should be replaced with a new payment row');
assertTrue(($replacement['check_sn'] ?? '') === (string)$latestReplacement['check_sn'], 'replacement launch payload should use the new payment row');
$notifyPayload = [
'check_sn' => $payment['check_sn'],
'order_status' => '4',