淘派 OPEN API 接口文档

1. 环境

  1. 测试环境地址:https://nft-test0.taopainft.com/v1

  2. 线上环境地址:https://nft.taopainft.com/v1

2. 鉴权

前置条件:找淘派申请 appidapp secret

发起HTTP请求时,需要携带三个header头:

  1. appid:申请的appid

  2. sign:使用 app secret 生成的签名

  3. sign-time:发起请求的时间戳,单位s

HTTP header头中 sign 签名的生成方式(伪代码):

sign_time = <当前时间戳>
http_body = <发起请求中的http body原始字节数据,不要经过任何处理>
appid = <淘派分配的appid>
app_secret = <淘派分配的app secret,请勿泄露>

// 1. 构造需要签名的数据
signdata = appid + "@" + app_secret + "@" + sign_time + "@" + http_body

// 2. 用sha256签名
signbyts = sha256.sign(signdata)

// 3. 将签名转换成功16进制小写字符串
sign = hex.toString(signbyts)

// 4. 将sign放到Http请求的header头中即可

Golang示例代码:

package main

import (
	"bytes"
	"crypto/sha256"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"

	"github.com/spf13/cast"
)

type TokenHasArg struct {
	Mobile       string `json:"mobile"`
	ContractAddr string `json:"contractAddr"`
}

func main() {
	appid := 1000001
	appSecret := "c8c1e6b11855733b542cc655f62239c4"

	signTime := time.Now().Unix()

	arg := TokenHasArg{
		Mobile:       "18804919650",
		ContractAddr: 
"cfxtest:acfa7wc6ejegtw955e9tcrh1r7z2kyt49uzwjnh657",
	}

	argbyts, err := json.Marshal(arg)

	if err != nil {
		panic(err)
	}

	signData := cast.ToString(appid) + "@" + appSecret + "@" + 
cast.ToString(signTime) + "@" + string(argbyts)

	// sha256
	shains := sha256.New()

	shains.Write([]byte(signData))

	signbyts := shains.Sum(nil)

	signstr := string(hex.EncodeToString(signbyts))

	// build http request
	request, err := http.NewRequest(http.MethodPost, 
"https://nft-test0.taopainft.com/v1/openapi/token/has", 
bytes.NewBuffer(argbyts))

	if err != nil {
		panic(err)
	}

	request.Header.Set("appid", cast.ToString(appid))
	request.Header.Set("sign-time", cast.ToString(signTime))
	request.Header.Set("sign", signstr)
	request.Header.Set("Content-Type", "application/json")

	cli := &http.Client{}

	resp, err := cli.Do(request)

	if err != nil {
		panic(err)
	}

	res, err := ioutil.ReadAll(resp.Body)

	if err != nil {
		panic(err)
	}

	fmt.Println(string(res))
}

其他说明:

  1. 签名后60s请求会过期,需要重新签名

  2. 签名验证失败,接口会返回http status 403

3. 接口列表

1.判断用户是否持有某个合约的NFT:

接口地址:/openapi/token/has

请求方式:POST

参数:

{
  "mobile":"18804919650", // 手机号
  "contractAddr":"cfxtest:acfa7wc6ejegtw955e9tcrh1r7z2kyt49uzwjnh657" // 
合约地址
}

返回值

{
    "code":0,              // 0 表示正常, 其他值表示异常
    "message":"ok",        // 如果code非0,则会返回此错误信息
    "data":{               // 数据
        "has":true         // 是否持有 true:持有 false:不持有
    }
}

2.获取用户持有的合约列表

接口地址:/openapi/user/contract/list

请求方式:POST

参数:

{
  "mobile":"18804919650"  // 手机号
}

返回值

{
    "code":0,
    "message":"ok",
    "data":{
        "list":[
            {
                "name":"AnyTest",                                                  
// 合约名称
                "symbol":"AnyTest",                                                
// 合约标识
                "description":"",                                                  
// 合约描述
                
"address":"cfxtest:acfa7wc6ejegtw955e9tcrh1r7z2kyt49uzwjnh657",    // 
合约地址
                "image":""                                                         
// 合约图片地址
            }
        ]
    }
}

3.获取用户持有的NFT列表:

接口地址:/openapi/user/token/list

请求方式:POST

参数:

{
  "mobile":"18804919650", // 手机号<必填字段>
  "contractAddr":"cfxtest:acfa7wc6ejegtw955e9tcrh1r7z2kyt49uzwjnh657" // 
合约地址<可选字段>:不填合约地址,则返回用户持有的所有合约藏品列表
  "limit":1,   // 要求返回的条目数,最大50条
  "offset":0   // 要求返回的起始偏移
}

返回值

{
  "code": 0,
  "message": "ok",
  "data": {
    "total": 21,  // 总条目数量
    "list": [     // 条目
      {
        "tokenId": "31",  // token id
        "name": "Any测试31",  // 藏品名称
        "description": "Confi Anonymous(测试)",  // 藏品描述
        "image": 
"https://taopainft-test.oss-cn-hangzhou.aliyuncs.com/TestIP/cfx%3Axdxxxxxx/Confi%20Anonymous%EF%BC%88%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81%EF%BC%89.jpg",  
// 藏品图片
        "metadata": "{\"author\": \"王小二\",\"series\": \"国潮盲盒系列\" 
}", // 藏品metadata信息
        "contractInfo": {   // 藏品的合约信息
          "name": "AnyTest",      // 合约名称
          "symbol": "AnyTest",    // 合约标识
          "description": "",      // 合约描述
          "address": "cfxtest:acfa7wc6ejegtw955e9tcrh1r7z2kyt49uzwjnh657", 
// 合约地址
          "image": ""      // 合约图片地址
        }
      }
    ]
  }
}

4.获取某个合约下的NFT列表:

接口地址:/openapi/contract/token/list

请求方式:POST

参数:

{
  "contractAddr":"cfxtest:acfa7wc6ejegtw955e9tcrh1r7z2kyt49uzwjnh657" // 
合约地址
  "limit":1,   // 要求返回的条目数,最大50条
  "offset":0   // 要求返回的起始偏移
}

返回值

{
  "code": 0,
  "message": "ok",
  "data": {
    "total": 590,   // 总条目数
    "list": [       // 条目
      {
        "tokenId": "111",       // token id
        "name": "Any测试111",    // 藏品名称
        "description": "Confi Miiner test test", // 藏品描述
        "image": 
"https://taopainft-test.oss-cn-hangzhou.aliyuncs.com/TestIP/cfx%3Axdxxxxxx/Confi%20Mario%EF%BC%88%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81%EF%BC%89.jpeg",  
// 藏品图片地址
        "metadata": "{\"author\": \"王小二\",\"series\": \"国潮盲盒系列\" 
}", // 藏品metadata信息
        "contractInfo": {    // 藏品的合约信息
          "name": "AnyTest",    // 合约名称
          "symbol": "AnyTest",  // 合约标识
          "description": "",    // 合约描述
          "address": "cfxtest:acfa7wc6ejegtw955e9tcrh1r7z2kyt49uzwjnh657", 
// 合约地址
          "image": "" // 合约图片地址
        }
      }
    ]
  }
}

Last updated