1、资产导入时序图
2、术语
接入方:用户资产的外部所有者
平台方:数源卡包
所属链:资产所在的区块链
3、生成签名
使用对接方的corp_secret对Url查询参数进行HMACSHA256
签名
step1 生成公共请求参数(UTC时间戳、nonce随机6位非0开头正整数、corp_id)
step2 将请求数据格式化为Url查询参数的形式
step3 对Url查询参数按照字母升序排列
step4 进行一次UrlEncode后,使用corp_secret对UrlEncode的字符串签名,生成hex字符串
step5 将&sign=签名字符串
追加在UrlEncode后的字符串尾部,即可获得完整的Url查询参数
代码示例
GET https://out.xxxxx.com/assets/account/verification
以请求验证用户账号
为例(Golang Function)
func SignByUrl(corpSecret string, query *url.Values) (string, string, error) {
queryStr := query.Encode()
hash := hmac.New(sha256.New, []byte(corpSecret))
_, err := hash.Write([]byte(queryStr))
if err != nil {
return "", "", err
}
signData := hash.Sum(nil)
signature := hex.EncodeToString(signData)
queryStr = fmt.Sprintf("%s&sign=%s", queryStr, signature)
return queryStr, signature, nil
}
func DoRequest() {
domain := "https://out.xxxxx.com/assets/single/importing"
corpId := "wn9ybdkn78z33x9fsbu4cu63ft6gnf7m"
corpSecret := "9eysdhsal1212knmo358sdd"
account := "18690706666"
query := &url.Values{}
query.Add("account", account)
// 增加默认字段
timestamp := uint64(time.Now().UTC().Unix())
nonce := rand.Intn(800000) + 100000
query.Add("corp_id", corpId)
query.Add("nonce", strconv.Itoa(nonce))
query.Add("timestamp", strconv.FormatUint(timestamp, 10))
queryStr, _, err := SignByUrl(corpSecret, query)
if err != nil {
return
}
reqUrl := fmt.Sprintf("%s?%s", domain, queryStr)
req, _ := http.NewRequest("GET", reqUrl, nil)
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
defer client.CloseIdleConnections()
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
var buf bytes.Buffer
_, err = buf.ReadFrom(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(buf.String())
}
4、API列表
(1) 用户账号验证
(2) 处理资产单笔导入
(3) 处理资产批量导入
(4) 导入结果回调
(1) 用户账号验证
调用接入方已登记的用户账号验证接口
基本信息
请求方式:GET
请求地址:https://out.xxxxx.com/assets/account/verification
Query参数
名称 | 类型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
account | String | 是 | 18690706666 | 用户在接入方的账号 |
corp_id | String | 是 | wn9ybdkn78z33x9fsbu4cu63ft6gnf7m | 平台方分配给接入方的ID |
nonce | String | 是 | 81244707 | 签名随机数 |
timestamp | String | 是 | 1656191400 | 平台方请求接入方的时间 |
sign | String | 是 | qywed612ebasad9123nac101ma | 签名字符串 |
返回参数
名称 | 是否必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|
code | 是 | String | 200 | 状态码 |
msg | 是 | String | success | 状态码对应的提示内容 |
data | 否 | Object | 返回内容 |
(2) 请求资产单笔导入
调用接入方已登记的资产单笔导入接口
基本信息
请求方式:GET
请求地址:https://out.xxxxx.com/assets/single/importing
Query参数
名称 | 类型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
account | String | 是 | 18690706666 | 用户在接入方的账号 |
address | String | 是 | 0x9cBA7K78040c67d99016a923289D8691aLLop | 平台方充值钱包地址 |
callback_url | String | 是 | https://api.xxxxx.com/api/v1/assets/importing/callback | 平台方回调接口地址 |
token_id | String | 是 | 21 | 资产tokenID |
corp_id | String | 是 | wn9ybdkn78z33x9fsbu4cu63ft6gnf7m | 平台方分配给接入方的ID |
nonce | String | 是 | 51237001 | 签名随机数 |
timestamp | String | 是 | 1659198482 | 平台方请求接入方的时间 |
sign | String | 是 | qywed612ebasad9123nac101ma | 签名字符串 |
返回参数
名称 | 是否必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|
code | 是 | String | 200 | 状态码 |
msg | 是 | String | success | 状态码对应的提示内容 |
data | 是 | Object | 返回内容 | |
|—total | 是 | Integer | 1 | 可导入的总条目数 |
|—tx_hash | 是 | String | 0xe9ec888b68569610275868b8520a047f0ded4c575b197e3e9f621f04e7c | 交易唯一编号,接入方需要保证唯一性 |
|—content | 是 | Array<Object> | ||
||—name | 是 | String | 清明上河图A | 资产名 |
||—contract_address | 是 | String | 0x3A418ed9d8C5Bc3A6382A673526efF05CC314 | 合约地址 |
||—contract_network | 是 | String | Polygon | 合约所属网络 |
||—contract_protocol | 是 | String | erc1155 | 合约协议类型 |
||—content_type | 是 | String | image/jpeg | 资产的资源类型 |
||—content_uri | 是 | String | https://joysae-test-nft.oss-cn-chengdu.aliyuncs.com/userspace/Polygon.png | 资产的资源地址 |
||—latest_trade_timestamp | 否 | Integer | 1659190482 | 上一次交易时间,UTC时间戳,单位'秒' |
||—mint_timestamp | 否 | Integer | 1659090482 | 铸造时间,UTC时间戳,单位'秒' |
||—owner | 是 | String | 0x4EC2fF78040c67d99016a923289D8691a | 资产拥有者地址 |
||—open_id | 是 | String | 922 | 资产在接入方的唯一ID |
||—price | 是 | Integer | 888 | 资产价格,单位'分' |
||—token_id | 是 | String | 21 | 资产tokenID |
(3) 请求资产批量导入
调用接入方已登记的资产批量导入接口
基本信息
请求方式:GET
请求地址:https://out.xxxxx.com/assets/batch/importing
Query参数
名称 | 类型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
account | String | 是 | 6d1bxxxx | 用户在接入方的账号 |
address | String | 是 | 6d1bxxxx | 平台方充值钱包地址 |
callback_url | String | 是 | 6d1bxxxx | 平台方回调接口地址 |
corp_id | String | 是 | 6d1bxxxx | 平台方分配给接入方的ID |
nonce | String | 是 | 6d1bxxxx | 签名随机数 |
timestamp | String | 是 | 6d1bxxxx | 平台方请求接入方的时间 |
sign | String | 是 | 6d1bxxxx | 签名字符串 |
返回参数
名称 | 是否必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|
code | 是 | String | 200 | 状态码 |
msg | 是 | String | success | 状态码对应的提示内容 |
data | 是 | Object | 返回内容 | |
|—total | 是 | Integer | 55 | 可导入的总条目数 |
|—tx_hash | 是 | String | 0xe9ec888b68569610275868b8520a047f0ded4c575b197e3e9f621f04e7c | 导入hash,接入方要保证唯一 |
|—content | 是 | Array<Object> | ||
||—name | 是 | String | 清明上河图A | 资产名 |
||—contract_address | 是 | String | 0x3A418ed9d8C5Bc3A6382A673526efF05CC314 | 合约地址 |
||—contract_network | 是 | String | Polygon | 合约所属网络 |
||—contract_protocol | 是 | String | erc1155 | 合约协议类型 |
||—content_type | 是 | String | image/jpeg | 资产的资源类型 |
||—content_uri | 是 | String | https://joysae-test-nft.oss-cn-chengdu.aliyuncs.com/userspace/Polygon.png | 资产的资源地址 |
||—latest_trade_timestamp | 否 | Integer | 1659190482 | 上一次交易时间,UTC时间戳,单位'秒' |
||—mint_timestamp | 否 | Integer | 1659090482 | 铸造时间,UTC时间戳,单位'秒' |
||—owner | 是 | String | 0x4EC2fF78040c67d99016a923289D8691a | 资产拥有者地址 |
||—open_id | 是 | String | 922 | 资产在接入方的唯一ID |
||—price | 是 | Integer | 888 | 资产价格,单位'分' |
||—token_id | 是 | String | 21 | 资产tokenID |
(4) 导入结果回调
接入方在转账成功后,调用平台方的回调接口
基本信息
请求方式:GET
请求地址:https://out.xxxxx.com/assets/importing/callback
Query参数
名称 | 类型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
status | String | 是 | success | 处理状态,success|fail |
tx_hash | String | 是 | 0xe9ec888b68569610275868b8520a047f0ded4c575b197e3e9f621f04e7c | 接入方在请求导入接口返回给平台方的tx_hash |
corp_id | String | 是 | wn9ybdkn78z33x9fsbu4cu63ft6gnf7m | 平台方分配给接入方的ID |
nonce | String | 是 | 30128712 | 签名随机数 |
timestamp | String | 是 | 1659191077 | 接入方请求平台方的时间 |
sign | String | 是 | asdh7812bas9123heuwg8sc | 签名字符串 |
返回参数
名称 | 是否必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|
code | 是 | String | 200 | 状态码 |
msg | 否 | String | 状态码对应的提示内容,处理失败时该字段才有值 | |
data | 否 | Object | 返回内容 |
5、状态码列表
当code值不等于200时,返回数据的data为null,并且msg有错误提示信息
code值 | 类型 | 错误内容 |
---|---|---|
200 | String | |
400 | String | 请求参数错误 |
500 | String | 系统错误 |
12000 | String | 未找到资产平台 |
12015 | String | 签名无效 |