创支付OPEN API DOCUMENTATION
V2 开发文档
CHUANGPAY OPEN API

V2 RSA 开放接口

使用 SHA256WithRSA 双向签名,适合正式生产环境和高安全业务。

V2
请求格式form / JSON
签名算法SHA256WithRSA
时间容差10 分钟
响应验签平台公钥

接入说明

V2 对请求、成功响应和支付通知进行 RSA 签名。

推荐版本

新接入项目建议使用 V2。请在用户中心「API 信息」生成商户 RSA 密钥对,妥善保存商户私钥,并使用平台公钥验证响应和通知。

字符编码UTF-8
请求签名商户私钥
响应验签平台公钥
成功状态code = 0

接口能力

接口请求方式地址用途
页面跳转支付GET / POST/api/pay/submit浏览器跳转到统一支付页面
统一下单POST/api/pay/create创建订单并返回支付信息
订单查询POST/api/pay/query查询订单状态并返回签名结果
订单退款POST/api/pay/refund按原支付通道提交退款
退款查询POST/api/pay/refundquery查询退款处理状态并返回签名结果

支付方式与场景

支付配置决定实际调用的支付通道,API 参数只选择支付方式和场景。

参数组合支付场景返回形式说明
type=alipay, scene=web支付宝网页/扫码jump 或 qrcode电脑端通常展示二维码,手机端可拉起支付宝
type=wxpay, scene=web微信网页支付jump进入统一支付页后按微信环境完成授权支付
type=alipay, scene=miniapp支付宝小程序jump拉起支付配置绑定的支付宝小程序
type=wxpay, scene=miniapp微信小程序jump拉起支付配置绑定的微信小程序
指定支付配置

channel_id 可指定已启用的支付配置。不传时系统根据支付方式、金额限制和通道路由规则自动选择。

RSA 密钥配置

商户和平台分别保管自己的私钥,只交换公钥。

配置流程

  1. 1

    在用户中心「API 信息」生成商户 RSA 密钥对。

  2. 2

    立即保存商户私钥,平台不会在后续页面重复展示私钥。

  3. 3

    平台保存商户公钥,用于验证商户请求。

  4. 4

    商户保存平台公钥,用于验证平台响应和支付通知。

私钥管理

商户私钥不得上传到平台、提交到代码仓库或发送给第三方。建议通过环境变量或密钥管理服务读取。

RSA 签名与验签

V2 使用 SHA-256 摘要和 RSA 私钥签名,签名结果采用 Base64 编码。

请求签名步骤

  1. 1

    添加 timestamp(当前 Unix 秒级时间戳)和 sign_type=RSA。

  2. 2

    移除 sign、sign_type、数组参数和空值参数。

  3. 3

    按参数名 ASCII 升序拼接 key=value&key=value。

  4. 4

    使用商户私钥执行 SHA256WithRSA 签名,再进行 Base64 编码。

签名与验签代码
ksort($params);
$content = buildSignContent($params);
openssl_sign($content, $signature, $merchantPrivateKey, OPENSSL_ALGO_SHA256);
$params['sign'] = base64_encode($signature);
const crypto = require('crypto');
const content = buildSignContent(params);
const sign = crypto.sign('RSA-SHA256', Buffer.from(content), merchantPrivateKey).toString('base64');
const ok = crypto.verify('RSA-SHA256', Buffer.from(responseContent), platformPublicKey, Buffer.from(response.sign, 'base64'));
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(merchantPrivateKey);
signature.update(content.getBytes(StandardCharsets.UTF_8));
String sign = Base64.getEncoder().encodeToString(signature.sign());
时间戳校验

平台只接受与服务器当前时间相差不超过 600 秒的请求,请确保服务器已开启时间同步。

页面跳转支付

浏览器提交后跳转至统一支付页面,请求必须通过 RSA 签名。

请求 URLhttps://czf.xxoi.cn/api/pay/submit
请求方式GET / POST
数据格式application/x-www-form-urlencoded(同时兼容 JSON)

请求参数

