publink/payment

PubLink payment services.

Maintainers

Package info

github.com/AccScience-Publishing/publink

pkg:composer/publink/payment

Transparency log

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.1 2026-07-21 10:24 UTC

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 原始响应数组。