You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Braintree信用卡更新报错:Expected credit card id to be set求助

问题根源分析

这个错误的核心原因非常明确:你传入后端的JSON数据缺少Token字段,导致后端代码中$token = $requestJSON->Token;获取到的值是NULL,而Braintree的CreditCardGateway->find()方法要求必须传入有效的信用卡标识(Token/ID),因此抛出了InvalidArgumentException异常。

从你提供的JSON数据可以看到:

{Name: "chicken", cardNumber: "4111111111111111", Cvv: "747", Month: "12", Year: "22"}

完全没有包含Token字段,这就是问题的起点。

修复步骤

1. 前端补充传入信用卡Token

你需要在AJAX请求的JSON数据中,加入要更新的信用卡对应的Token值。这个Token是用户首次添加信用卡时,Braintree返回的唯一标识(比如你后台存储的用户关联信用卡的Token,或者前端通过Braintree SDK获取的payment method token)。

修正后的JSON示例:

{
  "Name": "chicken",
  "cardNumber": "4111111111111111",
  "Cvv": "747",
  "Month": "12",
  "Year": "22",
  "Token": "your_valid_credit_card_token_here"
}

2. 后端添加参数校验与异常处理

为了避免类似的空值异常,建议在调用Braintree方法前,先校验Token是否存在且有效,同时添加异常捕获逻辑,更友好地处理错误:

<?php
require_once 'lib/Braintree.php';

$requestBody = file_get_contents('php://input');
$requestJSON = json_decode($requestBody);

// 先校验必填参数
if (empty($requestJSON->Token)) {
    http_response_code(400);
    echo json_encode(['error' => 'Credit card token is required for update']);
    exit;
}

$name = $requestJSON->Name;
$cvv = $requestJSON->Cvv;
$cardNumber = $requestJSON->cardNumber;
$year = $requestJSON->Year;
$month = $requestJSON->Month;
$token = $requestJSON->Token;

$gateway = new Braintree_Gateway([
    'environment' => 'sandbox',
    'merchantId' => '********',
    'publicKey' => '********',
    'privateKey' => '********'
]);

try {
    $creditCard = $gateway->creditCard()->find($token);
    $result = $gateway->creditCard()->update($creditCard->token, [
        'cardholderName' => $name,
        'cvv' => $cvv,
        'number' => $cardNumber,
        'expirationMonth' => $month,
        'expirationYear' => $year
    ]);

    // 处理更新结果
    if ($result->success) {
        echo json_encode(['success' => true, 'creditCard' => $result->creditCard]);
    } else {
        echo json_encode(['success' => false, 'errors' => $result->errors]);
    }
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['error' => $e->getMessage()]);
}
?>

3. 注意参数大小写一致性

额外提醒:确保前后端参数名的大小写完全一致。比如后端用$requestJSON->Token(大写T),前端就不能传小写的token,否则会导致参数获取失败。

内容的提问来源于stack exchange,提问作者codernoob3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:47:27