FSJT 开放接口文档
面向外部开发者的 HTTP 接口说明。统一响应格式:{"success": true, "msg": ...}。
接口概览
基础信息
| 项目 | 说明 |
|---|---|
| Base URL | 当前站点根地址,即部署域名(如 https://x.feision.cn) |
| 数据格式 | 请求参数为 form-urlencoded / JSON,响应为 JSON |
| 统一响应 | {"success": true, "msg": 数据} 或 {"success": false, "msg": "错误信息"} |
| 认证方式 | ① 商户下单:参数签名 ② OAuth 2.0:access_token ③ 支付/商户中心:Session 登录 |
接口速览
| 方法 | 路径 | 用途 | 认证 |
|---|---|---|---|
| POST | /index/api/submit | 商户收款下单(付款链接/二维码) | 签名 |
| GET | /loadpay/:order_id | 收款订单付款落地页 | 无需 |
| GET | /developer/oauth/authorize | OAuth 2.0 网页授权 | 需登录 |
| POST | /developer/oauth/token | 授权码换 access_token | appid/appsecret |
| POST | /developer/oauth/refresh | 刷新 access_token | refresh_token |
| GET | /developer/api/userinfo | 获取用户信息(email/openid) | access_token |
| POST | /index/pay/api | 用户支付中心(转账/验证码/商户码) | Session |
| POST | /index/merchant/api | 商户接口(登录/分析/收款) | Session |
| POST | /index/auth/* | WebAuthn 生物认证(注册/登录) | Session |
| GET | /qr.php | 二维码 PNG 生成 | 无需 |
签名规则
必须调用「商户收款下单」等对外接口时,除 authorization 外的所有参数参与签名,签名值为 SHA256 十六进制小写。
签名步骤
authorization 参数ksort 升序k=v& 依次拼接,末尾追加 key={paykey}PHP 签名示例
$paykey = '商户的支付密钥(paykey)';
$params = [
'user_id' => 10001,
'code' => 'ORDER20260829001',
'notify_url' => 'https://example.com/notify',
'name' => '测试商品',
'amount' => '99.90',
'description' => '购买一件测试商品',
'type' => 'url',
'timestamp' => time(),
];
ksort($params); // 1. 键名升序
$str = '';
foreach ($params as $k => $v) {
if ($v !== '' && $v !== null) {
$str .= "{$k}={$v}&"; // 2. 拼接 k=v&
}
}
$str .= 'key=' . $paykey; // 3. 追加密钥
$params['authorization'] = hash('sha256', $str); // 4. SHA256
// 将 $params POST 到 /index/api/submit 即可
商户收款下单
/index/api/submit为收款用户创建「商户收款」订单(type=3)。type=url 返回付款链接,type=qrcode 返回付款二维码图片地址。
请求参数
| 参数 | 必填 | 说明 |
|---|---|---|
| user_id | 是 | 收款方用户 ID |
| code | 是 | 商户自定义订单号,同一 user_id 下不可重复 |
| notify_url | 是 | 支付结果通知回调地址(须为合法 URL) |
| name | 是 | 商品/订单名称 |
| amount | 是 | 金额(元) |
| description | 是 | 订单描述 |
| type | 是 | 返回类型:url 付款链接 / qrcode 二维码图片 |
| timestamp | 是 | 请求时间戳(秒) |
| authorization | 是 | 签名,见「签名规则」 |
成功响应
{"success": true, "msg": {
"user_id": 10001,
"code": "ORDER20260829001",
"order_id": 88888,
"url": "https://x.feision.cn/loadpay/88888", // type=url 时
"qrcode": "https://x.feision.cn/qr.php?text=..." // type=qrcode 时
}}
错误响应示例
{"success": false, "msg": "Invalid Authorization"}
收款订单付款落地页
/loadpay/:order_id浏览器直接访问,展示商家收款订单支付页面,支持扫码支付 / 验证码支付。供付款人打开,无需签名。
| 参数 | 必填 | 说明 |
|---|---|---|
| order_id | 是 | 路由参数,订单 ID |
行为
校验订单存在且为商户收款类型后渲染支付页;订单不存在或类型不符时返回错误提示。
OAuth 2.0 授权
需登录标准 OAuth 2.0 授权码流程:authorize 获取授权码 → token 换取 access_token → refresh 续期 → userinfo 获取用户信息。
授权流程
网页授权
/developer/oauth/authorize| 参数 | 必填 | 说明 |
|---|---|---|
| appid | 是 | 应用 ID |
| redirect_uri | 是 | 授权成功后的回调地址(URL 编码),须为应用登记的域名 |
| state | 是 | 随机状态参数,防止 CSRF |
| response_type | 是 | 固定为 code |
流程说明
校验通过后:未登录则跳转登录页;已登录则生成 24 小时有效的授权码 code,302 跳转 redirect_uri?code=xxx&state=xxx。
换取令牌
/developer/oauth/token用授权码换取 access_token(有效期 2 小时)与 refresh_token(有效期 30 天)。
| 参数 | 必填 | 说明 |
|---|---|---|
| grant_type | 是 | 固定为 authorization_code |
| code | 是 | authorize 回调获得的授权码 |
| appid | 是 | 应用 ID |
| appsecret | 是 | 应用密钥 |
成功响应
{"success": true, "msg": {
"access_token": "xxxx", "expires": 1755000000,
"refresh_token": "yyyy"
}}
刷新令牌
/developer/oauth/refreshaccess_token 过期后,用 refresh_token 换取新的 access_token(refresh_token 有效期 30 天)。
| 参数 | 必填 | 说明 |
|---|---|---|
| refresh_token | 是 | 换取令牌时返回的 refresh_token |
成功响应
{"success": true, "msg": {
"access_token": "zzzz", "expires": 1755000000, "extra": "access_token refreshed"
}}
获取用户信息
/developer/api/userinfo| 参数 | 必填 | 说明 |
|---|---|---|
| access_token | 是 | 换取令牌接口返回的 access_token |
成功响应
{"success": true, "msg": {"email": "user@example.com", "openid": "o12345"}}
错误响应示例
{"success": false, "msg": "access_token expired"}
用户支付中心接口
/index/pay/api需登录用户已登录状态下,通过 act 参数区分操作。会话过期返回 {"success": false, "msg": "Not Logged In"}。
act=create 创建转账订单(type=2)
| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | create |
| amount | 是 | 转账金额(元) |
| name | 否 | 订单名称 |
| description | 否 | 订单描述 |
成功返回 {"success": true, "msg": 88889}(order_id)。
act=query 查询订单状态
| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | query |
| order_id | 是 | base64 编码的 JSON:base64_encode(json_encode(["order_id" => 88889])) |
成功返回状态:pending(待支付)/ success(成功)/ scanned(已扫码);订单已关闭返回 {"success": false, "msg": "Order closed"}。
act=verify 发送邮箱验证码
| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | verify |
| order_id | 是 | 订单 ID |
act=confirm 验证码确认支付
| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | confirm |
| order_id | 是 | 订单 ID |
| code | 是 | 邮箱收到的 6 位验证码 |
act=merchant_create_qr 生成收款二维码
创建动态付款令牌,成功返回 {"success": true, "msg": {"token": "xxx", "imgsrc": "/qr.php?text=..."}}。令牌状态:1 待支付 / 9 已锁定 / 2 已使用 / 3 已关闭。
act=merchant_query 查询付款令牌状态
| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | merchant_query |
| token | 是 | 付款令牌 |
返回 pending / scanned / success(success 时附带订单信息)。
act=merchant_close 关闭付款令牌
| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | merchant_close |
| token | 是 | 付款令牌 |
商户接口
/index/merchant/api通过 act 参数区分操作。
act=login 商户登录
| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | login |
| account | 是 | 商户账号 |
| password | 是 | 商户密码 |
act=merchant_analysis 锁定并校验付款令牌
| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | merchant_analysis |
| token | 是 | 付款令牌(将锁定为状态 9) |
act=merchant_receive 商户收款(需已登录)
| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | merchant_receive |
| token | 是 | 付款令牌 |
| amount | 是 | 收款金额(元) |
WebAuthn 生物认证
需登录基于浏览器 WebAuthn API 的通行密钥(Passkey)认证,请求/响应均为 JSON。所有接口返回 {"success": true, "data": ...} 或 {"success": false, "msg": "..."}。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /index/auth/registerOptions | 参数 username,返回创建凭证选项(challenge 存于会话) |
| POST | /index/auth/registerVerify | JSON:clientDataJSON / attestationObject(base64),校验并保存凭证 |
| POST | /index/auth/loginOptions | 参数 username,返回登录选项(需已有凭证) |
| POST | /index/auth/loginVerify | JSON:clientDataJSON / authenticatorData / signature / id(base64),校验签名并更新计数器 |
二维码生成
/qr.php?text=&size=| 参数 | 必填 | 说明 |
|---|---|---|
| text | 是 | 二维码内容,需 base64 编码后传入 |
| size | 否 | 图片尺寸(像素),默认 180 |
直接返回 image/png 二维码图片,可嵌入 <img> 使用。
<img src="/qr.php?text=<?= base64_encode('https://x.feision.cn/loadpay/88888') ?>">