参数名称类型必填说明示例
pid商户 IDString用户中心 API 信息中的商户 ID1001
type支付方式Stringwxpay 或 alipayalipay
out_trade_no商户订单号String同一商户下唯一,最长 100 字符M202607150001
name商品名称String具体商品或服务名称,最长 120 字符测试商品
money订单金额String单位元,大于 0,最多两位小数1.00
notify_url异步通知地址String推荐支付成功后平台发起 GET 通知https://merchant.example.com/pay/notify
return_url页面跳转地址String用户完成支付后的浏览器跳转地址https://merchant.example.com/pay/return
method接口模式Stringweb 或 jump,默认 webweb
scene支付场景Stringweb 或 miniapp,默认 webweb
channel_id支付配置 IDInteger指定已启用的支付配置,不传则自动路由12
clientip用户 IPString发起支付的真实客户端 IP203.0.113.10
buyer_id买家标识StringJSAPI 或小程序支付需要时传入openid_or_buyer_id
param扩展参数String通知时原样返回,最长 500 字符order_source=shop
timestamp时间戳StringUnix 秒级时间戳,有效期 600 秒1784044800
sign_type签名类型String固定为 RSARSA
sign请求签名String商户私钥生成的 Base64 签名<BASE64_SIGNATURE>
请求示例
curl -X POST 'https://czf.xxoi.cn/api/pay/submit' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'pid=1001&type=alipay&out_trade_no=M202607150001&name=测试商品&money=1.00&timestamp=1784044800&sign_type=RSA&sign=<BASE64_SIGNATURE>'
{
  "pid": "1001",
  "type": "alipay",
  "out_trade_no": "M202607150001",
  "name": "测试商品",
  "money": "1.00",
  "notify_url": "https://merchant.example.com/pay/notify",
  "timestamp": "1784044800",
  "sign_type": "RSA",
  "sign": "<BASE64_SIGNATURE>"
}
成功返回

请求成功后返回 HTTP 302,并跳转到统一支付页面。

失败返回
{
  "code": -1,
  "msg": "签名校验失败"
}
注意事项
  • out_trade_no 在同一商户下必须唯一;重复请求会返回原订单,不能更换支付场景或支付配置。
  • 商品金额使用元,必须大于 0,最多保留两位小数。
  • method=jump 固定返回统一支付页;method=web 根据支付方式返回支付链接或二维码。

统一下单

服务端创建支付订单,成功响应携带平台 RSA 签名。

请求 URLhttps://czf.xxoi.cn/api/pay/create
请求方式POST
数据格式application/x-www-form-urlencoded(同时兼容 JSON)

请求参数

参数名称类型必填说明示例
pid商户 IDString用户中心 API 信息中的商户 ID1001
type支付方式Stringwxpay 或 alipayalipay
out_trade_no商户订单号String同一商户下唯一,最长 100 字符M202607150001
name商品名称String具体商品或服务名称,最长 120 字符测试商品
money订单金额String单位元,大于 0,最多两位小数1.00
notify_url异步通知地址String推荐支付成功后平台发起 GET 通知https://merchant.example.com/pay/notify
return_url页面跳转地址String用户完成支付后的浏览器跳转地址https://merchant.example.com/pay/return
method接口模式Stringweb 或 jump,默认 webweb
scene支付场景Stringweb 或 miniapp,默认 webweb
channel_id支付配置 IDInteger指定已启用的支付配置,不传则自动路由12
clientip用户 IPString发起支付的真实客户端 IP203.0.113.10
buyer_id买家标识StringJSAPI 或小程序支付需要时传入openid_or_buyer_id
param扩展参数String通知时原样返回,最长 500 字符order_source=shop
timestamp时间戳StringUnix 秒级时间戳,有效期 600 秒1784044800
sign_type签名类型String固定为 RSARSA
sign请求签名String商户私钥生成的 Base64 签名<BASE64_SIGNATURE>
请求示例
curl -X POST 'https://czf.xxoi.cn/api/pay/create' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'pid=1001&type=alipay&out_trade_no=M202607150001&name=测试商品&money=1.00&timestamp=1784044800&sign_type=RSA&sign=<BASE64_SIGNATURE>'
{
  "pid": "1001",
  "type": "alipay",
  "out_trade_no": "M202607150001",
  "name": "测试商品",
  "money": "1.00",
  "notify_url": "https://merchant.example.com/pay/notify",
  "timestamp": "1784044800",
  "sign_type": "RSA",
  "sign": "<BASE64_SIGNATURE>"
}
成功返回
{
  "code": 0,
  "msg": "success",
  "trade_no": "API202607150001",
  "pay_type": "jump",
  "pay_info": "https://pay.example.com/openapi/pay/API202607150001",
  "timestamp": "1784044800",
  "sign_type": "RSA",
  "sign": "<BASE64_SIGNATURE>"
}
失败返回
{
  "code": -1,
  "msg": "签名校验失败"
}

