zjpay/laravel-cpcn

Laravel package for CPCN (中金支付 壹企付) message gateway APIs.

Maintainers

Package info

github.com/ethanfly/laravel-payment-zj

pkg:composer/zjpay/laravel-cpcn

Statistics

Installs: 1

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2026-04-16 10:53 UTC

This package is auto-updated.

Last update: 2026-04-16 11:56:27 UTC


README

基于《中金支付 报文交换技术规范 第2部分 壹企付 V2.3.4》实现的 Laravel Composer 包。
支持:

  • TxCode 通用调用(覆盖全部接口)
  • 自动路由到测试/生产、普通网关/文件网关/聚合网关
  • message + signature 协议封装
  • 请求签名、响应验签(RSA)
  • 异步通知验签与解析

1. 安装

composer require zjpay/laravel-cpcn

发布配置:

php artisan vendor:publish --tag=cpcn-config

2. 配置

.env 中设置:

CPCN_MODE=test
CPCN_INSTITUTION_ID=123456

CPCN_MERCHANT_PRIVATE_KEY_PATH=/path/to/merchant_private.pem
CPCN_PLATFORM_PUBLIC_KEY_PATH=/path/to/cpcn_platform_public.pem

# 可选:协议细节差异(按你们联调环境调)
CPCN_REQUEST_MESSAGE_ENCODING=plain
CPCN_RESPONSE_MESSAGE_ENCODING=auto
CPCN_SIGNATURE_PAYLOAD=message
CPCN_VERIFY_RESPONSE_SIGNATURE=true

3. 通用调用(推荐)

use Zjpay\Cpcn\Facades\Cpcn;

$resp = Cpcn::tx('5011', [
    'PaymentNo' => 'P202604160001',
    'Amount' => '100',
    'SettlementFlag' => '10',
    // ...按文档拼 Body 字段
]);

if (! $resp->isSystemAccepted()) {
    throw new RuntimeException($resp->systemCode() . ':' . $resp->systemMessage());
}

$body = $resp->body();

4. 常用便捷方法

Cpcn::openAccount([...]);      // 4601
Cpcn::bindCard([...]);         // 4611
Cpcn::bindCardConfirm([...]);  // 4613
Cpcn::queryBindOrOpen([...]);  // 4616
Cpcn::recharge([...]);         // 4641
Cpcn::withdraw([...]);         // 4643
Cpcn::transfer([...]);         // 4645
Cpcn::pay([...]);              // 5011
Cpcn::payPage([...]);          // 5012
Cpcn::refund([...]);           // 5021

5. 异步通知验签

use Illuminate\Http\Request;
use Zjpay\Cpcn\Facades\Cpcn;

Route::post('/cpcn/notify', function (Request $request) {
    $message = (string) $request->input('message');
    $signature = (string) $request->input('signature');

    $parsed = Cpcn::parseAndVerifyCallback($message, $signature);
    // TODO: 业务处理
    return response('OK');
});

6. 网关路由策略(默认)

  • 文件网关:4600, 4698
  • 聚合网关:5012
  • 其余 TxCode:普通网关

可在 config/cpcn.phprouting 中调整或新增。

7. 注意事项

  • 文档附录明确要求提交 messagesignature 参数;缺失可能返回 240001
  • 返回 2000 仅代表系统受理成功,最终业务结果请看 Body.ResponseCode/Status 等业务字段。
  • TxSN 默认自动生成(17位时间戳前缀 + 随机串,总长 32)。

8. 自动发版与 Packagist 同步

仓库已内置:

  • .github/workflows/release.ymlpush main 时按 Conventional Commits 自动语义化发版(GitHub Release + tag)
  • .github/workflows/packagist-sync.ymlpush main/tag 时主动通知 Packagist 更新

请在 GitHub 仓库 Settings -> Secrets and variables -> Actions 添加:

  • PACKAGIST_USERNAME:你的 Packagist 用户名
  • PACKAGIST_TOKEN:你的 Packagist API Token

建议提交信息遵循 Conventional Commits(决定版本号):

  • fix: => patch
  • feat: => minor
  • feat!: 或包含 BREAKING CHANGE: => major