一行代码接入支付宝,支持当面付 · 手机网站 · 电脑网站 · 移动APP
app_id 和 app_key所有接口统一入口,通过 act 参数路由
所有请求需附带 sign 参数,签名算法为 MD5:
// 1. 收集所有参数(不含 sign) $params = ['app_id' => 'mer_xxx', 'act' => 'create', 'amount' => '9.99', 'subject' => '商品']; // 2. 按字母排序拼接 ksort($params); $str = 'act=create&amount=9.99&app_id=mer_xxx&subject=' . urlencode('商品'); // 3. 末尾追加 key $str .= 'key=' . $app_key; // 4. MD5 $sign = md5($str);
urlencode 再参与拼接。| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| app_id | string | ✅ | 商户ID,管理员分配 |
| act | string | ✅ | 固定值 create |
| amount | float | ✅ | 支付金额,单位:元,如 9.99 |
| subject | string | ✅ | 商品描述,会展示在支付宝收银台 |
| pay_method | string | 可选 | 支付方式:qrcode(当面付)、wap(手机网站)、page(电脑网站)、app(移动APP)。不传使用商户默认 |
| out_trade_no | string | 可选 | 商户订单号,留空自动生成(格式: PAY + 时间戳) |
| notify_url | string | 可选 | 支付成功回调地址,不传使用商户设置的默认回调URL |
| return_url | string | 可选 | 支付完成跳转地址(仅 wap/page 有效) |
| sign | string | ✅ | MD5签名 |
{
"ok": true,
"out_trade_no": "PAY20260517120000abc123",
"amount": "9.99",
"pay_method": "qrcode",
"qr_code": "https://qr.alipay.com/bax03431wmgn...",
"pay_url": "https://qr.alipay.com/bax03431wmgn..."
}
将 qr_code 生成二维码,用户用支付宝扫码即可支付。
{
"ok": true,
"out_trade_no": "PAY20260517120000abc123",
"amount": "9.99",
"pay_method": "wap",
"pay_url": "https://mclient.alipay.com/cashier/mobilepay.htm?...
}
将用户重定向到 pay_url,支付宝会自动调起APP或H5收银台。
{
"ok": true,
"out_trade_no": "PAY20260517120000abc123",
"amount": "9.99",
"pay_method": "page",
"pay_url": "https://unitradeprod.alipay.com/appAssign.htm?...
}
将用户重定向到 pay_url,打开支付宝PC收银台。
{
"ok": true,
"out_trade_no": "PAY20260517120000abc123",
"amount": "9.99",
"pay_method": "app",
"pay_url": "{支付宝返回的完整订单串}"
}
pay_url 是支付宝返回的完整订单串,需要在移动APP中通过支付宝SDK的 payInterceptorWithUrl 方法传入,由SDK调起支付宝APP完成支付。该接口需先在支付宝开放平台开通「APP支付」产品。| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| app_id | string | ✅ | 商户ID |
| act | string | ✅ | 固定值 query |
| out_trade_no | string | ✅ | 要查询的订单号 |
| sign | string | ✅ | MD5签名 |
{
"ok": true,
"out_trade_no": "PAY20260517120000abc123",
"status": "paid",
"amount": "9.99",
"subject": "测试商品",
"pay_method": "qrcode",
"trade_no": "2026051722001...",
"paid_at": "2026-05-17 12:05:30"
}
订单状态:pending(待支付)、paid(已支付)、expired(已超时)、canceled(已取消)
用户支付成功后,系统会 POST 通知商户设置的回调地址:
| 参数 | 说明 |
|---|---|
| out_trade_no | 商户订单号 |
| trade_no | 支付宝交易号 |
| amount | 支付金额(元) |
| status | 固定为 paid |
| paid_at | 支付时间 |
trade_no 再次调用查询接口做二次确认。
// 接收回调 $out_trade_no = $_POST['out_trade_no']; $trade_no = $_POST['trade_no']; $amount = $_POST['amount']; $status = $_POST['status']; if ($status === 'paid') { // 更新你的订单状态 // ... echo 'success'; // 必须返回 HTTP 200 }
| msg | 原因 |
|---|---|
| 缺少 app_id 或 sign | 未传必填参数 |
| 商户不存在或已停用 | app_id 无效或商户被禁用 |
| 签名验证失败 | sign 计算错误或 app_key 不匹配 |
| 金额必须大于0 | amount 参数无效 |
| 请填写商品描述 | subject 为空 |
| 订单号重复,请勿重复提交 | 同一订单号有 pending 状态的订单 |
| 支付宝未配置 | 系统未配置支付宝密钥 |
| 未知操作 | act 参数不是 create/query |
// 当面付完整示例 $app_id = 'mer_xxxxxxxxxx'; $app_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; $api = 'https://pay.j8y.cn/api/gateway.php'; // 构建参数 $params = [ 'app_id' => $app_id, 'act' => 'create', 'amount' => '0.01', 'subject' => '测试商品', 'pay_method' => 'qrcode', ]; // 计算签名 ksort($params); $str = ''; foreach ($params as $k => $v) { if ($v === '') continue; $str .= $k . '=' . $v . '&'; } $str .= 'key=' . $app_key; $params['sign'] = md5($str); // 发送请求 $ch = curl_init($api); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_RETURNTRANSFER => true, ]); $resp = curl_exec($ch); curl_close($ch); $result = json_decode($resp, true); if ($result['ok']) { echo "二维码: " . $result['qr_code']; }
有问题联系管理员 | 管理后台