返回字段

字段名称类型说明示例
code返回状态码Integer0 表示成功,-1 表示失败0
msg返回信息String成功或失败原因success
trade_no平台订单号String平台生成的 API 订单号API202607150001
pay_type支付信息类型Stringjump、qrcode 或 htmljump
pay_info支付信息String跳转地址、二维码内容或 HTMLhttps://pay.example.com/openapi/pay/...
timestamp平台时间戳String用于响应验签1784044800
sign_type签名类型String固定为 RSARSA
sign平台签名String使用平台公钥验签<BASE64_SIGNATURE>
注意事项
  • out_trade_no 在同一商户下必须唯一;重复请求会返回原订单,不能更换支付场景或支付配置。
  • 商品金额使用元,必须大于 0,最多保留两位小数。
  • method=jump 固定返回统一支付页;method=web 根据支付方式返回支付链接或二维码。

V2 订单查询

使用平台订单号或商户订单号查询订单,两个订单号至少传一个。

请求 URLhttps://czf.xxoi.cn/api/pay/query
请求方式POST
数据格式application/x-www-form-urlencoded 或 application/json

请求参数

参数名称类型必填说明示例
pid商户 IDString用户中心 API 信息中的商户 ID1001
trade_no平台订单号String二选一平台生成的 API 订单号API202607150001
out_trade_no商户订单号String二选一商户提交的唯一订单号M202607150001
timestamp时间戳StringUnix 秒级时间戳,有效期 600 秒1784044800
sign_type签名类型String固定为 RSARSA
sign请求签名String商户私钥生成的 Base64 签名<BASE64_SIGNATURE>
请求示例
curl -X POST 'https://czf.xxoi.cn/api/pay/query' \
  -d 'pid=1001&out_trade_no=M202607150001&timestamp=1784044800&sign_type=RSA&sign=<BASE64_SIGNATURE>'
成功返回
{
    "code": 0,
    "msg": "success",
    "pid": 1001,
    "trade_no": "API202607150001",
    "out_trade_no": "M202607150001",
    "api_trade_no": "2026071500001",
    "type": "alipay",
    "name": "测试商品",
    "money": "1.00",
    "status": 1,
    "trade_status": "TRADE_SUCCESS",
    "addtime": "2026-07-15 10:00:00",
    "endtime": "2026-07-15 10:00:08",
    "buyer": "buyer_001",
    "param": "order_source=shop",
    "timestamp": "1784044800",
    "sign_type": "RSA",
    "sign": "<BASE64_SIGNATURE>"
}
失败返回
{
  "code": -1,
  "msg": "订单不存在"
}

返回字段

字段名称类型说明示例
pid商户 IDString订单所属商户1001
trade_no平台订单号String平台生成的订单号API202607150001
out_trade_no商户订单号String商户提交的订单号M202607150001
api_trade_no支付机构交易号String微信或支付宝交易号,未支付时为空2026071500001
type支付方式Stringwxpay 或 alipayalipay
name商品名称String下单时提交的商品名称测试商品
money订单金额String单位元1.00
status支付状态Integer1 已支付,0 未支付1
trade_status交易状态StringTRADE_SUCCESS、WAIT_BUYER_PAY 或 TRADE_CLOSEDTRADE_SUCCESS
addtime创建时间String订单创建时间2026-07-15 10:00:00
endtime支付时间String未支付时为空2026-07-15 10:00:08
buyer买家标识Stringopenid、buyer_id 或客户端标识buyer_001
param扩展参数String下单时提交的 paramorder_source=shop
timestamp平台时间戳String用于响应验签1784044800
sign_type签名类型String固定为 RSARSA
sign平台签名String使用平台公钥验签<BASE64_SIGNATURE>
注意事项
  • 同时传 trade_no 和 out_trade_no 时优先使用 trade_no。
  • 成功响应必须使用平台公钥验签。

