一行代码接入支付宝,支持当面付 · 手机网站 · 电脑网站 · 移动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 是支付宝返回的完整订单串(scheme URL),需要在移动APP中通过支付宝SDK的 payInterceptorWithUrl 方法传入,由SDK调起支付宝APP完成支付。该接口需先在支付宝开放平台开通「APP支付」产品。接入方APP通过我们的API创建订单后,拿到pay_url传给支付宝SDK即可唤起支付。
1. APP 调用后台 → POST /api/gateway.php (pay_method=app)
2. 后台返回 {"ok":true,"pay_url":"mobilecashier-pool:12200?..."}
3. APP 把 pay_url 传给支付宝 SDK → 唤起支付宝APP付款
4. 支付完成后支付宝回调 → 我们的系统通知商户
// 1. 调用支付中心 API 创建订单 String apiUrl = "https://pay.j8y.cn/api/gateway.php"; Map<String, String> params = new HashMap<>(); params.put("app_id", "你的APP_ID"); params.put("act", "create"); params.put("amount", "9.99"); params.put("subject", "商品名称"); params.put("pay_method", "app"); // 计算 MD5 签名(参考上方鉴权方式) params.put("sign", md5Sign(params, APP_KEY)); // 发送请求 String response = httpPost(apiUrl, params); JSONObject json = new JSONObject(response); // 2. 拿到 pay_url,传给支付宝SDK String orderInfo = json.getString("pay_url"); PayTask payTask = new PayTask(activity); Map<String, String> result = payTask.payV2(orderInfo, true); // PayTask.payV2() 会打开支付宝APP完成支付 // 支付结果通过 result 返回
// 1. 调用支付中心 API(建议在服务端做签名,APP只传参数) let apiUrl = "https://pay.j8y.cn/api/gateway.php" let params: [String: String] = [ "app_id": "你的APP_ID", "act": "create", "amount": "9.99", "subject": "商品名称", "pay_method": "app", "sign": md5Sign(params, APP_KEY) ] // 建议:签名在服务端完成,APP通过自己的后端调支付中心API // 2. 拿到 pay_url,调起支付宝 let orderString = json["pay_url"] as! String AlipaySDK.defaultService().payOrder( orderString, fromScheme: "你的URL Scheme", callback: { resultDict in // 支付结果回调 } )
app_key。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| 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']; }
有问题联系管理员 | 管理后台