PAYATHON 2026

如何在 PHP 或 CakePHP 中集成 Chase 支付

支付小周

结论

Chase 支付网关通常提供通过 HTTPS 调用的支付接口,但没有专门面向 PHP 或 CakePHP 的 API。PHP 可以使用 cURL 等 HTTP 客户端接入。CakePHP 项目则可以进一步将相关代码封装为 Service、Component 或插件。

“Chase payment gateway”可能指 Chase Paymentech、Orbital Gateway,也可能是 Chase 商户后台提供的其他支付产品。每种产品的接口地址、认证方式、报文格式和开通条件都可能不同。接入前应向 Chase 商户支持确认账户对应的产品,并取得当前有效的官方 API 文档、测试环境地址和凭据。其他 Chase 产品的示例不能直接套用。

接入前需要准备什么

通常需要从 Chase 获取或确认以下信息:

  • 商户账号和 API 使用权限
  • 测试环境与生产环境的接口地址
  • API 用户名、密钥、证书或其他认证凭据
  • 支持的交易类型,如授权、扣款、撤销和退款
  • 请求与响应格式,如 JSON、XML 或其他协议
  • 是否支持 Tokenization、Hosted Payment Page 或 Hosted Fields
  • Webhook 或交易状态查询机制
  • PCI DSS 合规要求

是否有官方 PHP SDK,应以对应产品的当前文档为准。即使没有 PHP SDK,只要产品提供标准 HTTPS API,PHP 也能接入。

PHP 中调用 API

下面的代码只展示通用调用结构,不代表任何 Chase 产品的真实端点、字段或认证格式。所有实际值都必须按照官方文档替换。

<?php

$endpoint = 'https://sandbox.example-chase-endpoint.test/payment';
$apiKey = getenv('CHASE_API_KEY');

$payload = [
    // 按 Chase 对应产品的官方文档填写请求字段
];

$ch = curl_init($endpoint);

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTPHEADER => [
        'Accept: application/json',
        'Content-Type: application/json',
        'Authorization: Bearer ' . $apiKey,
    ],
    CURLOPT_POSTFIELDS => json_encode($payload, JSON_THROW_ON_ERROR),
]);

$responseBody = curl_exec($ch);

if ($responseBody === false) {
    $error = curl_error($ch);
    curl_close($ch);

    throw new RuntimeException('Payment request failed: ' . $error);
}

$statusCode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);

$response = json_decode($responseBody, true, 512, JSON_THROW_ON_ERROR);

if ($statusCode < 200 || $statusCode >= 300) {
    throw new RuntimeException(
        sprintf('Gateway returned HTTP %d', $statusCode)
    );
}

// 按官方文档检查交易状态、响应码和交易编号

其中的 Authorization: Bearer 只是常见写法的示例。Chase 实际使用的认证方式可能是自定义请求头、商户凭据、签名或客户端证书,核对官方文档前不要照搬。

在 CakePHP 中封装

在 CakePHP 项目中,可以把网关调用放进独立服务,避免将支付逻辑直接写入 Controller。下面使用 Cake\Http\Client 展示基本结构:

<?php
declare(strict_types=1);

namespace App\Service;

use Cake\Http\Client;
use RuntimeException;

final class ChasePaymentService
{
    private Client $http;

    public function __construct(
        private readonly string $endpoint,
        private readonly string $apiKey
    ) {
        $this->http = new Client([
            'timeout' => 30,
        ]);
    }

    public function authorize(array $payload): array
    {
        $response = $this->http->post(
            $this->endpoint,
            json_encode($payload, JSON_THROW_ON_ERROR),
            [
                'headers' => [
                    'Accept' => 'application/json',
                    'Content-Type' => 'application/json',
                    // 认证格式必须以实际 Chase API 文档为准
                    'Authorization' => 'Bearer ' . $this->apiKey,
                ],
            ]
        );

        if (!$response->isOk()) {
            throw new RuntimeException(
                sprintf(
                    'Chase gateway returned HTTP %d',
                    $response->getStatusCode()
                )
            );
        }

        $result = $response->getJson();

        if (!is_array($result)) {
            throw new RuntimeException('Invalid gateway response');
        }

        return $result;
    }
}

Controller 负责校验业务输入并调用服务:

$result = $chasePaymentService->authorize($gatewayPayload);

// 不要仅凭 HTTP 200 判断付款成功
// 还要依据官方文档检查交易状态和响应码

接口地址和密钥应保存在环境变量或安全的密钥管理系统中,不要提交到代码仓库:

CHASE_API_ENDPOINT=https://sandbox.example-chase-endpoint.test/payment
CHASE_API_KEY=replace-with-secure-value

建议的集成流程

  1. 确认商户账户使用的是哪种 Chase 支付产品。
  2. 申请测试环境、API 权限和测试凭据。
  3. 按照官方文档实现认证、授权、扣款、撤销和退款。
  4. 将网关返回的交易编号与本地订单关联。
  5. 处理超时、重复请求、网络中断和状态不确定等情况。
  6. 如果产品支持幂等键,使用它来避免重复扣款。
  7. 通过交易查询接口或 Webhook 对账,不要只依赖浏览器跳转结果。
  8. 完成测试环境验证后,再切换到生产端点和生产凭据。

安全与支付状态注意事项

不要让银行卡号、CVV 或完整磁道数据进入普通应用日志。如果 Chase 提供 Hosted Payment Page、Hosted Fields 或 Tokenization,应优先使用这些方案,以缩小 PCI DSS 合规范围。

金额应以整数形式保存为最小货币单位。例如,$10.25 应保存为 1025,以避免浮点数误差。接口究竟要求整数还是小数字符串,仍需查看官方字段定义。

还需要处理以下情况:

  • HTTP 请求超时,但网关实际上已经完成交易
  • 用户重复提交支付表单
  • HTTP 状态为 200,但业务响应显示交易被拒绝
  • 授权成功,后续扣款失败
  • 退款请求已经受理,但尚未最终完成
  • Webhook 重复发送或到达顺序发生变化

请求超时后,不要立即再次扣款。先通过订单号或网关交易编号查询原交易状态。只有确认原请求没有成功,才能考虑重新提交。

接入 Chase 时,应先确认商户使用的具体支付产品,再按照该产品的官方协议封装一个可靠、安全且支持对账的 PHP 客户端,无须寻找 CakePHP 专用 API。

备注:内容仅供参考。