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

Laravel 5.1集成Checkout.com支付报错问题排查求助

问题分析与解决方案

从你提供的代码来看,提交测试卡后出现错误页面,核心是后端的Charge API调用逻辑存在几个关键问题,下面逐一拆解并给出修复方案:


1. 错误使用了verifyCharge方法

Checkout.com的verifyCharge方法是用来验证已经创建完成的Charge(需要传入Charge ID),而不是用前端返回的card token来发起扣费。你需要用createCharge方法来创建新的扣费请求,这才是处理card token的正确姿势。

2. 缺少创建Charge的核心必填参数

创建扣费必须传入amount(金额,需用最小货币单位,比如100代表1美元)、currency(货币代码,比如USD)、source(也就是前端传来的cko-card-token)这些核心参数,你的代码里完全没有构造这些参数,API请求必然会失败。

3. 异常处理不符合Laravel规范

当前代码直接用echo输出异常信息,在Laravel框架中这种做法会破坏响应结构,导致页面直接抛出错误。应该用Laravel的响应机制返回错误提示,比如重定向回支付页面并携带错误信息。

4. 类引用与拼写错误

代码里的/** @var ResponseModels\Charge $ChargeRespons **/存在拼写错误($ChargeRespons应该是$ChargeResponse),而且没有正确引入ResponseModels\Charge类,需要添加对应的use语句。


修正后的后端代码示例

use com\checkout;
use com\checkout\ResponseModels\Charge; // 正确引入Charge类
use com\checkout\helpers\ApiHttpClientCustomException;

class OrdersController extends Controller {
    public function payment() {
        return view('front.checkout');
    }

    public function checkout(Request $request) {
        // 先验证请求中是否存在card token
        $request->validate([
            'cko-card-token' => 'required',
        ]);

        $apiClient = new checkout\ApiClient('sk_test_baaaaaa-5116-999-9270-8d404615c8cd');
        $chargeService = $apiClient->chargeService();

        try {
            // 构造创建Charge的核心参数
            $chargeParams = [
                'amount' => 100, // 示例:1美元,单位为最小货币单位
                'currency' => 'USD',
                'source' => [
                    'type' => 'token',
                    'token' => $request->input('cko-card-token')
                ],
                // 可选:添加付款描述、客户信息等额外参数
                'description' => 'Order #123 Payment',
            ];

            /** @var Charge $chargeResponse */
            $chargeResponse = $chargeService->createCharge($chargeParams);

            // 扣费成功后的逻辑:比如保存订单状态、跳转到成功页面
            return redirect()->route('payment.success')->with('success', 'Payment completed successfully!');

        } catch (ApiHttpClientCustomException $e) {
            // 捕获API异常,携带错误信息重定向回支付页面
            $errorMessage = "Payment failed: " . $e->getErrorMessage();
            return redirect()->back()->with('error', $errorMessage);
        } catch (\Exception $e) {
            // 捕获其他通用异常
            return redirect()->back()->with('error', 'An unexpected error occurred. Please try again later.');
        }
    }
}

额外的前端优化建议

你可以在前端的catch块里添加用户友好的错误提示,让用户能直观看到问题:

.catch(function (err) {
    alert('Card submission failed: ' + err.message);
    payNowButton.disabled = false; // 重新启用支付按钮
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:16:44