PaYphp码支付系统API接口使用指南
PaYphp 码支付系统提供了完善的 API 接口,方便商户系统与支付系统进行对接。本文档将详细介绍 API 接口的使用方法和注意事项。
PaYphp 码支付系统的 API 接口采用 RESTful 风格设计,具有以下特点:
API 接口的基础地址为:
https://您的域名/api/v1
例如,创建订单的接口地址为:
https://您的域名/api/v1/order/create
所有 API 请求都需要进行签名认证,确保请求的合法性和安全性。认证信息包括:
假设请求参数如下:
{
"app_id": "10001",
"out_trade_no": "202401230001",
"total_amount": "100.00",
"subject": "测试商品",
"timestamp": "1611123456",
"nonce_str": "abcdef123456"
}
商户密钥为:a5f3f71efb96fe68b1b8f3791a1e2e1d
签名生成过程:
app_id=10001&nonce_str=abcdef123456&out_trade_no=202401230001&subject=测试商品×tamp=1611123456&total_amount=100.00&key=a5f3f71efb96fe68b1b8f3791a1e2e1dA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6最终请求参数:
{
"app_id": "10001",
"out_trade_no": "202401230001",
"total_amount": "100.00",
"subject": "测试商品",
"timestamp": "1611123456",
"nonce_str": "abcdef123456",
"sign": "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
}
该接口用于创建支付订单,获取支付链接或二维码。
POST /api/v1/order/create
| 参数名 | 类型 | 必填 | 描述 | |-------|------|-----|------| | app_id | String | 是 | 商户ID | | out_trade_no | String | 是 | 商户订单号,需保证唯一性 | | total_amount | String | 是 | 订单金额,单位元,精确到小数点后两位 | | subject | String | 是 | 商品标题 | | body | String | 否 | 商品描述 | | notify_url | String | 是 | 支付结果通知地址 | | return_url | String | 否 | 支付完成后跳转地址 | | payment_method | String | 否 | 支付方式,不传则显示所有可用支付方式 | | expire_time | Integer | 否 | 订单有效期,单位分钟,默认30分钟 | | timestamp | String | 是 | 请求时间戳 | | nonce_str | String | 是 | 随机字符串 | | sign | String | 是 | 请求签名 |
{
"app_id": "10001",
"out_trade_no": "202401230001",
"total_amount": "100.00",
"subject": "测试商品",
"body": "这是一个测试商品",
"notify_url": "https://www.example.com/notify",
"return_url": "https://www.example.com/return",
"payment_method": "wechat",
"expire_time": 30,
"timestamp": "1611123456",
"nonce_str": "abcdef123456",
"sign": "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
}
| 参数名 | 类型 | 描述 | |-------|------|-----| | code | Integer | 状态码,0表示成功,非0表示失败 | | message | String | 状态描述 | | data | Object | 响应数据 | | data.order_no | String | 系统订单号 | | data.out_trade_no | String | 商户订单号 | | data.total_amount | String | 订单金额 | | data.payment_url | String | 支付链接 | | data.qrcode_url | String | 二维码图片URL | | data.qrcode_data | String | 二维码内容 | | data.expire_time | String | 订单过期时间 |
{
"code": 0,
"message": "success",
"data": {
"order_no": "P202401230001",
"out_trade_no": "202401230001",
"total_amount": "100.00",
"payment_url": "https://pay.example.com/pay/P202401230001",
"qrcode_url": "https://pay.example.com/qrcode/P202401230001",
"qrcode_data": "https://pay.example.com/pay/P202401230001",
"expire_time": "2024-01-23 12:30:00"
}
}
该接口用于查询订单状态。
POST /api/v1/order/query
| 参数名 | 类型 | 必填 | 描述 | |-------|------|-----|------| | app_id | String | 是 | 商户ID | | order_no | String | 否 | 系统订单号,与商户订单号二选一 | | out_trade_no | String | 否 | 商户订单号,与系统订单号二选一 | | timestamp | String | 是 | 请求时间戳 | | nonce_str | String | 是 | 随机字符串 | | sign | String | 是 | 请求签名 |
{
"app_id": "10001",
"out_trade_no": "202401230001",
"timestamp": "1611123456",
"nonce_str": "abcdef123456",
"sign": "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
}
| 参数名 | 类型 | 描述 | |-------|------|-----| | code | Integer | 状态码,0表示成功,非0表示失败 | | message | String | 状态描述 | | data | Object | 响应数据 | | data.order_no | String | 系统订单号 | | data.out_trade_no | String | 商户订单号 | | data.total_amount | String | 订单金额 | | data.status | Integer | 订单状态:0-待支付,1-支付成功,2-支付失败,3-已关闭,4-已退款 | | data.payment_method | String | 支付方式 | | data.trade_no | String | 支付平台交易号 | | data.pay_time | String | 支付时间 | | data.create_time | String | 创建时间 |
{
"code": 0,
"message": "success",
"data": {
"order_no": "P202401230001",
"out_trade_no": "202401230001",
"total_amount": "100.00",
"status": 1,
"payment_method": "wechat",
"trade_no": "4200001234202401231234567890",
"pay_time": "2024-01-23 12:15:30",
"create_time": "2024-01-23 12:00:00"
}
}
该接口用于关闭未支付的订单。
POST /api/v1/order/close
| 参数名 | 类型 | 必填 | 描述 | |-------|------|-----|------| | app_id | String | 是 | 商户ID | | order_no | String | 否 | 系统订单号,与商户订单号二选一 | | out_trade_no | String | 否 | 商户订单号,与系统订单号二选一 | | timestamp | String | 是 | 请求时间戳 | | nonce_str | String | 是 | 随机字符串 | | sign | String | 是 | 请求签名 |
{
"app_id": "10001",
"out_trade_no": "202401230001",
"timestamp": "1611123456",
"nonce_str": "abcdef123456",
"sign": "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
}
| 参数名 | 类型 | 描述 | |-------|------|-----| | code | Integer | 状态码,0表示成功,非0表示失败 | | message | String | 状态描述 | | data | Object | 响应数据 | | data.order_no | String | 系统订单号 | | data.out_trade_no | String | 商户订单号 | | data.status | Integer | 订单状态:3-已关闭 |
{
"code": 0,
"message": "success",
"data": {
"order_no": "P202401230001",
"out_trade_no": "202401230001",
"status": 3
}
}
该接口用于对已支付的订单申请退款。
POST /api/v1/refund/apply
| 参数名 | 类型 | 必填 | 描述 | |-------|------|-----|------| | app_id | String | 是 | 商户ID | | order_no | String | 否 | 系统订单号,与商户订单号二选一 | | out_trade_no | String | 否 | 商户订单号,与系统订单号二选一 | | out_refund_no | String | 是 | 商户退款单号,需保证唯一性 | | refund_amount | String | 是 | 退款金额,不能大于订单金额 | | refund_reason | String | 否 | 退款原因 | | notify_url | String | 否 | 退款结果通知地址 | | timestamp | String | 是 | 请求时间戳 | | nonce_str | String | 是 | 随机字符串 | | sign | String | 是 | 请求签名 |
{
"app_id": "10001",
"out_trade_no": "202401230001",
"out_refund_no": "R202401230001",
"refund_amount": "100.00",
"refund_reason": "商品质量问题",
"notify_url": "https://www.example.com/refund_notify",
"timestamp": "1611123456",
"nonce_str": "abcdef123456",
"sign": "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
}
| 参数名 | 类型 | 描述 | |-------|------|-----| | code | Integer | 状态码,0表示成功,非0表示失败 | | message | String | 状态描述 | | data | Object | 响应数据 | | data.refund_no | String | 系统退款单号 | | data.out_refund_no | String | 商户退款单号 | | data.order_no | String | 系统订单号 | | data.out_trade_no | String | 商户订单号 | | data.refund_amount | String | 退款金额 | | data.status | Integer | 退款状态:0-处理中,1-退款成功,2-退款失败 |
{
"code": 0,
"message": "success",
"data": {
"refund_no": "R202401230001",
"out_refund_no": "R202401230001",
"order_no": "P202401230001",
"out_trade_no": "202401230001",
"refund_amount": "100.00",
"status": 0
}
}
该接口用于查询退款状态。
POST /api/v1/refund/query
| 参数名 | 类型 | 必填 | 描述 | |-------|------|-----|------| | app_id | String | 是 | 商户ID | | refund_no | String | 否 | 系统退款单号,与商户退款单号二选一 | | out_refund_no | String | 否 | 商户退款单号,与系统退款单号二选一 | | timestamp | String | 是 | 请求时间戳 | | nonce_str | String | 是 | 随机字符串 | | sign | String | 是 | 请求签名 |
{
"app_id": "10001",
"out_refund_no": "R202401230001",
"timestamp": "1611123456",
"nonce_str": "abcdef123456",
"sign": "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
}
| 参数名 | 类型 | 描述 | |-------|------|-----| | code | Integer | 状态码,0表示成功,非0表示失败 | | message | String | 状态描述 | | data | Object | 响应数据 | | data.refund_no | String | 系统退款单号 | | data.out_refund_no | String | 商户退款单号 | | data.order_no | String | 系统订单号 | | data.out_trade_no | String | 商户订单号 | | data.refund_amount | String | 退款金额 | | data.status | Integer | 退款状态:0-处理中,1-退款成功,2-退款失败 | | data.refund_time | String | 退款时间 | | data.create_time | String | 创建时间 |
{
"code": 0,
"message": "success",
"data": {
"refund_no": "R202401230001",
"out_refund_no": "R202401230001",
"order_no": "P202401230001",
"out_trade_no": "202401230001",
"refund_amount": "100.00",
"status": 1,
"refund_time": "2024-01-23 14:30:00",
"create_time": "2024-01-23 14:00:00"
}
}
当订单支付成功后,系统会向商户提供的 notify_url 发送支付结果通知。
| 参数名 | 类型 | 描述 | |-------|------|-----| | app_id | String | 商户ID | | order_no | String | 系统订单号 | | out_trade_no | String | 商户订单号 | | total_amount | String | 订单金额 | | status | Integer | 订单状态:1-支付成功 | | payment_method | String | 支付方式 | | trade_no | String | 支付平台交易号 | | pay_time | String | 支付时间 | | timestamp | String | 通知时间戳 | | nonce_str | String | 随机字符串 | | sign | String | 通知签名 |
{
"app_id": "10001",
"order_no": "P202401230001",
"out_trade_no": "202401230001",
"total_amount": "100.00",
"status": 1,
"payment_method": "wechat",
"trade_no": "4200001234202401231234567890",
"pay_time": "2024-01-23 12:15:30",
"timestamp": "1611123456",
"nonce_str": "abcdef123456",
"sign": "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
}
商户系统接收到通知后,需要返回以下格式的响应:
{
"code": 0,
"message": "success"
}
如果系统未收到正确的响应,将按照一定的时间间隔进行重试,重试次数和间隔可在后台配置。
当退款处理完成后,系统会向商户提供的退款通知地址发送退款结果通知。
| 参数名 | 类型 | 描述 | |-------|------|-----| | app_id | String | 商户ID | | refund_no | String | 系统退款单号 | | out_refund_no | String | 商户退款单号 | | order_no | String | 系统订单号 | | out_trade_no | String | 商户订单号 | | refund_amount | String | 退款金额 | | status | Integer | 退款状态:1-退款成功,2-退款失败 | | refund_time | String | 退款时间 | | timestamp | String | 通知时间戳 | | nonce_str | String | 随机字符串 | | sign | String | 通知签名 |
{
"app_id": "10001",
"refund_no": "R202401230001",
"out_refund_no": "R202401230001",
"order_no": "P202401230001",
"out_trade_no": "202401230001",
"refund_amount": "100.00",
"status": 1,
"refund_time": "2024-01-23 14:30:00",
"timestamp": "1611123456",
"nonce_str": "abcdef123456",
"sign": "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
}
商户系统接收到通知后,需要返回以下格式的响应:
{
"code": 0,
"message": "success"
}
| 错误码 | 描述 | 解决方案 | |-------|------|---------| | 0 | 成功 | - | | 1001 | 参数错误 | 检查请求参数是否完整、格式是否正确 | | 1002 | 签名错误 | 检查签名算法和商户密钥是否正确 | | 1003 | 商户不存在 | 检查商户ID是否正确 | | 1004 | 商户已禁用 | 联系管理员处理 | | 2001 | 订单不存在 | 检查订单号是否正确 | | 2002 | 订单已支付 | 不能重复支付,可查询订单状态 | | 2003 | 订单已关闭 | 订单已关闭,需要重新创建订单 | | 2004 | 订单已过期 | 订单已过期,需要重新创建订单 | | 3001 | 支付渠道错误 | 检查支付渠道参数是否正确 | | 3002 | 支付渠道未开通 | 联系管理员开通相应支付渠道 | | 4001 | 退款金额错误 | 检查退款金额是否正确,不能大于订单金额 | | 4002 | 订单未支付,不能退款 | 确认订单已支付后再申请退款 | | 4003 | 退款单不存在 | 检查退款单号是否正确 | | 9999 | 系统错误 | 联系技术支持处理 |
为了方便商户对接,PaYphp 码支付系统提供了多种语言的 SDK。
使用 Composer 安装:
composer require PaYphp/sdk
<?php
require 'vendor/autoload.php';
use PaYphp\SDK\Client;
$config = [
'app_id' => '10001',
'app_key' => 'a5f3f71efb96fe68b1b8f3791a1e2e1d',
'api_url' => 'https://您的域名/api/v1',
];
$client = new Client($config);
<?php
$params = [
'out_trade_no' => '202401230001',
'total_amount' => '100.00',
'subject' => '测试商品',
'body' => '这是一个测试商品',
'notify_url' => 'https://www.example.com/notify',
'return_url' => 'https://www.example.com/return',
'payment_method' => 'wechat',
'expire_time' => 30,
];
$result = $client->createOrder($params);
print_r($result);
<?php
$result = $client->queryOrder([
'out_trade_no' => '202401230001',
]);
print_r($result);
<?php
$result = $client->closeOrder([
'out_trade_no' => '202401230001',
]);
print_r($result);
<?php
$result = $client->applyRefund([
'out_trade_no' => '202401230001',
'out_refund_no' => 'R202401230001',
'refund_amount' => '100.00',
'refund_reason' => '商品质量问题',
]);
print_r($result);
<?php
$result = $client->queryRefund([
'out_refund_no' => 'R202401230001',
]);
print_r($result);
<?php
$notifyData = $_POST; // 获取通知数据
$isValid = $client->verifyNotify($notifyData);
if ($isValid) {
// 处理通知逻辑
echo json_encode(['code' => 0, 'message' => 'success']);
} else {
echo json_encode(['code' => 1002, 'message' => 'sign error']);
}
npm install PaYphp-sdk
const PaYphp = require('PaYphp-sdk');
const client = new PaYphp.Client({
appId: '10001',
appKey: 'a5f3f71efb96fe68b1b8f3791a1e2e1d',
apiUrl: 'https://您的域名/api/v1',
});
const params = {
outTradeNo: '202401230001',
totalAmount: '100.00',
subject: '测试商品',
body: '这是一个测试商品',
notifyUrl: 'https://www.example.com/notify',
returnUrl: 'https://www.example.com/return',
paymentMethod: 'wechat',
expireTime: 30,
};
client.createOrder(params)
.then(result => {
console.log(result);
})
.catch(error => {
console.error(error);
});
client.queryOrder({ outTradeNo: '202401230001' })
.then(result => {
console.log(result);
})
.catch(error => {
console.error(error);
});
为了保证系统稳定性,API 接口有调用频率限制:
| 接口类型 | 限制频率 | |---------|---------| | 创建订单 | 100次/分钟 | | 查询订单 | 300次/分钟 | | 关闭订单 | 60次/分钟 | | 申请退款 | 60次/分钟 | | 查询退款 | 300次/分钟 |
超出限制频率的请求会被拒绝,返回错误码 1005(请求频率超限)。
可能原因:
解决方法:
可能原因:
解决方法:
可能原因:
解决方法:
如果您在使用 API 接口过程中遇到问题,可通过以下方式获取支持:
我们会在收到您的问题后,尽快为您解答。