Skip to content

FuturePay UCard OpenAPI 对外接口文档

本文档整理 future-app 当前对外接口,面向外部商户系统对接使用。文档只描述接口路径、请求参数、响应字段和加签规则,不包含 Java 类名、源码路径和内部处理流程。

1. 加签说明

1.1 接入凭证

商户调用 OpenAPI 前需要获取一组启用状态的 OpenAPI 凭证:

说明
apiKey商户 Ed25519 公钥 raw bytes hex,同时作为请求头 X-Api-Key
merchantPrivateKey商户自己保存的 Ed25519 私钥,用于生成 X-Signature。FuturePay 不保存该私钥。
futurePayPublicKeyFuturePay 平台 Ed25519 公钥 raw bytes hex,用于商户验 FuturePay 响应签名。

1.2 请求签名 Header

正式环境下,除 FuturePay 明确约定免签的运维路径外,OpenAPI 请求均应携带以下 Header:

Header类型必填说明
X-Api-Keystring商户 Ed25519 公钥 hex。支持 64 位 raw public key hex,代码兼容部分 88 位格式。
X-Timestampstring毫秒级 Unix 时间戳,例如 1784611200000。默认允许服务端当前时间前后 300 秒。
X-Noncestring随机字符串,同一租户、同一环境、同一时间窗口内不可重复。
X-SignaturestringEd25519 签名结果,小写或大写 hex 均可,长度 128 位。

1.3 请求签名串

请求签名原文固定为:

text
METHOD|PATH|TIMESTAMP|NONCE|QUERY_STRING|RAW_BODY
片段说明
METHODHTTP 方法大写,例如 GETPOST
PATH实际请求路径,不包含域名和 query string。签名时必须使用服务端收到的路径。
TIMESTAMPX-Timestamp 完全一致。
NONCEX-Nonce 完全一致。
QUERY_STRING原始 query string,不包含 ?。没有 query 时为空字符串。
RAW_BODY原始请求体字符串。multipart/form-data 上传接口按空字符串参与签名。

