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/authorizeOAuth 2.0 网页授权需登录
POST/developer/oauth/token授权码换 access_tokenappid/appsecret
POST/developer/oauth/refresh刷新 access_tokenrefresh_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 十六进制小写。

签名步骤

1去除签名字段剔除 authorization 参数
2按键名排序所有参数键按字典序 ksort 升序
3拼接字符串跳过空值,按 k=v& 依次拼接,末尾追加 key={paykey}
4哈希对完整字符串做 sha256 得 authorization

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 即可
paykey 由收款用户在其个人中心获取,请妥善保管,切勿泄露。
POST

商户收款下单

/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"}
GET

收款订单付款落地页

/loadpay/:order_id

浏览器直接访问,展示商家收款订单支付页面,支持扫码支付 / 验证码支付。供付款人打开,无需签名。

参数必填说明
order_id路由参数,订单 ID

行为

校验订单存在且为商户收款类型后渲染支付页;订单不存在或类型不符时返回错误提示。

OAuth 2.0 授权

需登录

标准 OAuth 2.0 授权码流程:authorize 获取授权码 → token 换取 access_token → refresh 续期 → userinfo 获取用户信息。

授权流程

1authorize引导用户授权,回调获得 code
2token用 code + appsecret 换 access_token
3userinfo携带 access_token 获取用户信息
4refreshaccess_token 过期后用 refresh_token 续期
GET

网页授权

/developer/oauth/authorize
参数必填说明
appid应用 ID
redirect_uri授权成功后的回调地址(URL 编码),须为应用登记的域名
state随机状态参数,防止 CSRF
response_type固定为 code

流程说明

校验通过后:未登录则跳转登录页;已登录则生成 24 小时有效的授权码 code,302 跳转 redirect_uri?code=xxx&state=xxx

POST

换取令牌

/developer/oauth/token

用授权码换取 access_token(有效期 2 小时)与 refresh_token(有效期 30 天)。

参数必填说明
grant_type固定为 authorization_code
codeauthorize 回调获得的授权码
appid应用 ID
appsecret应用密钥

成功响应

{"success": true, "msg": {
    "access_token": "xxxx", "expires": 1755000000,
    "refresh_token": "yyyy"
}}
POST

刷新令牌

/developer/oauth/refresh

access_token 过期后,用 refresh_token 换取新的 access_token(refresh_token 有效期 30 天)。

参数必填说明
refresh_token换取令牌时返回的 refresh_token

成功响应

{"success": true, "msg": {
    "access_token": "zzzz", "expires": 1755000000, "extra": "access_token refreshed"
}}
GET

获取用户信息

/developer/api/userinfo
参数必填说明
access_token换取令牌接口返回的 access_token

成功响应

{"success": true, "msg": {"email": "user@example.com", "openid": "o12345"}}

错误响应示例

{"success": false, "msg": "access_token expired"}
POST

用户支付中心接口

/index/pay/api需登录

用户已登录状态下,通过 act 参数区分操作。会话过期返回 {"success": false, "msg": "Not Logged In"}

act=create 创建转账订单(type=2)

参数必填说明
actcreate
amount转账金额(元)
name订单名称
description订单描述

成功返回 {"success": true, "msg": 88889}(order_id)。

act=query 查询订单状态

参数必填说明
actquery
order_idbase64 编码的 JSON:base64_encode(json_encode(["order_id" => 88889]))

成功返回状态:pending(待支付)/ success(成功)/ scanned(已扫码);订单已关闭返回 {"success": false, "msg": "Order closed"}

act=verify 发送邮箱验证码

参数必填说明
actverify
order_id订单 ID

act=confirm 验证码确认支付

参数必填说明
actconfirm
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 查询付款令牌状态

参数必填说明
actmerchant_query
token付款令牌

返回 pending / scanned / success(success 时附带订单信息)。

act=merchant_close 关闭付款令牌

参数必填说明
actmerchant_close
token付款令牌
POST

商户接口

/index/merchant/api

通过 act 参数区分操作。

act=login 商户登录

参数必填说明
actlogin
account商户账号
password商户密码

act=merchant_analysis 锁定并校验付款令牌

参数必填说明
actmerchant_analysis
token付款令牌(将锁定为状态 9)

act=merchant_receive 商户收款(需已登录)

参数必填说明
actmerchant_receive
token付款令牌
amount收款金额(元)

WebAuthn 生物认证

需登录

基于浏览器 WebAuthn API 的通行密钥(Passkey)认证,请求/响应均为 JSON。所有接口返回 {"success": true, "data": ...}{"success": false, "msg": "..."}

方法路径说明
POST/index/auth/registerOptions参数 username,返回创建凭证选项(challenge 存于会话)
POST/index/auth/registerVerifyJSON:clientDataJSON / attestationObject(base64),校验并保存凭证
POST/index/auth/loginOptions参数 username,返回登录选项(需已有凭证)
POST/index/auth/loginVerifyJSON:clientDataJSON / authenticatorData / signature / id(base64),校验签名并更新计数器
GET

二维码生成

/qr.php?text=&size=
参数必填说明
text二维码内容,需 base64 编码后传入
size图片尺寸(像素),默认 180

直接返回 image/png 二维码图片,可嵌入 <img> 使用。

<img src="/qr.php?text=<?= base64_encode('https://x.feision.cn/loadpay/88888') ?>">