PayPal API无登录信用卡支付失败:有效期格式错误排查
问题
在WordPress环境中搭建了自定义信用卡支付表单,通过ajax-request.php调用自定义PayPal.php发起PayPal API请求。目前已实现按月支付和一次性支付功能,用户需登录PayPal账号并通过弹窗完成支付,功能运行正常,支付记录可在PayPal开发者后台正常查看。
但尝试通过PayPal API实现无需登录的信用卡支付时始终无法完成,当前遇到信用卡有效期格式问题,已尝试MM/YY、MM/YYYY、MM-YY、MM-YYYY等多种格式均无效。
已成功通过Checkout API创建订单,之后将信用卡信息和orderId发送至API完成支付,请求地址:
$url = $this->baseUrl . "/v2/checkout/orders/$orderId/capture";
使用的payment_source参数如下:
'payment_source' => [ 'card' => [ 'number' => $cardNumber, 'expiry' => $expirationDate, 'security_code' => $cvv 'name' => $cardHolderName, 'billing_address' => [ 'address_line_1' => $billingAddress ?? 'Default Street 1', 'admin_area_2' => $billingCity ?? 'Default City', 'postal_code' => $billingZip ?? '00000', 'country_code' => $billingCountry ?? 'DE' ] ] ]
返回的错误信息:
{ "field": "/payment_source/card/expiry", "value": "12/27", "location": "body", "issue": "INVALID_STRING_LENGTH", "description": "The value of a field is either too short or too long." }
请问问题出在哪里?
解答
问题出在expiry字段的格式不符合PayPal v2 Checkout API的要求:
- PayPal要求信用卡有效期为纯数字的4位字符串(MMYY),不能包含任何分隔符(比如
/或-),长度必须恰好4位。 - 你传入的
"12/27"长度是5位,且包含分隔符,直接触发了INVALID_STRING_LENGTH错误。
修正步骤:
- 处理前端传入的有效期,移除所有非数字字符,确保最终是4位纯数字(比如把
12/27转为1227,12-2027转为1227)。 - 确保年份只取后两位(PayPal不接受4位年份的格式)。
修正后的参数示例:
'payment_source' => [ 'card' => [ 'number' => $cardNumber, 'expiry' => preg_replace('/\D/', '', $expirationDate), // 移除所有非数字字符 'security_code' => $cvv, // 原代码此处缺少逗号,需补上避免语法错误 'name' => $cardHolderName, 'billing_address' => [ 'address_line_1' => $billingAddress ?? 'Default Street 1', 'admin_area_2' => $billingCity ?? 'Default City', 'postal_code' => $billingZip ?? '00000', 'country_code' => $billingCountry ?? 'DE' ] ] ]
内容的提问来源于stack exchange,提问作者Auraya
相关产品推荐
相关产品推荐