V2 订单退款

根据平台订单号或商户订单号通过开放 API 发起原路退款。调用前需在用户中心 API 信息中开启退款 API。

请求 URLhttps://czf.xxoi.cn/api/pay/refund
请求方式POST
数据格式application/x-www-form-urlencoded 或 application/json

请求参数

参数名称类型必填说明示例
pid商户 IDString用户中心 API 信息中的商户 ID1001
trade_no平台订单号String二选一与商户订单号至少传一个,同时传入时优先使用API202607150001
out_trade_no商户订单号String二选一商户下单时提交的订单号M202607150001
money退款金额String单位元,大于 0,最多两位小数1.00
out_refund_no商户退款单号String推荐最长 100 字符,仅支持字母、数字、下划线和短横线;用于退款幂等MR202607150001
reason退款原因String最长 80 字符,默认 API退款用户申请退款
return_profit_sharing回退分账Integer1 表示同时回退已执行分账,默认 00
profit_sharing_refund_money分账退款金额String条件return_profit_sharing=1 时可填写,单位元0.00
timestamp时间戳StringUnix 秒级时间戳,有效期 600 秒1784044800
sign_type签名类型String固定为 RSARSA
sign请求签名String商户私钥生成的 Base64 签名<BASE64_SIGNATURE>
请求示例
curl -X POST 'https://czf.xxoi.cn/api/pay/refund' \
  -d 'pid=1001&trade_no=API202607150001&money=1.00&out_refund_no=MR202607150001&reason=用户申请退款&timestamp=1784044800&sign_type=RSA&sign=<BASE64_SIGNATURE>'
{
  "pid": "1001",
  "trade_no": "API202607150001",
  "money": "1.00",
  "out_refund_no": "MR202607150001",
  "reason": "用户申请退款",
  "timestamp": "1784044800",
  "sign_type": "RSA",
  "sign": "<BASE64_SIGNATURE>"
}
成功返回
{
    "code": 0,
    "msg": "退款申请已提交",
    "refund_no": "RF202607150001",
    "out_refund_no": "MR202607150001",
    "trade_no": "API202607150001",
    "out_trade_no": "M202607150001",
    "money": "1.00",
    "reducemoney": "0.00",
    "status": 2,
    "refund_status": "PROCESSING",
    "reason": "用户申请退款",
    "addtime": "2026-07-15 10:10:00",
    "endtime": "",
    "timestamp": "1784044800",
    "sign_type": "RSA",
    "sign": "<BASE64_SIGNATURE>"
}
失败返回
{
  "code": -1,
  "msg": "今日API退款笔数已达到上限(1笔)"
}

返回字段

