如何从Adyen加密的$_POST['encrypted-data']提取字段替换支付测试数据
要实现从$_POST['encrypted-data']提取加密卡字段并替换测试数据,你只需要解析加密数据的JSON字符串,然后将对应字段赋值给CheckoutPaymentMethod的属性即可,具体实现如下:
核心逻辑说明
Adyen客户端加密(CSE)生成的encrypted-data是JSON格式字符串,其中包含你需要的所有加密卡信息(字段采用小驼峰命名,比如encryptedCardNumber对应你提到的EncryptedCardNumber)。只需解析该JSON,提取对应字段后替换测试值即可。
修改后的payment.php完整代码
<?php // 1. 验证加密数据是否存在 if (!isset($_POST['encrypted-data']) || empty($_POST['encrypted-data'])) { die("加密数据不能为空"); } // 2. 解析JSON为PHP关联数组 $encryptedData = json_decode($_POST['encrypted-data'], true); if (json_last_error() !== JSON_ERROR_NONE) { die("加密数据解析失败"); } // 3. 校验必要字段完整性 $requiredFields = ['encryptedCardNumber', 'encryptedExpiryMonth', 'encryptedExpiryYear', 'encryptedSecurityCode']; foreach ($requiredFields as $field) { if (!isset($encryptedData[$field]) || empty($encryptedData[$field])) { die("缺少必要加密字段: {$field}"); } } require_once 'vendor/autoload.php'; $client = new \Adyen\Client(); $client->setXApiKey("my api key"); $client->setEnvironment(\Adyen\Environment::TEST); $client->setTimeout(30); $service = new \Adyen\Service\Checkout\PaymentsApi($client); // 用动态唯一值生成幂等键,避免重复请求问题 $requestOptions['idempotencyKey'] = uniqid(); // 初始化支付方式对象,替换测试数据为真实加密值 $paymentMethod = new \Adyen\Model\Checkout\CheckoutPaymentMethod(); $paymentMethod ->setType("scheme") ->setEncryptedCardNumber($encryptedData['encryptedCardNumber']) ->setEncryptedExpiryMonth($encryptedData['encryptedExpiryMonth']) ->setEncryptedExpiryYear($encryptedData['encryptedExpiryYear']) ->setEncryptedSecurityCode($encryptedData['encryptedSecurityCode']); // 初始化金额对象 $amount = new \Adyen\Model\Checkout\Amount(); $amount ->setValue(10) ->setCurrency("EUR"); // 初始化支付请求对象 $paymentRequest = new \Adyen\Model\Checkout\PaymentRequest(); $paymentRequest ->setMerchantAccount("myMerchantAccountCOM") ->setPaymentMethod($paymentMethod) ->setAmount($amount) ->setReference("payment-test-" . uniqid()) // 生成唯一订单参考号 ->setReturnUrl("https://your-valid-return-url.com"); // 填写真实商户返回URL // 发起支付请求并处理结果 try { $result = $service->payments($paymentRequest, $requestOptions); // 生产环境可根据$result结果跳转或返回响应 var_dump($result); } catch (\Adyen\AdyenException $e) { die("支付请求失败: " . $e->getMessage()); } ?>
关键注意事项
- 字段名匹配:Adyen旧版CSE生成的JSON字段为小驼峰格式,需严格匹配字段名
- 幂等键优化:用
uniqid()动态生成幂等键,避免重复提交相同请求 - 返回URL必填:必须填写真实有效的商户返回URL,否则支付流程无法正常完成
- 错误处理:添加了基础的参数校验和异常捕获,生产环境可进一步优化错误处理逻辑
内容的提问来源于stack exchange,提问作者ashrf glal
相关产品推荐
相关产品推荐

