*/ private const REDACTED_KEYS = ['cardpan', 'cardcvc2']; /** * Records a PaymentTransaction from a PAYONE API response (ERROR, REDIRECT, APPROVED, …). * * @param array $response */ public static function recordFromResponse( ShoppingPayment $payment, string $requestType, array $response, int $useridFallback = 0, ): PaymentTransaction { return PaymentTransaction::create([ 'shopping_payment_id' => $payment->id, 'request' => $requestType, 'txid' => $response['txid'] ?? 0, 'userid' => $response['userid'] ?? $useridFallback, 'status' => $response['status'] ?? 'UNKNOWN', 'txaction' => $response['txaction'] ?? null, 'transmitted_data' => self::redactPayload($response), 'errorcode' => $response['errorcode'] ?? null, 'errormessage' => $response['errormessage'] ?? null, 'customermessage' => $response['customermessage'] ?? null, 'mode' => $payment->mode, ]); } /** * Records a synthetic transaction for FNC/MIV invoice payments (no PAYONE API call made). * * @param array $requestPayload */ public static function recordInvoicePayment( ShoppingPayment $payment, string $requestType, array $requestPayload, ): PaymentTransaction { return PaymentTransaction::create([ 'shopping_payment_id' => $payment->id, 'request' => $requestType, 'txid' => 0, 'userid' => 0, 'status' => 'FNCMIV', 'transmitted_data' => self::redactPayload($requestPayload), 'txaction' => 'invoice_open', 'mode' => $payment->mode, ]); } /** * Records a transaction for an incoming PAYONE IPN/TSOK webhook callback. * * @param array $data Raw callback payload (\Request::all()). */ public static function recordWebhookCallback( ShoppingPayment $payment, array $data, ): PaymentTransaction { return PaymentTransaction::create([ 'shopping_payment_id' => $payment->id, 'request' => 'transaction', 'txid' => $data['txid'] ?? 0, 'userid' => $data['userid'] ?? 0, 'status' => 'PAYONE', 'key' => $data['key'] ?? null, 'txaction' => $data['txaction'] ?? null, 'transmitted_data' => self::redactPayload(Util::utf8ize($data)), 'mode' => $data['mode'] ?? $payment->mode, 'errorcode' => $data['errorcode'] ?? null, 'errormessage' => $data['errormessage'] ?? null, 'customermessage' => $data['customermessage'] ?? null, ]); } /** * Strips PCI-sensitive fields before persisting a payload. * * @param array $payload * @return array */ private static function redactPayload(array $payload): array { return array_diff_key($payload, array_flip(self::REDACTED_KEYS)); } }