字段名称类型说明示例
code返回状态码Integer0 成功,-1 失败0
msg返回信息String处理结果或失败原因退款申请已提交
refund_no平台退款单号String平台生成的唯一退款单号RF202607150001
out_refund_no商户退款单号String商户提交的退款单号;未提交时返回平台生成值MR202607150001
trade_no平台订单号String原支付订单的平台订单号API202607150001
out_trade_no商户订单号String原支付订单的商户订单号M202607150001
money退款金额String单位元1.00
reducemoney扣减余额String当前系统原路退款不额外扣减账户余额,固定为 0.000.00
status退款状态码Integer0 失败、1 成功、2 处理中2
refund_status退款状态StringPENDING、PROCESSING、SUCCESS、FAILED 或 CLOSEDPROCESSING
reason退款原因String商户提交的退款原因用户申请退款
failure_reason失败原因String退款失败时返回支付机构的失败原因,其他状态为空退款单不存在(REFUNDNOTEXIST)
addtime创建时间String退款记录创建时间2026-07-15 10:10:00
endtime完成时间String成功或失败后的更新时间,处理中为空
timestamp平台时间戳String用于响应验签1784044800
sign_type签名类型String固定为 RSARSA
sign平台签名String使用平台公钥验签<BASE64_SIGNATURE>
注意事项
  • 同时传 trade_no 和 out_trade_no 时优先使用 trade_no。
  • out_refund_no 在同一商户下唯一;相同退款单号、订单和金额的重复请求返回原结果,不会重复退款或重复计算每日额度。
  • 每日最大退款笔数按退款记录创建时间统计,0 表示不限制;只统计待处理、处理中和成功的 API 退款,失败记录不占用当天笔数。
  • status=1 表示成功,status=2 表示处理中,status=0 表示失败。微信退款可能先返回处理中,请通过退款查询接口获取最终状态。
  • code=0 的成功响应必须使用平台公钥验签。

V2 退款查询

使用平台退款单号或商户退款单号查询退款状态,两个退款单号至少传一个。

请求 URLhttps://czf.xxoi.cn/api/pay/refundquery
请求方式POST
数据格式application/x-www-form-urlencoded 或 application/json

请求参数

参数名称类型必填说明示例
pid商户 IDString用户中心 API 信息中的商户 ID1001
refund_no平台退款单号String二选一平台返回的退款单号RF202607150001
out_refund_no商户退款单号String二选一发起退款时提交或平台返回的商户退款单号MR202607150001
timestamp时间戳StringUnix 秒级时间戳,有效期 600 秒1784044800
sign_type签名类型String固定为 RSARSA
sign请求签名String商户私钥生成的 Base64 签名<BASE64_SIGNATURE>
请求示例
curl -X POST 'https://czf.xxoi.cn/api/pay/refundquery' \
  -d 'pid=1001&out_refund_no=MR202607150001&timestamp=1784044800&sign_type=RSA&sign=<BASE64_SIGNATURE>'
成功返回
{
    "code": 0,
    "msg": "success",
    "refund_no": "RF202607150001",
    "out_refund_no": "MR202607150001",
    "trade_no": "API202607150001",
    "out_trade_no": "M202607150001",
    "money": "1.00",
    "reducemoney": "0.00",
    "status": 1,
    "refund_status": "SUCCESS",
    "reason": "用户申请退款",
    "failure_reason": "",
    "addtime": "2026-07-15 10:10:00",
    "endtime": "2026-07-15 10:10:06",
    "timestamp": "1784044800",
    "sign_type": "RSA",
    "sign": "<BASE64_SIGNATURE>"
}
失败返回
{
  "code": -1,
  "msg": "退款记录不存在"
}

返回字段

字段名称类型说明示例
code返回状态码Integer0 成功,-1 失败0
msg返回信息String处理结果或失败原因退款申请已提交
refund_no平台退款单号String平台生成的唯一退款单号RF202607150001
out_refund_no商户退款单号String商户提交的退款单号;未提交时返回平台生成值MR202607150001
trade_no平台订单号String原支付订单的平台订单号API202607150001
out_trade_no商户订单号String原支付订单的商户订单号M202607150001
money退款金额String单位元1.00
reducemoney扣减余额String当前系统原路退款不额外扣减账户余额,固定为 0.000.00
status退款状态码Integer0 失败、1 成功、2 处理中2
refund_status退款状态StringPENDING、PROCESSING、SUCCESS、FAILED 或 CLOSEDPROCESSING
reason退款原因String商户提交的退款原因用户申请退款
failure_reason失败原因String退款失败时返回支付机构的失败原因,其他状态为空退款单不存在(REFUNDNOTEXIST)
addtime创建时间String退款记录创建时间2026-07-15 10:10:00
endtime完成时间String成功或失败后的更新时间,处理中为空
timestamp平台时间戳String用于响应验签1784044800
sign_type签名类型String固定为 RSARSA
sign平台签名String使用平台公钥验签<BASE64_SIGNATURE>
注意事项
  • 同时传 refund_no 和 out_refund_no 时优先使用 refund_no。
  • 退款查询不受退款 API 开关和每日笔数上限影响,关闭退款接口后仍可查询历史退款。
  • 微信处理中退款会主动查询微信侧状态;网关临时不可用时返回本地最近一次状态。
  • code=0 的成功响应必须使用平台公钥验签。

