fix: prevent pakasir provider_ref overflow on long QR payload

This commit is contained in:
Dwindi Ramadhana
2026-02-15 00:32:26 +07:00
parent 2795e0b927
commit 0e4f3c3599

View File

@@ -77,10 +77,10 @@ class PakasirController extends Controller
]; ];
$endpoint = $apiBase.'/api/transactioncreate/qris'; $endpoint = $apiBase.'/api/transactioncreate/qris';
$res = Http::timeout($timeout)->post($endpoint, $payload); // Pakasir expects form payloads; keep JSON as fallback for provider-side variations.
$res = Http::asForm()->timeout($timeout)->post($endpoint, $payload);
if (!$res->successful()) { if (!$res->successful()) {
// Fallback for gateways expecting x-www-form-urlencoded payloads. $res = Http::timeout($timeout)->post($endpoint, $payload);
$res = Http::asForm()->timeout($timeout)->post($endpoint, $payload);
} }
if (!$res->successful()) { if (!$res->successful()) {
@@ -124,7 +124,8 @@ class PakasirController extends Controller
'currency' => 'IDR', 'currency' => 'IDR',
'amount' => $amountIdr, 'amount' => $amountIdr,
'status' => 'pending', 'status' => 'pending',
'provider_ref' => $paymentNumber !== '' ? $paymentNumber : $orderRef, // Keep provider_ref short (column is varchar(100)); QR payload can be much longer.
'provider_ref' => $this->safeProviderRef($paymentNumber, $orderRef),
'raw_payload' => $body, 'raw_payload' => $body,
]); ]);
@@ -179,6 +180,16 @@ class PakasirController extends Controller
return [$paymentNumber, $status, $expiredAt, $totalPayment]; return [$paymentNumber, $status, $expiredAt, $totalPayment];
} }
private function safeProviderRef(string $paymentNumber, string $orderRef): string
{
$candidate = trim($paymentNumber);
if ($candidate !== '' && mb_strlen($candidate) <= 100) {
return $candidate;
}
return $orderRef;
}
public function cancelPending(Request $request): JsonResponse public function cancelPending(Request $request): JsonResponse
{ {
$user = $request->user(); $user = $request->user();