API 接口文档

本页面包含所有对外接口的请求参数、响应格式、签名算法和代码示例

目录

签名算法

所有需要签名的接口使用相同的签名生成规则。签名参数 sign 不参与签名计算。

生成步骤

步骤说明
1收集所有请求参数,排除 signtoken 和值为空的参数
2按参数名升序排列(ASCII字典序)
3拼接成 key1=value1&key2=value2&... 格式
4在拼接串末尾直接追加商户的 token(不需要 & 符号)
5对整个字符串做 MD5,得到 32 位小写签名值

示例

// 假设参数: pid = "1001" amount = "0.01" title = "测试商品" token = "55d5fe1acc364d488263c10168bf2fc0" // 第1步:排序后拼接 str = "amount=0.01&pid=1001&title=测试商品" // 第2步:末尾追加 token str = "amount=0.01&pid=1001&title=测试商品55d5fe1acc364d488263c10168bf2fc0" // 第3步:MD5 sign = md5(str) = "a1b2c3d4e5f6..."
注意:token 参数不放在请求URL中,仅用于签名计算。每个商户的 token 可在商户后台「API配置」页面查看。

1. 创建支付订单 GET/POST

https://pay.loxl.top/api/pay.php

请求参数

参数类型必填说明
pidstring商户编号
amountfloat支付金额(元),如 0.01
signstring签名,见签名算法
titlestring商品名称
notify_urlstring异步回调地址,支付成功后通知商户
return_urlstring支付成功后跳转地址
pay_typeint支付方式:0=自动,1=微信,2=支付宝
attachstring附加数据,回调时原样返回
formatstring返回格式: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

请求参数

参数类型必填说明
oidstring订单号
pidstring商户编号(验签时需要)
signstring签名(带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 表示已收到。

回调参数

参数类型说明
oidstring订单号
pidstring商户编号
amountfloat实际支付金额
statusint订单状态(1=已支付)
pay_timeint支付时间戳
attachstring商户附加数据(原样返回)
signstring签名,商户需验签

商户处理逻辑

// 1. 接收参数 $params = $_POST; // 2. 验签 $token = "你的商户token"; $sign = make_sign($params, $token); if ($sign !== $params['sign']) { exit('FAIL'); } // 3. 处理订单(更新数据库、发货等) if ($params['status'] == 1) { // 标记订单已支付,执行发货逻辑 } // 4. 返回成功标识(重要!) exit('SUCCESS');
注意:商户必须返回 SUCCESS,否则系统会重试通知(最多3次,间隔5分钟)。请做好幂等处理,避免重复发货。

4. 申请退款 POST

https://pay.loxl.top/api/refund.php

请求参数

参数类型必填说明
pidstring商户编号
oidstring订单号
amountfloat退款金额(不超过订单金额)
signstring签名
reasonstring退款原因

响应示例

{ "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); // 方式1:直接跳转到支付页(不传format=json) $url = $apiUrl . '?' . http_build_query($params); header('Location: ' . $url); exit; // 方式2:获取JSON响应(传format=json) /* $params['format'] = 'json'; $url = $apiUrl . '?' . http_build_query($params); $resp = file_get_contents($url); $data = json_decode($resp, true); // $data['data']['pay_url'] 为支付页面地址 */

回调验签示例

<?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');