# 加密支付(普通模式)API文档
# 1. 如何获取API Key
用户登录收银台 -> 开发者中心 -> API Key -> 创建API key。API Key 都有单独的配置页,并绑定固定的 IP 地址(“0.0.0.0”表示不做 IP 拦截过滤,任何IP都可以访问),可配置不同的 API Key 满足不同的需求。请不要泄露您的 Access Key 及 Secret Key,以免造成资产损失。Secret Key 生成后将无法再次查看,请注意及时保存,如您忘记了 Secret Key,请在商户后台回收该密钥对并申请新的密钥对。
# 1.1 如何创建API KEY
• 点击开发者中心-API Key
• 1选择是否开启调试模式 ( 开启调试模式后,你有任何错误会有规范的提示信息和日志查看地址 )
• 2选择API Key权限
• 3输入白名单地址 (0.0.0.0 表示任意IP地址可以访问)
注:( 输⼊⽩名单域名时应注意多个IP时用","隔离。)
• 4点击创建,可⽣成API KEY
(⽣成API KEY后可以在下⽅我的API KEY列表进⾏复制、查看、编辑和删除等操作,注意Secret key只在生成的时候出现一次,请妥善保存,如您忘记了Secret Key,请回收该密钥对并申请新的密钥对。)
• 点击编辑可关闭或开启【开始调试】及修改API Key权限和白名单地址,修改完成后点击保存即可
注意:创建或编辑API Key之后请耐心等待90秒API Key生效
# 2. 如何使用API Key
当前API Key是在请求的Header中添加参数列表
参数名 | 参数说明 | 类型 | 是否必须 |
---|---|---|---|
access_key | Api Key 访问密钥 (如:TPhoa7ZQ) | String | 是 |
timestamp | 毫秒级时间戳(13位 如:1679669488472) | String | 是 |
nonce | UUID(36位 如:02f7a04f-53cc-47d4-bb3f-fae69dab49ac) 五个部分分别为8个字符、4个字符、4个字符、4个字符、12个字符,中间用“-”号间隔 | String | 是 |
sign | 参数签名 (如:GXx2wYUD6UVr+zcmeCSFFPzcBLA=) | String | 是 |
# 3. 技术侧参数接入流程
# 4. 如何接口签名
# 签名说明
API 请求在通过 internet 传输的过程中极有可能被篡改,为了确保请求未被更改,除公共接口(基础信息,行情数据等)外的私有接口均必须使用您的 API Key 做签名认证,以校验参数或参数值在传输途中是否发生了更改。
一个合法的请求由以下几部分组成:
- access_key: API 访问密钥;
- secret_key: 签名加密所使用的密钥(仅在后台申请 API Key 时可见一次,请复制保存在安全处,不可泄露);
- timestamp: 您发出请求的时间 (UTC 时间) 。如:1632811287325(13位)。在查询请求中包含此值有助于防止第三方截取您的请求;
- nonce: 随机 UUID 字符串。如:053a1b81-48a0-4bb1-96b2-60f6e509d911(36位);
- sign: 签名计算得出的值,用于确保签名有效和未被篡改;
- 所有接口都需要在http请求头 (header) 中传递以上除 secret_key 外的几个公共参数,公共参数包含(access_key ,timestamp,nonce,sign)其他涉及到签名参数以API接口说明为准 。
# 签名步骤
1.定义一个 Map 字典类型对象,将请求中的参数以 key-value 的形式放入其中
2.将 access_key、timestamp、nonce 也放入第一步定义的 Map 中
3.将 Map 里面的属性按照 ASCII 码从小到大做升序排序(字典序)并将 Map 转换输出为“key1=value1&key2=value2” 形式的字符串
4.将上一步转换的字符串用 secret_key 进行 HMAC_SHA1 加密并进行 Base64 转码,得到 sign 参数值。secret_key 是在收银平台创建的 apikey 中的信息
5.将 sign 值和其他所需参数加到请求头 header 中,发送请求目标接口
# 签名调试工具
SignUtil: 用户登录收银台 -> 开发者中心 -> API 文档 -> 签名工具 打开签名工具页面 (工具中的access_key请使用有效的access_key 并且请设置允许这个access_key访问的IP白名单为 0.0.0.0,我们强烈推荐使用过的access_key调试完成后废弃)
# 5. 接口列表
# 5.1 测试接口连通性
请求方式
Get
请求URL
/ping
响应数据
{"version":"1.0.1","timestamp":1688116827306}
响应参数说明
Param | Type | Desc |
---|---|---|
version | String | 返回该参数则本文档中所有接口都可正常请求 |
timestamp | int64 | Unix时间戳 |
# 5.2 公共费率的请求返回
请求方式
Post
请求URL
/api/v3/wallet/rate
请求类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
请求头
Param | Desc | Sample |
---|---|---|
access_key | 商户后台获取 | pFqV75X3 |
timestamp | Unix时间戳13位 毫秒 | 1679724896223 |
nonce | UUID V4 | 794c26b0-d33c-4394-b2bb-c485eca16d9e |
sign | 计算出来的签名 | kAXyh+eerqrefyaF8dyFB0M4FVo= |
请求参数
{"currencyCode": "USD",
"coinCode": "USDT"}
请求参数说明
Param | Desc | Require |
---|---|---|
currencyCode | 法币code USD CNY EUR GBP MXN PHP CAD TRY(String) | required |
coinCode | 代币code USDT USDC BUSD TUSD DAI(String) | required |
响应类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
响应数据
{
"code": "200",
"success": true,
"msg": "成功",
"msgEn": "SUCCESS",
"data": {
"symbol": "USDT",
"quote": "USD",
"price": 0.994,
"active": true
}
}
响应参数说明
Param | Type | Desc |
---|---|---|
symbol | String | 代币类型 |
quote | String | 法币类型 |
price | float64 | 汇率 |
active | bool | 是否可用 |
# 5.3 币安率的请求返回
请求方式
Post
请求URL
/api/v3/wallet/binance/rate
请求类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
请求头
Param | Desc | Sample |
---|---|---|
access_key | 商户后台获取 | pFqV75X3 |
timestamp | Unix时间戳13位 毫秒 | 1679724896223 |
nonce | UUID V4 | 794c26b0-d33c-4394-b2bb-c485eca16d9e |
sign | 计算出来的签名 | kAXyh+eerqrefyaF8dyFB0M4FVo= |
请求参数
"currencyCode": "USD",
"coinCode": "USDT"
请求参数说明
Param | Desc | Require |
---|---|---|
currencyCode | 法币code USD CNY EUR GBP MXN PHP CAD TRY (String) | required |
coinCode | 代币code USDT USDC BUSD TUSD DAI (String) | required |
响应类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
响应数据
{
"code": "200",
"success": true,
"msg": "成功",
"msgEn": "SUCCESS",
"data": {
"symbol": "USDT",
"quote": "USD",
"price": 0.994,
"active": true
}
}
响应参数说明
Param | Type | Desc |
---|---|---|
symbol | String | 代币类型 |
quote | String | 法币类型 |
price | float64 | 汇率 |
active | bool | 是否可用 |
# 5.4 新增收款订单
请求方式
Post
请求URL
/api/v3/wallet/pay
请求类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
请求头
Param | Desc | Sample |
---|---|---|
access_key | 商户后台获取 | pFqV75X3 |
timestamp | Unix时间戳13位 毫秒 | 1679724896223 |
nonce | UUID V4 | 794c26b0-d33c-4394-b2bb-c485eca16d9e |
sign | 计算出来的签名 | kAXyh+eerqrefyaF8dyFB0M4FVo= |
请求参数
{
"externalOrderId": "402297358314559082",
"cashierChainType": "ETH",
"cashierTokenType": "USDT",
"cashierCryptoAmount": "1",
"cashierCurrencyType": "USD",
"hiddenMerchantLogo": 0,
"hiddenMerchantName": 0,
"notifyUrl": "http://192.168.1.135:30002/url",
"remark": "123"
}
请求参数说明
Param | Desc | Require |
---|---|---|
externalOrderId | 商户订单ID max=64 (String) | required |
cashierChainType | 收银台链类型 ETH BTC TRON BSC POLYGON SOLANA(String) | optional |
cashierTokenType | 收银台令牌类型 =PXP GOUT BTC SOL MATIC NEXO OSMO GLM BAL TRB PYR BORA WBTC HEX TEL NAKA EDU ORBS SURE C98 CAT WER ADS OPL SDG OPO PPT SSV JDK WWG BBO USDT TRX TON LINK DAI SHIB UNI LEO OKB XRP ADA DOGE DOT LTC BCH FIL NEAR EGLD XTZ ETC USDC TUSD BUSD ETH BNB USDT1 IDO1 IDO2 IDO3 IDO4 Game1 TON1 CVX(String) | optional |
cashierCryptoAmount | 收银台加密金额,小数点后不能大于 6 位(String) | optional |
cashierCurrencyAmount | 收银台法币金额,小数点后不能大于 2 位(String) | optional |
cashierCurrencyType | 收银台法币类型 USD BRL CNY(String) | optional |
hiddenMerchantLogo | 收银台是否隐藏商户Logo 0 或1(int64) | optional |
hiddenMerchantName | 收银台是否隐藏商户名 0或1(int64) | optional |
notifyUrl | 通知地址(String,url) | optional |
remark | 备注 max=1024(String) | optional |
successRedirectUrl | 返回地址(String) | optional |
响应类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
响应数据
{
"code": "200",
"success": true,
"msg": "成功",
"msgEn": "SUCCESS",
"data": {
"cashierId": "OCRYPPAID202307310902391690794159250DOCKER020000000200001107",
"cashierUrl": "http://192.168.1.74:89/OCRYPPAID202307310902391690794159250DOCKER020000000200001107",
"cashierExpireTime": 1690794759313,
"cashierCryptoAmount": 1,
"cashierCurrencyAmount": 0.98,
"cashierRate": 0.983,
"cashierCurrencyType": "USD",
"cashierTokenType": "USDT",
"cashierChainType": "ETH",
"isHiddenMerchantName": false,
"isHiddenMerchantLogo": false,
"externalOrderId": "402297358314559082",
"remark": "123",
"cryptoOrder": {
"addressTo": "0xe072c63c1e04f8c6f36133f6629f66778147d5d8",
"orderId": "OCRYPPAID202307310902391690794159441DOCKER020000000400001108",
"externalOrderId": "402297358314559082",
"exchangeRate": 0.983,
"currencyAmount": "0.98",
"cryptoAmount": "1",
"currencyType": "USD",
"tokenType": "USDT",
"chainType": "ETH",
"orderStatus": "Wait pay",
"orderStatusCode": 1,
"orderExpireTime": 1690801360527
}
}
}
响应参数说明
Param | Type | Desc |
---|---|---|
cashierId | String | 收银台Id |
cashierUrl | String | 收银台URL |
cashierExpireTime | int64 | 收银台过期时间 |
cashierCryptoAmount | float64 | 收银台加密金额 |
cashierCurrencyAmount | float64 | 收银台法币金额 |
cashierRate | float64 | 收银台当前汇率 |
cashierCurrencyType | String | 收银台法币类型 |
cashierTokenType | String | 收银台加密货币类型 |
cashierChainType | String | 收银台加密主链类型 |
isHiddenMerchantName | bool | 收银台是否隐藏商户Logo |
isHiddenMerchantLogo | bool | 收银台是否隐藏商户名 |
externalOrderId | String | 商户订单ID |
addressTo | String | 收款地址 |
orderId | String | 订单ID |
exchangeRate | float64 | 订单生成时汇率 |
currencyAmount | String | 订单法币金额 |
cryptoAmount | String | 订单加密金额 |
currencyType | String | 订单法币类型 |
tokenType | String | 代笔类型 |
chainType | String | 订单加密主链类型 |
orderStatus | String | 订单状态描述 |
orderStatusCode | int64 | 订单状态code 1——待支付:订单创建成功后,等待用户支付,不是订单最终状态,无需处理; 2——链上确认中:用户在收银台页面点击了标记已完成,实际还需要链上确认,是否到账,不是订单最终状态,无需处理; 4——已完成:系统将自动回调通知,收到通知后您需要按照实际业务给自己的用户增加余额/上分; 8——支付金额不匹配:系统会正常回调通知,需要客户收到通知后按照实际支付金额给用户增加余额/上分; 16——超时收款:系统不会进行回调,需要客户按照金额手动给用户增加余额/上分; 32——未支付:2小时未支付,地址释放了,再支付会生成新的超时收款订单,原订单状态不变; |
orderExpireTime | int64 | 订单过期时间 |
# 5.5 新增代付订单
请求方式
Post
请求URL
/api/v3/wallet/transfer
请求类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
请求头
Param | Desc | Sample |
---|---|---|
access_key | 商户后台获取 | pFqV75X3 |
timestamp | Unix时间戳13位 毫秒 | 1679724896223 |
nonce | UUID V4 | 794c26b0-d33c-4394-b2bb-c485eca16d9e |
sign | 计算出来的签名 | kAXyh+eerqrefyaF8dyFB0M4FVo= |
请求参数
{
"externalOrderId": "622257420681202921",
"addressTo": "0xa8666442fA7583F783a169CC9F5449ec660295E8",
"chainType": "ETH",
"tokenType": "USDT",
"currencyType":"USD",
"cryptoAmount": "1",
"notifyUrl": "http://192.168.1.135:30002/url",
"remark": "http://192.168.1.135:30002/url"
}
请求参数说明
Param | Desc | Require |
---|---|---|
externalOrderId | 商户订单ID Max=64(String) | required |
addressTo | 收款地址 Max=64(String) | required |
chainType | 主链类型 ETH BTC TRON BSC POLYGON SOLANA (String) | required |
tokenType | 订单加密代币类型 PXP GOUT BTC SOL MATIC NEXO OSMO GLM BAL TRB PYR BORA WBTC HEX TEL NAKA EDU ORBS SURE C98 CAT WER ADS OPL SDG OPO PPT SSV JDK WWG BBO USDT TRX TON LINK DAI SHIB UNI LEO OKB XRP ADA DOGE DOT LTC BCH FIL NEAR EGLD XTZ ETC USDC TUSD BUSD ETH BNB USDT1 IDO1 IDO2 IDO3 IDO4 Game1 TON1 CVX(String) | required |
cryptoAmount | 订单加密金额,小数点后不能大于 6 位(String)根据实际业务情况选择 | optional |
currencyType | 订单·法币类型 oneof=USD BRL CNY(String)根据实际业务情况选择 | optional |
currencyAmount | 订单法币金额,小数点后不能大于2位(String)根据实际业务情况选择 | optional |
notifyUrl | 回调URL(String,url) | optional |
remark | 备注 max=1024(String) | optional |
响应类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
响应数据
{
"code": "200",
"success": true,
"msg": "成功",
"msgEn": "SUCCESS",
"data": {
"orderId": "OCRYPDRAW202307310902401690794160841DOCKER020000000200001109",
"orderStatus": "Accepted",
"addressTo": "0xa8666442fA7583F783a169CC9F5449ec660295E8",
"chainType": "ETH",
"tokenType": "USDT",
"tokenAmount": 1,
"externalOrderId": "622257420681202921"
}
}
响应参数说明
Param | Type | Desc |
---|---|---|
orderId | String | 订单ID |
orderStatus | String | 订单状态 |
addressTo | String | 收款地址 |
chainType | String | 加密主链类型 |
tokenType | String | 加密代币类型 |
tokenAmount | float64 | 代笔金额 |
externalOrderId | String | 商户订单ID |
# 5.6 查询收款订单
请求方式
Post
请求URL
/api/v3/wallet/query/pay
请求类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
请求头
Param | Desc | Sample |
---|---|---|
access_key | 商户后台获取 | pFqV75X3 |
timestamp | Unix时间戳13位 毫秒 | 1679724896223 |
nonce | UUID V4 | 794c26b0-d33c-4394-b2bb-c485eca16d9e |
sign | 计算出来的签名 | kAXyh+eerqrefyaF8dyFB0M4FVo= |
请求参数
{
"externalOrderId": "402297358314559082",
"orderId": "OCRYPPAID202307310902391690794159441DOCKER020000000400001108"
}
请求参数说明
Param | Desc | Require |
---|---|---|
externalOrderId | 商户订单号 max=64(String) | required |
orderId | 系统订单号 (String) | required |
响应类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
响应数据
{
"code": "200",
"success": true,
"msg": "成功",
"msgEn": "SUCCESS",
"data": [{
"orderId": "OCRYPPAID202307310902391690794159441DOCKER020000000400001108",
"cashierId": "OCRYPPAID202307310902391690794159250DOCKER020000000200001107",
"orderType": 1,
"orderResourceType": 1,
"userId": "1663371399710216194",
"orderStatus": 1,
"orderTime": 1690794159000,
"channelOrderId": "",
"externalOrderId": "402297358314559082",
"orderAmount": "1",
"currencyType": "USD",
"tokenType": "USDT",
"chainType": "ETH",
"exchangeRate": "0.983",
"addressTo": "0xe072c63c1e04f8c6f36133f6629f66778147d5d8",
"orderTypeCode": "Pay",
"orderResourceTypeCode": "Crypto",
"orderStatusCode": "Wait pay"
}]
}
响应参数说明
Param | Type | Desc |
---|---|---|
orderId | String | 订单ID |
cashierId | String | 收银台ID |
orderType | int64 | 订单类型 1-收款 |
orderResourceType | int64 | 订单所属业务类型 1-加密订单 |
userId | String | 订单发起人 |
orderStatus | int64 | 订单状态 订单状态code 1——待支付:订单创建成功后,等待用户支付,不是订单最终状态,无需处理; 2——链上确认中:用户在收银台页面点击了标记已完成,实际还需要链上确认,是否到账,不是订单最终状态,无需处理; 4——已完成:系统将自动回调通知,收到通知后您需要按照实际业务给自己的用户增加余额/上分; 8——支付金额不匹配:系统会正常回调通知,需要客户收到通知后按照实际支付金额给用户增加余额/上分; 16——超时收款:系统不会进行回调,需要客户按照金额手动给用户增加余额/上分; 32——未支付:2小时未支付,地址释放了,再支付会生成新的超时收款订单,原订单状态不变; |
orderTime | Int64 | 订单发起时间 |
channelOrderId | String | 订单关联渠道订单id |
externalOrderId | String | 商户订单ID |
orderAmount | String | 订单金额 |
currencyType | String | 法币类型 |
tokenType | String | 代币类型 |
chainType | String | 主链类型 |
exchangeRate | String | 订单生成时汇率 |
addressTo | String | 收款地址 |
orderTypeCode | String | 订单类型code |
orderResourceTypeCode | String | 订单所属业务类型描述 |
orderStatusCode | String | 订单状态描述 |
# 5.7 查询代付订单
请求方式
Post
请求URL
/api/v3/wallet/query/transfer
请求类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
请求头
Param | Desc | Sample |
---|---|---|
access_key | 商户后台获取 | pFqV75X3 |
timestamp | Unix时间戳13位 毫秒 | 1679724896223 |
nonce | UUID V4 | 794c26b0-d33c-4394-b2bb-c485eca16d9e |
sign | 计算出来的签名 | kAXyh+eerqrefyaF8dyFB0M4FVo= |
请求参数
{
"externalOrderId": "622257420681202921",
"orderId": "OCRYPDRAW202307310902401690794160841DOCKER020000000200001109"
}
请求参数说明
Param | Desc | Require |
---|---|---|
externalOrderId | 商户订单号 max=64(String) | required |
orderId | 系统订单号 (String) | required |
响应类型
Header: { 'Content-Type': 'application/json;charset=utf-8'}
响应数据
{
"code": "200",
"success": true,
"msg": "成功",
"msgEn": "SUCCESS",
"data": [{
"orderId": "OCRYPDRAW202307310902401690794160841DOCKER020000000200001109",
"cashierId": "",
"orderType": 2,
"orderResourceType": 1,
"userId": "1663371399710216194",
"orderStatus": 1,
"orderTime": 1690794160000,
"channelOrderId": "",
"externalOrderId": "622257420681202921",
"orderAmount": "1",
"orderActualAmount": "1.01",
"orderFee": "0.01",
"currencyType": "USD",
"tokenType": "USDT",
"chainType": "ETH",
"exchangeRate": "0.983",
"addressTo": "0xa8666442fA7583F783a169CC9F5449ec660295E8",
"tradeHash": "0xe9d043c9cbdb96ed7a71c5a0923baabe9e23316b3f1b0a01975bcd6d69b41fa3",
"orderTypeCode": "Transfer",
"orderResourceTypeCode": "Crypto",
"orderStatusCode": "Accepted"
}]
}
响应参数说明
Param | Type | Desc |
---|---|---|
orderId | String | 订单ID |
cashierId | String | 收银台ID |
orderType | int64 | 订单类型 2-代付 |
orderResourceType | int64 | 订单所属业务类型 1-加密订单 |
userId | String | 订单发起人 |
orderStatus | int64 | 订单状态 1-已受理 2-已完成 4-出款失败 8-待审批 16-拒绝出款 |
orderTime | int64 | 订单发起时间 |
channelOrderId | String | 订单关联渠道订单id |
externalOrderId | String | 商户订单ID |
orderAmount | String | 订单金额 |
orderActualAmount | String | 订单实际支付或扣除金额 |
orderFee | String | 订单手续费 |
currencyType | String | 法币类型 |
tokenType | String | 代币类型 |
chainType | String | 主链类型 |
exchangeRate | String | 订单生成时汇率 |
addressTo | String | 收款地址 |
tradeHash | String | 链上hash |
orderTypeCode | String | 订单类型code |
orderResourceTypeCode | String | 订单所属业务类型描述 |
orderStatusCode | String | 订单状态描述 |
# 5.8 查询余额
请求方式
GET
请求URL
/api/v3/wallet/query/balance
请求头
Param | Desc | Sample |
---|---|---|
access_key | 商户后台获取 | pFqV75X3 |
timestamp | Unix时间戳13位 毫秒 | 1679724896223 |
nonce | UUID V4 | 794c26b0-d33c-4394-b2bb-c485eca16d9e |
sign | 计算出来的签名 | kAXyh+eerqrefyaF8dyFB0M4FVo= |
响应数据
{
"code": "200",
"success": true,
"msg": "成功",
"msgEn": "SUCCESS",
"data": [{
"accountStatusId": 4,
"accountBalance": "346.525",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "ETH",
"tokenType": "USDT",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "479.938888",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "TRON",
"tokenType": "USDT",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "0",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "BSC",
"tokenType": "USDT",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "0",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "ETH",
"tokenType": "BUSD",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "0",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "BSC",
"tokenType": "BUSD",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "0",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "ETH",
"tokenType": "TUSD",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "0",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "TRON",
"tokenType": "TUSD",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "0",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "BSC",
"tokenType": "TUSD",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "0",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "ETH",
"tokenType": "USDC",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "0",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "TRON",
"tokenType": "USDC",
"AccountStatus": "InAndOut"
}, {
"accountStatusId": 4,
"accountBalance": "0",
"accountFreezeAmount": "0",
"accountWaitSettledAmount": "0",
"chainType": "BSC",
"tokenType": "USDC",
"AccountStatus": "InAndOut"
}]
}
响应参数说明
Param | Type | Desc |
---|---|---|
accountStatusId | int64 | 账户状态id |
accountBalance | String | 账户可用余额 |
accountFreezeAmount | String | 账户冻结金额 |
accountWaitSettledAmount | String | 账户待划转金额 |
chainType | String | 主链类型 |
tokenType | String | 代币类型 |
AccountStatus | String | 账户状态 |
# 6. 回调信息
# 6.1 如何回调接口验签
# 验签说明
API 请求在通过 internet 传输的过程中极有可能被篡改,为了确保回调未被更改, 您可设置回调参数签名认证。设置方法为:登录收银台 ->开发者中心 -> 回调地址 -> 添加。
# 验签步骤
整体流程和签名大体一致,仅仅是拿来验签的数据取法不一样,签名是自己构造数据,验签是获取数据(header、json)
1.取出 header 中的 sign 值;
2.定义一个 Map 字典类型对象,将请求中的json参数以 key-value 的形式放入其中
3.取出 header 中的 access_key、timestamp、nonce 也放入上一步定义的 Map 中
4.将 Map 中的 key 按照 ASCII 码从小到大排序(字典序)并将 Map 转换输出为“key1=value1&key2=value2” 形式的字符串;
5.将上一步转换的字符串用 secret_key 进行 HMAC_SHA1 加密并进行 Base64 转码,得到 sign 签名值与第一步 header 中取出的 sign 进行字符串校验,相符则验签通过,反之则验签失败。此处的 secret_key 需与下单时的 access_key 相匹配。
# 6.2 支付回调
回调数据
{
"currencyType": "USD",
"orderActualAmount": "1",
"orderId": "OCRYPPAID202307310902391690794159441DOCKER020000000400001108",
"tradeHash": "0x806d5b3da29c8426a644e2ded85b865b37504dcdec4cfb9db13af5e962815528",
"orderFee": "1",
"orderStatus": "Completed",
"chainType": "ETH",
"externalOrderId": "402297358314559082",
"addressTo": "0xe072c63c1e04f8c6f36133f6629f66778147d5d8",
"orderAmount": "1",
"orderTime": 1690794159000,
"exchangeRate": "0.983",
"orderStatusCode": 4,
"orderPayTime": 1690794247000,
"addressFrom": "0x0cbfd17ae9e1d6d881b2cade71277f48abf64d24",
"tokenType": "USDT"
}
回调参数说明
Param | Type | Desc |
---|---|---|
currencyType | String | 法币类型 |
orderActualAmount | String | 订单实际支付金额 |
orderId | String | 订单ID |
tradeHash | String | 链上hash |
orderFee | String | 订单手续费 |
orderStatus | String | 订单状态code描述 |
chainType | String | 主链类型 |
externalOrderId | String | 商户订单ID |
addressTo | String | 收款地址 |
orderAmount | String | 订单金额 |
orderTime | int64 | 订单创建时间 |
exchangeRate | String | 订单生成时汇率 |
orderStatusCode | int64 | 订单状态 1-待支付 2-链上确认中 4-已完成 8-支付金额不匹配 16-超时收款 32-未支付订单时间 |
orderPayTime | int64 | 订单支付时间 |
addressFrom | String | 出款地址 |
tokenType | String | 代币类型 |
任意时候商户都可登录商户后台进行手动触发回调(不建议订单非终态发起手动回调),回调信息中订单状态等相关信息为真实实际状态(手动 回调请一定注意订单状态,如果手动回调订单的状态不是终态,在订单变为终态的时候平台依然会发起通知,请注意业务层面的冗余处理)
# 6.3 代付回调
回调数据
{
"orderAmount": "1",
"orderTime": 1690794160000,
"orderId": "OCRYPDRAW202307310902401690794160841DOCKER020000000200001109",
"orderStatusCode": 2,
"tradeHash": "0xe9d043c9cbdb96ed7a71c5a0923baabe9e23316b3f1b0a01975bcd6d69b41fa3",
"orderFee": "0.01",
"orderStatus": "Completed",
"orderPayTime": 1690794182000,
"chainType": "ETH",
"externalOrderId": "622257420681202921",
"tokenType": "USDT",
"addressTo": "0xa8666442fA7583F783a169CC9F5449ec660295E8"
}
回调参数说明
Param | Type | Desc |
---|---|---|
orderAmount | String | 订单金额 |
orderTime | int64 | 订单创建时间 |
orderId | String | 订单ID |
orderStatusCode | int64 | 订单状态code 1-已受理 2-已完成 4-出款失败 8-待审批 16-拒绝出款 |
tradeHash | String | 链上hash |
orderFee | String | 订单手续费 |
orderStatus | String | 订单状态描述 |
orderPayTime | int64 | 订单代付时间 |
chainType | String | 主链类型 |
externalOrderId | int64 | 商户订单ID |
tokenType | int64 | 代币类型 |
tokenType | String | 代币类型 |
addressTo | String | 收款地址 |
任意时候商户都可登录商户后台进行手动触发回调(不建议订单非终态发起手动回调),回调信息中订单状态等相关信息为真实实际状态(手动 回调请一定注意订单状态,如果手动回调订单的状态不是终态,在订单变为终态的时候平台依然会发起通知,请注意业务层面的冗余处理)
# 6.4 回调响应
备注:所有的回调都包含签名信息,建议商户做回调验签,商户收到回调信息后,确定订单终态,请响应网关如下信息(content-type: application/json)如果没有正常响应服务端会在30分钟内,间隔三分钟总计2次通知
{"code":200,"success":true}
# 6.5 回调通知URL
登录商户后台可以配置统一回调地址(订单中手动指定回调URL地址,优先级高于统一配置的回调地址,例如:订单中指定了notifyUrl参数,不管是否有统一配置回调通知地址,都使用订单中的notifyUrl地址)
注意 http响应status_code优先级最高 只要收到响应status_code=200 响应数据则忽略
# 7. 公共响应代码
filed | Type | Default value and comment |
---|---|---|
code | String | 成功"200" 其他请参考失败code |
success | Bool | 成功 true 失败false 和code保持意义上的同步 |
msg | String | 一级code返回的文字性描述 |
data | Object | 参考接口列表章节 |
# 8. 失败code
Code | Desc |
---|---|
200 | 正常 |
300 | 参数异常 |
301 | IP无权限 |
307 | 签名错误 |
500 | 系统错误 |