后端接入指南 - 私有链
主要功能: 通过手机号查询用户持有的资产情况
仅针对冷门链或私有链
开发者端需处理的来自CaTalk服务端的查询请求:
约定传递参数如下:
userHash
可选的加密算法如下:
方案A: SHA256 / MD5不可逆加密,需要开发者后端能通过加密后的字符串查询到用户在数据库中对应的记录;
方案B: AES加密解密,由CaTalk端加密,开发者端解密,需要开发者对AES解密方法有了解,目前我们采用的是AES/CBC/Pkcs5Padding方式
无论是哪种方案需同CaTalk先协商好;
sign (可选,建议在采用以上方案A时加上)
验签规则如下:
开发者端拿到sign的值后,先将 userHash + timestamp + apikey 这三个字符串拼接后做 sha256加密,如果等于sign值,则表示来源请求合法,具体公式如下:
if sha256(userHash+timestamp+apikey) == sign {
return "合法请求,继续处理查询"
} else {
return "非法请求,阻止查询"
}
测试 apikey:test
来自CaTalk端发出的 POST 请求范例:
Header 'Content-Type: application/json'
JSON:
方案A:
{
"userHash":"fe1608296a23c1e41bb8f2534261ba54f893c68b1fd1ea3eb1e4f575c395fc39",//手机号12300000000加密后的字符串
"sign":"e9f64f6c3b8b735f8cb3ca99ecbbde3101b7c8ec612523f3a67bf3201bf13a40", //sha256(fe1608296a23c1e41bb8f2534261ba54f893c68b1fd1ea3eb1e4f575c395fc391680514641test)
"timestamp":"1680514641"
}
方案B:
{
"userHash":"i86b1bOL0qzj23WpDbYr0A==",//通过密钥key:XvAmOAzc7BBVXEDVdup2DPUNZJShJcJ6 ,能解密出手机号12300000000,即表示解密算法正确
}
开发者服务端需返回的字段:
data
token可以理解为一条藏品记录,group可以理解为一个系 列,多条不同的token_no记录可以是同样的group_no,相当于用户持有同系列的#1、#2编号,可以是2条记录,每条记录count=1(即ERC721),或者某种徽章全都是一样的,不区分编号,那么可能count > 1(即ERC1155)。
群是以系列为单位来建立的,group_image即群封面,token_image即用户头像,用户可能持有一个系列的多个不一样的头像。
字段名 | 类型 | 必填 | 说明 | 注意事项 |
---|---|---|---|---|
token_no | string | 必填 | 藏品唯一编号 | 建议仅英文数字,注意正式上线后如出现修改,则被当成新的藏品记录被读取,且旧记录会被自动删除 |
token_name | string | 必填 | 昵称/藏品名称 | CaTalk方初次收录藏品信息时读取,如果是域名,则可以作为用户昵称 |
token_image | string | 必填 | 头像/藏品图片url | url地址建议是给出后缀(如.png),否则可能导致用户头像无法正常展示 |
group_no | string | 必填 | 群组/系列/合约唯一编号 | 建议仅英文数字,注意正式上线后不可随意更改,否则会导致用户的群关系丢失 |
group_name | string | 必填 | 群组/系列/合约名称 | 建议与藏品系列名称一致,初次建群时读取,至少要与藏品系列有关联,方便用户加群时识别 |
group_image | string | 必填 | 群组/系列/合约封面图片url | 建议与藏品图片url一致,原因同群组名称 |
count | number | 必填 | 藏品/系列持有数量 | 用于排行榜计算,为0或整条记录不存在则表示已转让 |
error_code
开发者返回出错码 | 说明 | CaTalk会如何处理? |
---|---|---|
user_not_exist | 当前用户不存在 | 针对当前用户,下次进社群再查询 |
user_query_too_frequently | 当前用户查询太频繁 | 针对当前用户,记录本次查询时间,过一段时间再次查询。(即使未收到此错误,CaTalk也默认有开启防频繁查询策略) |
user_block_query | 禁止查询当前用户 | 针对当前用户,禁止后续再次查询 |
system_query_too_frequently | 被开发者端全面限流 | 针对所有用户,记录本次查询时间,过一段时间再次查询 |
system_shutdown | 开发者端系统维护中 | 针对所有用户,关闭查询,等待手动开启 |
error_msg
出错提示信息,建议直接返回用户可读的中文提示,方便即时查错。
next_query_time (选填)
如果存在此字段,那么表示要求CaTalk遵循开发者端自身的限流策略,CaTalk会记录此时间,并关闭默认的防频繁查询策略,改成以这个字段传递的时间为下次查询时间,未到此时间,CaTalk不会执行下一次查询。
请注意:太低频率的查询,可能导致用户的藏品数据在开发者端发生变化时,CaTalk无法实时同步更新状态,造成用户无法立即加群或者即时退群。
返回范例:
正常返回:
{
"error_code":"", //出错码,报错时有值,正常时为空字符串
"error_msg": "", //出错提示信息,建议直接返回用户可读的中文提示,方便即时查错。
"data": [
{
"count": 1,
"token_no":"abc1",
"token_name": "藏品A-1",
"token_image": "https://xxx.com/xxx1.png",
"group_no": "aaaa111",
"group_name": "群名A",
"group_image": "https://xxx.com/group/xxx.png"
},
{
"count": 1,
"token_no":"abc2",
"token_name": "藏品A-2",
"token_image": "https://xxx.com/xxx2.png",
"group_no": "aaaa111",
"group_name": "群名A",
"group_image": "https://xxx.com/group/xxx.png"
},
{
"count": 3,
"token_no":"xyz456",
"token_name": "藏品B",
"token_image": "https://xxx.com/yyy.png",
"group_no": "bbbb222",
"group_name": "群名B",
"group_image": "https://xxx.com/group/yyy.png"
},
...
]
}
出错了:
{
"error_code":"user_not_exist", //出错码,报错时有值,正常时为空字符串
"error_msg": "用户不存在,可能是您还未注册XXX账号", //出错提示信息,建议直接返回用户可读的中文提示,方便即时查错。
"data": []
}