路径说明:本文接口路径以 /openapi/v1/** 展示。如果直接访问 future-app 服务且部署保留应用上下文 /openapi/,完整请求路径可能是 /openapi/openapi/v1/**。签名中的 PATH 必须以实际 HTTP 请求路径为准。

1.4 签名步骤

  1. 生成毫秒级时间戳 timestamp
  2. 生成随机 nonce
  3. 准备原始请求体 rawBody。JSON 请求必须使用实际发送的 JSON 字符串;GET 请求和 multipart 上传请求使用空字符串。
  4. METHOD|PATH|TIMESTAMP|NONCE|QUERY_STRING|RAW_BODY 拼接签名串。
  5. 对签名串做一次 SHA-256,得到 32 字节摘要。
  6. 使用商户 Ed25519 私钥对摘要签名。
  7. 将签名结果转为 hex,放入 X-Signature

示例签名串:

text
POST|/openapi/v1/cards/recharge|1784611200000|nonce-001||{"requestNo":"REQ001","cardId":"CARD001","amount":10,"currency":"USDT"}

1.5 响应签名

FuturePay 在已完成 OpenAPI 鉴权的响应中写入平台签名 Header:

Header类型说明
X-FP-Api-KeystringFuturePay 平台 Ed25519 公钥 hex。
X-FP-TimestampstringFuturePay 生成响应签名时的毫秒级时间戳。
X-FP-SignaturestringFuturePay 平台响应签名 hex。
X-FP-Body-Hashstring响应 body 的 SHA-256 hex。

商户验响应签名时,签名原文为:

text
X-FP-Timestamp|RAW_RESPONSE_BODY

验签步骤:对上述原文做 SHA-256,再使用 X-FP-Api-Key 对应的 FuturePay 公钥验 X-FP-Signature

1.6 鉴权失败响应

鉴权失败时 HTTP 状态码可能为 401403,响应体仍使用统一结构:

json
{
  "code": 401,
  "msg": "SIGNATURE_INVALID: 签名校验失败",
  "data": null
}

常见错误码:

错误码HTTP 状态说明
API_KEY_MISSING401未传 X-Api-Key
API_KEY_INVALID401API Key 不存在、格式错误或环境不匹配。
REQUEST_HEADER_MISSING401缺少 X-TimestampX-NonceX-Signature
CREDENTIAL_DISABLED403凭证未启用、已禁用或已过期。
IP_NOT_ALLOWED403请求来源 IP 不在白名单。
SIGN_TIMESTAMP_EXPIRED401时间戳超出允许窗口或格式错误。
SIGNATURE_INVALID401签名校验失败。
NONCE_REPLAYED401nonce 已在时间窗口内使用。

2. 公共响应

所有业务接口响应体使用以下外层结构:

字段类型说明
codeinteger响应码。成功为 200
msgstring响应信息。成功通常为 操作成功
dataobject/null业务数据。无业务数据时为 null

分页数据结构:

字段类型说明
itemsarray当前页数据列表。
pageinteger当前页码。
pageSizeinteger每页数量。
totalinteger总数。

3. 接口清单

接口名方法路径
查询服务健康状态GET/openapi/v1/health
注册用户POST/openapi/v1/users/createUser
上传 KYC 图片POST/openapi/v1/users/uploadKycImage
提交用户 KYCPOST/openapi/v1/users/kyc
查询用户 KYC 状态GET/openapi/v1/users/kyc/status
绑卡POST/openapi/v1/users/bindCard
用户开卡POST/openapi/v1/cards/issueCard
查询可办卡类型GET/openapi/v1/cards/types
分页查询开卡订单GET/openapi/v1/cards/open-orders
查询开卡订单详情GET/openapi/v1/cards/open-orders/{cardOrderNo}
查询用户开卡状态GET/openapi/v1/cards/status
查询卡详情GET/openapi/v1/cards
查询用户卡列表GET/openapi/v1/cards/list
查询卡敏感信息GET/openapi/v1/cards/sensitive
查询卡余额GET/openapi/v1/cards/balance
查询卡交易记录GET/openapi/v1/cards/transactions
创建卡激活申请POST/openapi/v1/cards/activations
锁卡POST/openapi/v1/cards/lock
解锁POST/openapi/v1/cards/unlock
重新激活POST/openapi/v1/cards/reactivate
挂失POST/openapi/v1/cards/reportLost
修改 PINPOST/openapi/v1/cards/pin
卡充值POST/openapi/v1/cards/recharge
卡提现POST/openapi/v1/funds/cardWithdrawals

4. 健康检查

4.1 查询服务健康状态

内容
请求方法GET
请求路径/openapi/v1/health
请求类型无请求体

请求参数:无。

响应 data:无,成功时外层 msgok

json
{
  "code": 200,
  "msg": "ok",
  "data": null
}

5. 用户接口

5.1 注册用户

内容
请求方法POST
请求路径/openapi/v1/users/createUser
请求类型application/json

请求参数:

字段类型必填说明
emailstring用户邮箱。
firstNamestring名。
lastNamestring姓。
cardTypeIdstring卡类型 ID。

响应 data

字段类型说明
successboolean是否处理成功。
codestring平台响应码。
messagestring平台响应说明。
externalUserIdstring外部用户 ID。
emailstring用户邮箱。
firstNamestring名。
lastNamestring姓。
currencystring币种。
statusstring用户状态。
kycStatusstringKYC 状态。
accountIdstring账户 ID。
cardAccountIdstring卡账户 ID。
createdAtstring创建时间。

5.2 上传 KYC 图片

内容
请求方法POST
请求路径/openapi/v1/users/uploadKycImage
请求类型multipart/form-data

请求参数:

字段类型必填说明
filefileKYC 图片文件。签名时 RAW_BODY 使用空字符串。

响应 data

字段类型说明
successboolean是否处理成功。
codestring平台响应码。
messagestring平台响应说明。
filestring服务端文件名。
pathstring服务端文件路径。
urlstring图片访问地址。
contentTypestring图片 MIME 类型。
sizeinteger图片大小,单位字节。
originalNamestring原始文件名。

5.3 提交用户 KYC

内容
请求方法POST
请求路径/openapi/v1/users/kyc
请求类型application/json

请求参数:

字段类型必填说明
emailstring用户邮箱。
namestring姓名。
birthdaystring生日。
documentTypestring证件类型。
documentNumberstring证件号码。
frontImageUrlstring证件正面图片地址。
backImageUrlstring证件背面图片地址。
memberIdstring平台成员 ID。

响应 data

字段类型说明
successboolean是否处理成功。
codestring平台响应码。
messagestring平台响应说明。
externalUserIdstring外部用户 ID。
kycRecordIdstringKYC 记录 ID。
statusstring状态。
localStatusstring平台状态。
cardAccountIdstring卡账户 ID。
accountIdstring账户 ID。

5.4 查询用户 KYC 状态

内容
请求方法GET
请求路径/openapi/v1/users/kyc/status
请求类型query

请求参数:

字段类型必填说明
emailstring用户邮箱。
cardTypeIdstring卡类型 ID。

响应 data:同“提交用户 KYC”。

5.5 绑卡

内容
请求方法POST
请求路径/openapi/v1/users/bindCard
请求类型application/json

请求参数:

字段类型必填说明
cardNostring卡号或供应商卡 ID,最大 128 位。
cardTypeIdstring卡类型 ID,最大 64 位。
emailstring预留邮箱,最大 128 位。

响应 data:同“查询卡详情”的 data

6. 卡接口

6.1 用户开卡

内容
请求方法POST
请求路径/openapi/v1/cards/issueCard
请求类型application/json

请求参数:

字段类型必填说明
requestNostring调用方业务幂等号,1 到 64 位可见 ASCII 字符,不能包含空格。
emailstring用户邮箱。
cardTypeIdstring卡类型 ID,最大 64 位。
embossedNamestring卡面姓名。
cardSuffixstring指定卡号尾号。
mobilestring预留手机号。

响应 data

字段类型说明
cardOrderNostring平台开卡订单号。
requestNostring调用方业务幂等号。
emailstring用户邮箱。
memberIdstring平台成员 ID。
cardTypeIdstring卡类型 ID。
currencystring发卡币种。
typestring卡类型。
feeAmountstring开卡手续费金额,非科学计数法字符串。
feeAssetCodestring开卡手续费资产。
acceptedboolean是否已受理。
statusstring平台开卡状态,常见值 PROCESSINGSUCCESSFAILED
failCodestring失败码。
failMessagestring失败说明。
last4string卡号后四位。
expiryMonthstring过期月份。
expiryYearstring过期年份。
createTimestring订单创建时间。
completedTimestring订单终态时间。

6.2 查询可办卡类型

内容
请求方法GET
请求路径/openapi/v1/cards/types
请求类型query

请求参数:

字段类型必填默认值说明
cardTypestring卡类型,如 PHYSICALVIRTUAL,最大 32 位。
currencystring币种,如 USD,最大 16 位。
cardSchemestring卡组织,如 VISAMASTERCARD,最大 32 位。
pageinteger1页码,最小 1。
pageSizeinteger20每页数量,1 到 100。

响应 data

字段类型说明
itemsarray卡类型列表。
items[].cardTypeIdstring卡类型 ID。
items[].displayNamestring展示名称。
items[].cardTypestring卡类型。
items[].currencystring币种。
items[].cardSchemestring卡组织。
items[].priceAmountstring开卡价格金额。
items[].priceAssetCodestring开卡价格资产。
items[].cardImageUrlstring卡图片 URL。
items[].cardDescstring卡描述。
items[].featureTagsarray特性标签。
items[].sortOrderinteger排序。
pageinteger当前页码。
pageSizeinteger每页数量。
totalinteger总数。
filters.cardTypes[]array卡类型筛选项,元素含 valuelabel
filters.currencies[]array币种筛选项,元素含 valuelabel
filters.cardSchemes[]array卡组织筛选项,元素含 valuelabel
bindCardEntry.enabledboolean是否展示已有 FuturePay 卡绑卡入口。
bindCardEntry.pathstring绑卡接口路径。

6.3 分页查询开卡订单

内容
请求方法GET
请求路径/openapi/v1/cards/open-orders
请求类型query

请求参数:

字段类型必填默认值说明
requestNostring调用方业务幂等号,最大 64 位。
memberIdstring平台成员 ID,最大 64 位。
emailstring用户邮箱。
cardTypeIdstring卡类型 ID,最大 64 位。
statusstring对外状态,允许 PROCESSINGSUCCESSFAILED
createTimeStartstring创建时间起点,格式 yyyy-MM-dd HH:mm:ss
createTimeEndstring创建时间终点,格式 yyyy-MM-dd HH:mm:ss
pageinteger1页码,最小 1。
pageSizeinteger20每页数量,1 到 100。

响应 data:分页结构,items[] 字段同“查询开卡订单详情”。

6.4 查询开卡订单详情

内容
请求方法GET
请求路径/openapi/v1/cards/open-orders/{cardOrderNo}
请求类型path

请求参数:

字段类型必填说明
cardOrderNostring平台开卡订单号。

响应 data

字段类型说明
cardOrderNostring平台开卡订单号。
requestNostring调用方业务幂等号。
memberIdstring平台成员 ID。
emailstring用户邮箱。列表中可能脱敏,详情中完整展示。
cardTypeIdstring卡类型 ID。
currencystring卡产品币种。
typestring卡类型展示值。
feeAmountstring开卡手续费金额。
feeAssetCodestring开卡手续费资产。
acceptedboolean本地订单是否已经受理。
statusstring对外状态。
failCodestring失败码。
failMessagestring失败说明。
last4string卡号后四位。
expiryMonthstring过期月份。
expiryYearstring过期年份。
createTimestring订单创建时间。
completedTimestring订单终态时间。

6.5 查询用户开卡状态

内容
请求方法GET
请求路径/openapi/v1/cards/status
请求类型query

请求参数:

字段类型必填默认值说明
emailstring用户邮箱。
cardTypeIdstring卡类型 ID。
statusstring卡状态。
pageinteger1页码。
pageSizeinteger20每页数量。

响应 data:分页结构,items[] 字段同“查询卡详情”。

6.6 查询卡详情

内容
请求方法GET
请求路径/openapi/v1/cards
请求类型query

请求参数:

字段类型必填说明
cardIdstring卡 ID。

响应 data

字段类型说明
cardIdstring卡 ID。
cardAccountIdstring卡账户 ID。
cardNamestring卡名称。
cardImageUrlstring卡图片 URL。
cardNoMaskedstring脱敏卡号。
statusstring卡状态。
embossedNamestring持卡人姓名。
networkstring卡组织。
productIdstring产品 ID。
productNamestring产品名称。
cardTypestring卡类型。
mobilestring手机号。
expiryMonthstring过期月份。
expiryYearstring过期年份。
last4string卡号后四位。
dailyLimitnumber日限额。
singleTransactionLimitnumber单笔限额。
availableLimitnumber可用限额。
cardLimitnumber卡限额。
cardEmailstring卡邮箱。
currencystring币种。
availablestring可用余额。
ledgerstring账面余额。

6.7 查询用户卡列表

内容
请求方法GET
请求路径/openapi/v1/cards/list
请求类型query

请求参数:

字段类型必填默认值说明
emailstring用户邮箱。
statusstring卡状态。
pageinteger1页码。
pageSizeinteger20每页数量。

响应 data:分页结构,items[] 字段同“查询卡详情”。

6.8 查询卡敏感信息

内容
请求方法GET
请求路径/openapi/v1/cards/sensitive
请求类型query

请求参数:

字段类型必填说明
cardNostring卡号或卡 ID。

响应 data

字段类型说明
cardIdstring卡 ID。
algorithmstring加密算法。
ivstringAES-GCM IV。
authTagstringAES-GCM 认证标签。
ciphertextstring加密内容。
cardNostring卡号。
cvvstringCVV。
expiryMonthstring过期月份。
expiryYearstring过期年份。

6.9 查询卡余额

内容
请求方法GET
请求路径/openapi/v1/cards/balance
请求类型query

请求参数:

字段类型必填说明
cardNostring卡号或卡 ID。

响应 data

字段类型说明
cardIdstring卡 ID。
balances[]array账户余额列表。
balances[].accountIdstring账户 ID。
balances[].assets[]array资产余额列表。
balances[].assets[].assetstring资产。
balances[].assets[].availablenumber可用余额。
balances[].assets[].balancenumber账面余额。
notestring响应备注。
currencystring币种。
availablestring可用余额。
ledgerstring账面余额。

6.10 查询卡交易记录

内容
请求方法GET
请求路径/openapi/v1/cards/transactions
请求类型query

请求参数:

字段类型必填默认值说明
cardNostring卡号或卡 ID。
statusstring交易状态。
currencystring币种。
fromTimestring开始时间。
toTimestring结束时间。
pageinteger1页码。
pageSizeinteger20每页数量。

响应 data:分页结构,items[] 包含:

字段类型说明
idstring交易 ID。
cardIdstring卡 ID。
amountstring金额。
currencystring币种。
statusstring状态。
occurredAtstring发生时间。

6.11 创建卡激活申请

内容
请求方法POST
请求路径/openapi/v1/cards/activations
请求类型application/json

请求参数:

字段类型必填说明
cardNostring卡号或卡 ID,最大 128 位。
namestring用户姓名,最大 128 位。

响应 data

字段类型说明
successboolean是否处理成功。
codestring平台响应码。
messagestring平台响应说明。
activationIdstring激活申请 ID。
cardIdstring卡 ID。
cardNostring卡号。
cardAccountIdstring卡账户 ID。
statusstring状态。
createdAtstring创建时间。

6.12 锁卡

内容
请求方法POST
请求路径/openapi/v1/cards/lock
请求类型application/json

请求参数:

字段类型必填说明
cardNostring卡号或卡 ID。
reasonstring操作原因。
remarkstring备注。

响应 datanull

6.13 解锁

内容
请求方法POST
请求路径/openapi/v1/cards/unlock
请求类型application/json

请求参数:同“锁卡”。

响应 datanull

6.14 重新激活

内容
请求方法POST
请求路径/openapi/v1/cards/reactivate
请求类型application/json

请求参数:同“锁卡”。

响应 datanull

6.15 挂失

内容
请求方法POST
请求路径/openapi/v1/cards/reportLost
请求类型application/json

请求参数:同“锁卡”。

响应 datanull

6.16 修改 PIN

内容
请求方法POST
请求路径/openapi/v1/cards/pin
请求类型application/json

请求参数:

字段类型必填说明
cardNostring卡号或卡 ID。
pinstringPIN。

响应 datanull

6.17 卡充值

内容
请求方法POST
请求路径/openapi/v1/cards/recharge
请求类型application/json

请求参数:

字段类型必填说明
requestNostring调用方业务幂等号,1 到 64 位可见 ASCII 字符,不能包含空格。
cardIdstring卡 ID,最大 128 位。
amountnumber充值金额,大于 0,最多 18 位整数和 18 位小数。
currencystring币种,最大 32 位。

响应 data

字段类型说明
orderNostring平台充值订单号。
requestNostring调用方业务幂等号。
cardIdstring卡 ID。
amountstring充值金额。
currencystring充值币种。
feeAmountstring手续费金额。
feeCurrencystring手续费币种。
acceptedboolean是否已受理。
statusstring订单状态。
failCodestring失败码。
failMessagestring失败说明。
createTimestring订单创建时间。
completedTimestring订单终态时间。

7. 资金接口

7.1 卡提现

内容
请求方法POST
请求路径/openapi/v1/funds/cardWithdrawals
请求类型application/json

请求参数:

字段类型必填说明
requestNostring调用方业务幂等号,最大 64 位。
cardIdstring卡 ID,最大 128 位。
amountnumber提现金额,大于 0,最多 18 位整数和 18 位小数。
currencystring币种,最大 32 位。

响应 data

字段类型说明
orderNostring平台提现订单号。
requestNostring调用方业务幂等号。
cardIdstring卡 ID。
amountnumber提现金额。
currencystring提现币种。
feeAmountnumber总手续费金额。
platformFeeAmountnumber平台手续费金额。
tenantFeeAmountnumber租户手续费金额。
totalAmountnumber提现总扣减金额。
acceptedboolean是否已受理。
statusstring订单状态,常见值 PROCESSINGSUCCESSFAILED
failCodestring失败码。
failMessagestring失败说明。
createTimestring订单创建时间。
completedTimestring订单终态时间。