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

@@ -88,7 +88,11 @@ class ShouqianbaConfigService
return '';
}
return $baseUrl . '/#/pages/order/detail?id=' . $orderId;
$fallbackQuery = http_build_query([
'sqb_return_order_id' => $orderId,
], '', '&', PHP_QUERY_RFC3986);
return $baseUrl . '/?' . $fallbackQuery . '#/pages/order/detail?id=' . $orderId;
}
public function miniProgramCallbackPath(int $orderId): string

View File

@@ -54,6 +54,11 @@ class ShouqianbaPaymentService
$latest = $this->latestPayment($orderId);
if ($latest && in_array((string)$latest['status'], ['pending', 'created'], true) && (string)$latest['order_token'] !== '') {
if ($this->shouldRefreshH5ReturnUrl($latest, $order)) {
$replacement = $this->createPayment($order);
$this->markPaymentReplaced($latest);
return $replacement;
}
return $this->buildPaymentLaunchPayload($latest, $order);
}
@@ -281,6 +286,44 @@ class ShouqianbaPaymentService
return $payload;
}
private function shouldRefreshH5ReturnUrl(array $payment, array $order): bool
{
if ((string)$order['source_channel'] !== 'h5') {
return false;
}
$expectedUrl = $this->configService->h5OrderDetailUrl((int)$order['id']);
if ($expectedUrl === '') {
return false;
}
$requestJson = json_decode((string)($payment['request_json'] ?? ''), true);
if (!is_array($requestJson)) {
return true;
}
$body = $requestJson['body'] ?? ($requestJson['request']['body'] ?? null);
if (!is_array($body)) {
return true;
}
return (string)($body['return_url'] ?? '') !== $expectedUrl
|| (string)($body['back_url'] ?? '') !== $expectedUrl;
}
private function markPaymentReplaced(array $payment): void
{
$now = date('Y-m-d H:i:s');
Db::name('shouqianba_payments')
->where('id', (int)$payment['id'])
->whereIn('status', ['pending', 'created'])
->update([
'status' => 'replaced',
'cancelled_at' => $now,
'updated_at' => $now,
]);
}
private function queryRemotePayment(array $payment): array
{
$config = $this->configService->assertReady(true);