快速开始
5 分钟跑通你的第一个 CAFINX 开放接口请求
快速开始
API 文档 v1.8 · 更新于 2026-08
Base URL:沙箱https://uat-openapi.cafinx.com/v1· 生产https://openapi.cafinx.com/v1
CAFINX 开放接口让你以商户身份程序化管理虚拟卡:开卡、充值、转出、冻结/销卡、共享卡组、查询交易与钱包流水,并接收 Webhook 异步事件。本页帮你在几分钟内跑通第一个请求。
开卡提示:并非所有卡产品都需要身份认证。请先
GET /card-products看该bin的requireThirdPartyKyc。
详见 卡产品与身份认证。
安全声明(摘要)
完整条款见控制台 API 文档侧栏「安全声明」或下文约定。要点:
- 密钥仅存服务端;禁止未授权渗透与滥用
- 因密钥泄露或对接不当造成的损失由商户自行承担
- 危害平台安全的行为,平台有权限制接入、冻结账户并依法追责
1. 开通开发者权限
在商户控制台 → 开发者中开通 API 权限。
未开通时:
- 网关所有接口返回 403(开发者权限未开通)
- 控制台内 API 文档页也不会下发内容
2. 创建凭证并上传公钥
在控制台创建凭证,你会得到:
- Access Key:以
ak_开头的公开标识,随每次请求发送 - 商户 RSA 私钥:由你自己生成,只存在你的服务端,用于给请求加签
- 把对应的商户 RSA 公钥上传到控制台,平台用它验签
私钥切勿外泄、切勿写进前端或提交到仓库。子账户不能使用开放网关凭证。
3. 配置 IP 白名单
在控制台把你调用服务器的出口公网 IP 加入白名单(支持 CIDR)。
- 未配置白名单 → 所有请求拒绝
- 不在白名单 → 返回 403(IP 不在白名单)
4. 选择环境地址(Base URL)
| 环境 | Base URL | 说明 |
|---|---|---|
| 沙箱 Sandbox | https://uat-openapi.cafinx.com/v1 | 联调、测试(推荐先走这里) |
| 生产 Production | https://openapi.cafinx.com/v1 | 正式业务 |
约定:
- 接口路径均相对上述 Base URL,例如:
GET https://uat-openapi.cafinx.com/v1/ping - 签名串里的 PATH 为不含域名的路径(如
/v1/ping),与请求 URI 一致 - Webhook 回调地址是商户自己的域名(在控制台配置),不是上述 API 域名
- 文档站:
https://doc.cafinx.com - OpenAPI 规范:
https://openapi.cafinx.com/v1/openapi.json(中文可加?locale=zh-CN) - 沙箱规范:
https://uat-openapi.cafinx.com/v1/openapi.json - Postman:导入仓库
docs-sync/postman/cafinx-openapi.postman_collection.json,签名头用「认证与签名」页示例生成 - 服务状态 / 工具下载:登录商户后台 → 开发者 → 工具与状态(OpenAPI / Postman / SDK 一键下载,见 服务状态)
- 服务水平:见 服务水平(SLA)
5. 发起第一个请求
所有请求都要带 4 个签名头(见 认证与签名)。最简单的联调接口是 GET /ping:
export BASE_URL="https://uat-openapi.cafinx.com/v1"
# 实际请用 SDK 或「认证与签名」页的代码生成 X-Signature
curl "$BASE_URL/ping" \
-H "X-Access-Key: ak_xxx" \
-H "X-Timestamp: 1710000000000" \
-H "X-Nonce: 3b1e...uuid" \
-H "X-Signature: <Base64 RSA-SHA256 签名>"成功返回统一信封:
{
"code": 200,
"message": "操作成功",
"data": {
"userNo": "CFX-XXXX",
"accessKey": "ak_xxx",
"serverTime": 1710000000000,
"message": "gateway ok"
}
}6. 推荐联调顺序
| 顺序 | 接口 | 说明 |
|---|---|---|
| 1 | GET /ping | 验签 + 网络 |
| 2 | GET /wallet | 查看 USD 余额 |
| 3 | GET /card-products | 可开卡 BIN(kind=standard 常规 / kind=shared 共享) |
| 4 | POST /cards | 开卡(须 X-Idempotency-Key) |
| 5 | POST /cards/{id}/recharge | 卡充值 |
| 6 | GET /transactions | 卡交易流水 |
| 7 | GET /wallet/flows | 钱包账变(含自动兑换 swap) |
共享卡(额度池)
若产品目录中 kind=shared:
POST /card-groups建池(bin+authMoney)POST /card-groups/{id}/sub-cards开附属卡POST /card-groups/{id}/recharge池充值
详见 API 参考中的 共享卡 分组。
7. 资金模型(重要)
- 消费(开卡费、卡充值等)只扣 USD 钱包
- USD 不足时,系统按实时汇率自动把数字货币兑成 USD 补足(静默、同事务)
- 自动兑换会写入
GET /wallet/flows的type=swap流水 - 资产仍不足 → 返回业务码 42201(余额不足)
无需单独调用「自动兑换」接口;也可以先走门户/App 的手动兑换。
8. 写接口与限流
- 所有 POST 写接口必须带
X-Idempotency-Key(≤64 字符,建议业务单号);24h 内同键同报文直接回放首次结果 - 凭证默认 600 次/分钟;
GET /cards/{id}/secure另限 60 次/分钟 - 假 Access Key / 假签名连打:同一 IP 约 20 次/分钟后直接返回 429(请求过于频繁)
9. 端到端示例(Node.js)
// 依赖:Node 18+(内置 crypto / fetch)。完整客户端见开发者 SDK 目录。
import crypto from 'crypto';
import fs from 'fs';
const BASE = 'https://uat-openapi.cafinx.com/v1';
const AK = 'ak_xxx';
const privateKey = fs.readFileSync('client_private_pkcs8.pem', 'utf8');
function sign(method, path, body = '') {
const ts = String(Date.now());
const nonce = crypto.randomUUID();
const bodyHash = crypto.createHash('sha256').update(body, 'utf8').digest('hex');
const raw = `${method}\n${path}\n${ts}\n${nonce}\n${bodyHash}`;
const signature = crypto.sign('RSA-SHA256', Buffer.from(raw), privateKey).toString('base64');
return { ts, nonce, signature };
}
async function api(method, path, bodyObj) {
const body = bodyObj ? JSON.stringify(bodyObj) : '';
const fullPath = path.startsWith('/v1') ? path : `/v1${path.replace(/^\/v1/, '')}`;
// 请求 URL 用 BASE + 资源路径;签名 PATH 与网关收到的一致,通常为 /v1/...
const signPath = fullPath.startsWith('/v1') ? fullPath : `/v1${path}`;
const resource = path.replace(/^\/v1/, '') || path;
const { ts, nonce, signature } = sign(method, signPath.startsWith('/v1') ? signPath : `/v1${resource}`, body);
const res = await fetch(`${BASE}${resource.startsWith('/') ? resource : '/' + resource}`, {
method,
headers: {
'Content-Type': 'application/json',
'X-Access-Key': AK,
'X-Timestamp': ts,
'X-Nonce': nonce,
'X-Signature': signature,
...(method === 'POST' ? { 'X-Idempotency-Key': crypto.randomUUID() } : {}),
},
body: body || undefined,
});
return res.json();
}
// 1) 连通性
console.log(await api('GET', '/ping'));
// 2) 余额
console.log(await api('GET', '/wallet'));
// 3) 卡产品
console.log(await api('GET', '/card-products'));生产将
BASE换成https://openapi.cafinx.com/v1。签名细节与 Java / Python / PHP / Go 示例见 认证与签名。
下一步
Updated about 2 months ago
Did this page help you?
