使用沙箱密钥生成Payment Token调用verifyCharge报Invalid Charge Id错误
解决Checkout.com verifyCharge()报错"Invalid Charge id"的问题
看起来你踩了一个很容易混淆的API使用误区——verifyCharge()方法需要的是Charge ID,而不是Payment Token,哪怕文档描述可能让你误以为直接传Payment Token就行。我来帮你梳理正确的流程和代码调整方案:
核心错误原因
Payment Token的作用是创建Charge,而不是直接用来验证。你需要先用Payment Token生成Charge,拿到对应的Charge ID后,再调用verifyCharge()去验证这个Charge的状态。
修正后的实现步骤
1. 调整VerifyPaymentTokenAPI类(或在使用流程中补充创建Charge的步骤)
你需要先通过Payment Token创建Charge,获取Charge ID后再执行验证:
use com\checkout; class VerifyPaymentTokenAPI { private $apiClient; private $chargeService; function __construct($secretKey) { $this->apiClient = new checkout\ApiClient($secretKey); $this->chargeService = $this->apiClient->chargeService(); } // 先通过Payment Token创建Charge public function createChargeFromToken($paymentToken, $amount, $currency = 'PHP') { $chargeCreate = new checkout\ApiServices\Charges\RequestModels\ChargeCreate(); $chargeCreate->setToken($paymentToken); $chargeCreate->setValue($amount); $chargeCreate->setCurrency($currency); return $this->chargeService->createCharge($chargeCreate); } // 用Charge ID验证Charge public function verifyCharge($chargeId) { return $this->chargeService->verifyCharge($chargeId); } }
2. 更新使用示例流程
现在的流程应该是:生成Payment Token → 创建Charge → 验证Charge:
// 生成Payment Token $paymentTokenAPI = new PaymentTokenAPI('sk_test_aaaaaaaaaaaaaaaaa'); $paymentTokenAPI->setInvestmentValue('1000'); $token = null; try { $token = ($paymentTokenAPI->createPaymentToken())->getId(); echo "生成的Payment Token: {$token}\n"; }catch (checkout\helpers\ApiHttpClientCustomException $e) { echo 'Caught exception Message: ', $e->getErrorMessage(), "\n"; echo 'Caught exception Error Code: ', $e->getErrorCode(), "\n"; echo 'Caught exception Event id: ', $e->getEventId(), "\n"; exit; } // 创建Charge并验证 $verifyAPI = new VerifyPaymentTokenAPI('sk_test_aaaaaaaaaaaaaaaaa'); try { // 第一步:用Payment Token创建Charge $charge = $verifyAPI->createChargeFromToken($token, '1000'); $chargeId = $charge->getId(); echo "生成的Charge ID: {$chargeId}\n"; // 第二步:用Charge ID验证Charge $verifiedCharge = $verifyAPI->verifyCharge($chargeId); var_dump($verifiedCharge); // 输出验证结果 }catch (checkout\helpers\ApiHttpClientCustomException $e) { echo 'Caught exception Message: ', $e->getErrorMessage(), "\n"; echo 'Caught exception Error Code: ', $e->getErrorCode(), "\n"; echo 'Caught exception Event id: ', $e->getEventId(), "\n"; }
额外排查点
除了流程错误,你还可以检查这几个地方:
- Payment Token有效期:Payment Token通常只有15分钟左右的有效期,如果生成后隔了很久才验证,可能已经失效,需要重新生成。
- 沙箱密钥正确性:确认你用的是沙箱环境的
sk_test_xxx密钥,没有和生产环境的密钥混用。 - API版本兼容性:如果你用的是Checkout.com v3 API,方法名和参数可能有变化,比如
verifyCharge可能被替换为其他端点,建议核对你使用的API版本对应的官方文档。
内容的提问来源于stack exchange,提问作者Carl Binalla
相关产品推荐
相关产品推荐

