publink / payment
PubLink payment services.
v1.1
2026-07-21 10:24 UTC
Requires
- php: >=7.4
- guzzlehttp/guzzle: ^7.0
This package is not auto-updated.
Last update: 2026-07-21 13:31:33 UTC
README
PubLink 支付 Composer 包,封装 APC 订单创建、取消订单、查询订单,以及支付通知验签。
安装
composer require publink/payment
配置
本包不会直接读取业务项目的 .env。调用方应在自己的项目里维护配置文件,例如 Laravel/ThinkPHP 项目可放在 config/publink.php,再把配置数组传给 Payment。
return [ 'mch_id' => env('PUBLINK.PUBLINK_MCH_ID', ''), 'sign_key' => env('PUBLINK.PUBLINK_SIGN_KEY', ''), 'currency' => env('PUBLINK.PUBLINK_CURRENCY', 'CNY'), 'environment' => env('PUBLINK.PUBLINK_ENVIRONMENT', 'sandbox'), 'timeout' => env('PUBLINK.PUBLINK_TIMEOUT', 10), 'notify_url' => env('PUBLINK.PUBLINK_NOTIFY_URL', ''), 'return_url' => env('PUBLINK.PUBLINK_RETURN_URL', ''), ];
.env 示例:
[PUBLINK]
PUBLINK_MCH_ID=xxxxxxxxxxxxxxxxxxx
PUBLINK_SIGN_KEY=xxxxxxxxxxxxxxxxx
# [CNY, USD, EUR, GBP, SGD, HKD, CHF, JPY, CAD, AUD, KRW, NZD]
PUBLINK_CURRENCY=USD
# sandbox, production
PUBLINK_ENVIRONMENT=sandbox
PUBLINK_TIMEOUT=10
PUBLINK_NOTIFY_URL=
PUBLINK_RETURN_URL=
调用时传入项目自己的配置:
use Publink\Payment\Payment; $payment = new Payment(config('publink'));
默认接口地址:
- 沙箱环境:
https://publisher-sandbox.cnpereading.com/ - 生产环境:
https://publisher.cnpereading.com/
创建 APC 订单
$response = $payment->newOrder([ 'mch_order_no' => 'APC202607090001', // 必填 string 'journal_name' => '期刊名称', // 必填 'article_title' => '文章标题', // 必填 'contact_author_real_name' => '通讯作者姓名', // 必填[1,32] 作者姓名不能大于32位 会报Invalid request 'contact_author_email' => 'author@example.com', // 必填 'contact_author_mobile' => '13611111111', 'contact_author_affiliation' => '作者机构', 'contact_author_orc_id' => '0000-0000-0000-0000', 'doi' => '10.0000/example', 'manuscript_id' => 'MS-001', 'total_money' => '100.00', // 必填 整数或两位小数 'return_url' => 'https://example.com/return', 'notify_url' => 'https://example.com/notify', ]); $payUrl = $response['data']['pay_url'] ?? null;
必填字段缺失会抛异常
取消订单
$response = $payment->cancelOrder([ 'mch_order_no' => 'APC202607090001', 'reason' => '订单创建错误', ]);
支付通知 回调验签
PubLink 会使用原始 JSON 请求体生成签名,并通过 X-PubLink-Sign 请求头传递签名值。验签时优先使用原始请求体:
$body = file_get_contents('php://input'); $sign = $_SERVER['HTTP_X_PUBLINK_SIGN'] ?? ''; if (!$payment->verifyNotificationBody($body, $sign)) { http_response_code(400); echo json_encode($payment->notificationFailure('签名无效')); exit; } $payload = json_decode($body, true) ?: []; // 订单支付状态,可能的值:WAIT_PAYMENT(订单待支付);PARTIAL_PAYMENT(订单已部分支付);PAYMENT_COMPLETE(订单已支付) $payStatus = $payload['pay_status'] ?? ''; // 必传响应 echo json_encode($payment->notificationSuccess());
查询订单
$response = $payment->checkPayState('APC202607090001'); // 也可以直接传入商户订单号或 PubLink 订单号(二选一使用) // 订单支付状态,可能的值:WAIT_PAYMENT(订单待支付);PARTIAL_PAYMENT(订单已部分支付);PAYMENT_COMPLETE(订单已支付) $response = $payment->queryOrder([ 'mch_order_no' => 'APC202607090001', // 'pub_order_no' => 'PUBLINK_ORDER_NO', ]);
签名规则
PubLink 使用完整 JSON 请求体签名:
sha256(bodyJson + SIGN_KEY)
生成的签名值通过 X-PubLink-Sign 请求头发送。
异常
接口请求失败、PubLink 返回非 0 code、响应不是合法 JSON,都会抛出 Publink\Payment\PublinkException。可以通过 responseBody() 获取 PubLink 原始响应数组。