V2 支付结果通知

订单支付成功后,平台通过 GET 请求向下单时提交的 notify_url 发送结果。

通知参数

参数名称类型说明示例
pid商户 IDString订单所属商户1001
trade_no平台订单号String平台生成的订单号API202607150001
out_trade_no商户订单号String商户提交的订单号M202607150001
api_trade_no支付机构交易号String微信或支付宝交易号,未支付时为空2026071500001
type支付方式Stringwxpay 或 alipayalipay
name商品名称String下单时提交的商品名称测试商品
money订单金额String单位元1.00
trade_status交易状态StringTRADE_SUCCESS、WAIT_BUYER_PAY 或 TRADE_CLOSEDTRADE_SUCCESS
addtime创建时间String订单创建时间2026-07-15 10:00:00
endtime支付时间String未支付时为空2026-07-15 10:00:08
buyer买家标识Stringopenid、buyer_id 或客户端标识buyer_001
param扩展参数String下单时提交的 paramorder_source=shop
timestamp平台时间戳String用于通知验签1784044800
sign_type签名类型String固定为 RSARSA
sign平台签名String使用平台公钥验签<BASE64_SIGNATURE>
商户应答
success

处理要求

  1. 1

    先验证签名,再核对商户订单号、支付状态和订单金额。

  2. 2

    使用数据库唯一键保证通知幂等,同一订单可能收到多次通知。

  3. 3

    业务处理完成后返回纯文本 success,不要附加 HTML、JSON 或其他字符。

  4. 4

    平台在 8 秒内未收到 success 会判定本次通知失败。

自动重试

首次通知在支付成功后立即发送;失败后按 1、2、5、10 分钟重试,最多重试 4 次,总通知次数为 5 次。收到 success 后立即停止重试。

通知验签示例
$params = $_GET;
$received = base64_decode((string) ($params['sign'] ?? ''), true);
$content = buildSignContent($params);
$ok = openssl_verify($content, $received ?: '', $platformPublicKey, OPENSSL_ALGO_SHA256);
if ($ok !== 1) { http_response_code(400); exit('fail'); }
// 使用 out_trade_no 做幂等处理并核对 money
echo 'success';

错误说明与联调检查

接口失败时返回 code=-1 和具体 msg,以下为常见问题。

错误信息原因处理方式
请求参数为空 / 缺少商户ID未提交参数或 pid 缺失检查请求格式和 pid
签名校验失败参与签名参数、排序、密钥或私钥不一致打印待签名字符串逐项对比
请求时间戳无效或已过期V2 时间差超过 600 秒开启服务器 NTP 时间同步
当前商户未启用该支付方式没有启用对应支付配置在支付配置中启用微信或支付宝
当前支付金额暂无可用支付通道金额超出通道限制或路由无可用配置检查最小金额、最大金额、单日限额和路由
请先完成实名认证后使用该功能平台开启了商户强制认证完成实名认证后重新发起支付
商户订单号已存在相同订单号更换了场景或支付配置每笔业务使用稳定且唯一的订单号
退款API接口未开启用户关闭了退款 API 开关在用户中心 API 信息中开启退款 API
今日API退款笔数已达到上限当天待处理、处理中和成功的 API 退款记录达到配置上限次日再试或调整每日最大退款笔数
商户退款单号已存在,且退款订单或金额不一致重复使用退款单号但请求内容发生变化同一退款请求保持订单号和金额完全一致

上线前检查

  1. 1

    使用正式域名和 HTTPS notify_url。

  2. 2

    验证重复通知不会重复发货或重复入账。

  3. 3

    验证请求签名、响应验签和通知验签全部通过。

  4. 4

    使用真实的 0.01 元以上测试订单完成全流程联调。