签名算法
所有需要签名的接口使用相同的签名生成规则。签名参数 sign 不参与签名计算。
生成步骤
| 步骤 | 说明 |
| 1 | 收集所有请求参数,排除 sign、token 和值为空的参数 |
| 2 | 按参数名升序排列(ASCII字典序) |
| 3 | 拼接成 key1=value1&key2=value2&... 格式 |
| 4 | 在拼接串末尾直接追加商户的 token(不需要 & 符号) |
| 5 | 对整个字符串做 MD5,得到 32 位小写签名值 |
示例
pid = "1001"
amount = "0.01"
title = "测试商品"
token = "55d5fe1acc364d488263c10168bf2fc0"
str = "amount=0.01&pid=1001&title=测试商品"
str = "amount=0.01&pid=1001&title=测试商品55d5fe1acc364d488263c10168bf2fc0"
sign = md5(str) = "a1b2c3d4e5f6..."
注意:token 参数不放在请求URL中,仅用于签名计算。每个商户的 token 可在商户后台「API配置」页面查看。
1. 创建支付订单 GET/POST
https://pay.loxl.top/api/pay.php
请求参数
| 参数 | 类型 | 必填 | 说明 |
pid | string | 是 | 商户编号 |
amount | float | 是 | 支付金额(元),如 0.01 |
sign | string | 是 | 签名,见签名算法 |
title | string | 否 | 商品名称 |
notify_url | string | 否 | 异步回调地址,支付成功后通知商户 |
return_url | string | 否 | 支付成功后跳转地址 |
pay_type | int | 否 | 支付方式:0=自动,1=微信,2=支付宝 |
attach | string | 否 | 附加数据,回调时原样返回 |
format | string | 否 | 返回格式:json=返回JSON,page=跳转支付页(默认) |
JSON 响应示例
{
"code": 200,
"msg": "下单成功",
"data": {
"oid": "QRPAY2608121502081000",
"amount": "0.01",
"pay_type": 1,
"pay_url": "https://pay.loxl.top/pay.php?oid=QRPAY2608121502081000",
"qrcode": "wxp://f2f0_..."
}
}
不传 format=json 时,接口会自动 303 跳转到支付页面,用户扫码付款即可。
2. 查询订单状态 GET
https://pay.loxl.top/api/query.php
请求参数
| 参数 | 类型 | 必填 | 说明 |
oid | string | 是 | 订单号 |
pid | string | 否 | 商户编号(验签时需要) |
sign | string | 否 | 签名(带pid时需验签) |
响应示例
{
"code": 200,
"msg": "success",
"data": {
"oid": "QRPAY2608121502081000",
"amount": "0.01",
"status": 1,
"status_text": "已支付",
"pay_time": "2026-08-12 15:02:08"
}
}
订单状态码
| status | 含义 |
| 0 | 待支付 |
| 1 | 已支付 |
| 2 | 已关闭(超时未支付) |
| 3 | 已退款 |
3. 异步回调通知 POST
商户配置的 notify_url
用户支付成功后,系统会向商户配置的 notify_url 发送 POST 请求通知商户。商户需要验签并返回 SUCCESS 表示已收到。
回调参数
| 参数 | 类型 | 说明 |
oid | string | 订单号 |
pid | string | 商户编号 |
amount | float | 实际支付金额 |
status | int | 订单状态(1=已支付) |
pay_time | int | 支付时间戳 |
attach | string | 商户附加数据(原样返回) |
sign | string | 签名,商户需验签 |
商户处理逻辑
$params = $_POST;
$token = "你的商户token";
$sign = make_sign($params, $token);
if ($sign !== $params['sign']) {
exit('FAIL');
}
if ($params['status'] == 1) {
}
exit('SUCCESS');
注意:商户必须返回 SUCCESS,否则系统会重试通知(最多3次,间隔5分钟)。请做好幂等处理,避免重复发货。
4. 申请退款 POST
https://pay.loxl.top/api/refund.php
请求参数
| 参数 | 类型 | 必填 | 说明 |
pid | string | 是 | 商户编号 |
oid | string | 是 | 订单号 |
amount | float | 是 | 退款金额(不超过订单金额) |
sign | string | 是 | 签名 |
reason | string | 否 | 退款原因 |
响应示例
{
"code": 200,
"msg": "退款申请成功"
}
5. 完整对接示例
PHP 示例
<?php
$pid = '1001';
$token = '55d5fe1acc364d488263c10168bf2fc0';
$apiUrl = 'https://pay.loxl.top/api/pay.php';
$params = [
'pid' => $pid,
'amount' => '0.01',
'title' => '测试商品',
'notify_url' => 'https://your-site.com/notify.php',
'return_url' => 'https://your-site.com/return.php',
];
ksort($params);
$str = '';
foreach ($params as $k => $v) {
if ($v === '') continue;
$str .= "{$k}={$v}&";
}
$str = rtrim($str, '&');
$params['sign'] = md5($str . $token);
$url = $apiUrl . '?' . http_build_query($params);
header('Location: ' . $url);
exit;
回调验签示例
<?php
$token = '55d5fe1acc364d488263c10168bf2fc0';
$params = $_POST;
ksort($params);
$str = '';
foreach ($params as $k => $v) {
if ($k === 'sign' || $v === '') continue;
$str .= "{$k}={$v}&";
}
$str = rtrim($str, '&');
$sign = md5($str . $token);
if ($sign !== $params['sign']) {
exit('FAIL');
}
if ((int)$params['status'] === 1) {
}
exit('SUCCESS');