id:BSN_2021 公众号:BSN 研习社 作者:中移信息
2021 年 10 月,BSN 提出搭建 BSN-DDC 根底网络,区块链团队自主研发中移链(CMBaaS)DDC 并与 BSN 发展单干,面向存在 DDC 业务需要的各行业客户提供接入服务,使其可便捷治理 DDC 操作,从而灵便降级产品模式,助力客户业务翻新。
本文档是对于中移链 DDC-SDK 技术在对接全流程中,如何调用 BSN-DDC 门户 OpenAPI 接口的生成公私钥对、创立链账户、接入官网 DDC 合约、分配资源、业务费充值以及对应查问的操作指南,实用于 BSN 凋谢联盟链 – 中移链 DDC-SDK 开发者,帮忙读者理解如何以平台方的角色集成中移链 DDC-SDK。
一、BSN-DDC 门户 OpenAPI 简介
BSN-DDC 门户 OpenAPI 是用于与中移链交互的 API 服务,次要性能可参考《BSN-DDC 门户 OpenAPI 接口文档》。在中移链 RPC API 手册的根底上,为中移链零碎合约提供可拜访的服务入口,不便平台方通过 OpenAPI 实现对系统合约的近程调用。
BSN-DDC 门户 OpenAPI 次要蕴含四个局部:凋谢联盟链框架、项目管理、DDC 链账户治理、官网 DDC 查问。以下是各个局部的性能介绍:
凋谢联盟链框架:负责凋谢联盟链框架的列表查问和反对的链账户类型查问,例如中移链的 opbChainId 为 9,反对的链账户类型为上传公钥。
项目管理:负责我的项目的创立、列表查问和状态更新,平台方应用我的项目 ID 和我的项目 key 接入 OPB 网关,并发动合约交易,默认不开启我的项目 key。
DDC 链账户治理:提供残缺的 DDC 链账户治理流程,次要包含:生成链账户公私钥对、创立链账户、接入官网 DDC 合约、分配资源和业务费充值等。
官网 DDC 查问:提供官网 DDC 的发行明细和交易列表查问,同时反对官网 DDC 的生成、受权、转移、销毁等残缺流转记录的查问。
二、名词解释
凋谢联盟链:用于部署和运行各类区块链利用的一站式区块链服务运行环境。凋谢联盟链的利用共享记账节点资源和区块链数据账本;链外业务零碎能够通过节点网关简略、疾速接入区块链网络进行交易解决。
BSN DID:平台方的链上身份凭证标识,关联平台方的业务开明凭证、链账户以及其下终端用户的链账户,是平台方发展 DDC 利用和治理业务的根底标识。平台方须要妥善保留和备份好 BSN DID 的管制私钥。
DID-SDK:蕴含注册 DID、更新密钥、验证 DID 三个办法,平台方只需注册一次 DID 即可,所以需妥善保留和备份好 BSN DID 的管制私钥,如私钥失落或透露,通过更新密钥办法从新生成 BSN DID 的管制私钥。
门户 OpenAPI:BSN 联盟面向平台方凋谢的一套官网 DDC 治理服务接口。平台方依照官网门户 OpenAPI 开发材料进行接口对接,将官网 DDC 的治理侧性能和查问类性能集成到本人的业务门户内。
官网 DDC 合约:所有 DDC 凋谢联盟链上,部署完全一致的 BSN 官网 DDC 合约,能够生成和治理 BSN 官网 DDC(反对 ERC-721 和 ERC-1155)。也容许平台方部署本人的 DDC 合约,该类 DDC 由相干平台方自行负责。
BSN 官网 DDC:通过 BSN 官网 DDC 合约生成的官网 DDC。BSN 联盟为每条凋谢联盟链都推出一套性能统一,但实现过程不尽相同的官网 DDC 合约,同一条链上的每个官网 DDC 都由这个官网 DDC 合约生成,且都由 BSN 联盟进行背书。
apitoken:平台方调用门户 OpenAPI 的每个接口,都需在申请头填写 apitoken,服务侧会对 apitoken 的值进行有效性验证,同时依据此值将申请报文关联到对应的平台方,所以平台方需妥善治理本人的 apitoken。
三、开发前筹备
(一)注册 DDC 门户账号
1、登录 DDC 官网门户网站,点击去注册,网站地址:https://ddc.bsnbase.com/
2、注册时需提供企业名称、法人姓名、企业营业执照、邮箱及手机号等信息
3、DDC 网络经营人员在 3 个工作日内对注册信息进行审核,审核后果将以邮件形式进行告诉
(二)申请业务开明、线下签订合同
1、注册胜利后,平台方人员登录官网门户,在“业务开明”页面填写备案网站和申请阐明后提交业务开明申请
2、DDC 网络经营人员在 3 个工作日内分割平台方沟通业务开明相干事宜
3、平台方的业务开明申请经 BSN 联盟审核通过后,DDC 网络经营人员分割平台方签订线下协定
留神: 所填写的网站备案信息必须与所提交的注册企业名称统一。此处所说的备案网站不肯定是 DDC 业务的平台,任何注册企业名下的备案网站均可。
(三)注册 DID 并下载业务凭证
1、在线下签约实现后,平台方人员依据 DID SDK 生成 DID 标识 (did) 和 DID 签名值(didSign)
1)测试用例
@Test
public void generateDidtest() {DidClient didClient = this.getDidClient();
DidDataWrapper didDataWrapper = didClient.createDid();
System.out.println(JSONObject.toJSONString(didDataWrapper));
assertNotNull(didDataWrapper);
assertNotNull(didDataWrapper.getDid());
assertNotNull(didDataWrapper.getDocument());
assertNotNull(didDataWrapper.getAuthKeyInfo());
assertNotNull(didDataWrapper.getRecyKeyInfo());
}
2)输入后果
{
"address":"0x6b48f123fe493a144df5cfc24e74d8639622d452",
"authKeyInfo":{
"privateKey":"73352081742544535007412511358750380682016965583404841637572340950252082648181",
"publicKey":"9784207274559734436040166487546186979629799048299924533536969953181115829508641603663755398772837199880448005621139241901177149041470382540707320562016661",
"type":"Secp256k1"
},
"did":"did:bsn:4Qc1ZMwJ2kCDEiZaoW86gbCDopY8",
"didSign":"P6yJGMe9O3HQZ/yXlUdsp/fAZAtqUwI1JbjJG9Xik5MVdWseWay6IaRYj2A27+wGuOeLYBbUO5aNfS+9zI1nTgA=",
"document":{
"authentication":{
"publicKey":"9784207274559734436040166487546186979629799048299924533536969953181115829508641603663755398772837199880448005621139241901177149041470382540707320562016661",
"type":"Secp256k1"
},
"created":"2022-09-08 10:39:52",
"did":"did:bsn:4Qc1ZMwJ2kCDEiZaoW86gbCDopY8",
"proof":{
"creator":"did:bsn:4Qc1ZMwJ2kCDEiZaoW86gbCDopY8",
"signatureValue":"qGSQGQ3LsZWzwKPjXSFpc6QNEyX3hLk4jruhKNMRB1pCh7AujHS0R8TN2HYzdan7HigqMD2RBQW8I0g50xQDZgA=",
"type":"Secp256k1"
},
"recovery":{
"publicKey":"11269225430181361242836691470083240698588912504999066036334383939658125900799001159485142543525883167181641171521691885487531759310220878775219494602416230",
"type":"Secp256k1"
},
"updated":"2022-09-08 10:39:52",
"version":"1"
},
"recyKeyInfo":{
"privateKey":"108084336084494583976203572769842945795131580451324537320160683149905374350774",
"publicKey":"11269225430181361242836691470083240698588912504999066036334383939658125900799001159485142543525883167181641171521691885487531759310220878775219494602416230",
"type":"Secp256k1"
}
}
留神: 平台方仅需注册一次 DID,所以倡议平台方独自应用 DID SDK,无需将其集成到业务零碎内。
2、平台方人员需在官网门户提交平台方的 BSN DID 和 DID 私钥对 DID 的签名值,并下载 DDC 业务凭证
(四)资金账户充值、创立我的项目
1、平台方能够在官网门户内通过微信领取、企业网银或者线下汇款的形式为本人的资金账户充值
留神: 门户资金账户充值后,平台方可通过官网门户或门户 OpenAPI,将资金账户余额充值到本人的任何 DDC 凋谢联盟链上的任何链账户内,以保障这些链账户在相应的链上发动的区块链交易能失常执行。
2、在创立我的项目页面中输出【项目名称】,【凋谢链框架】下拉中抉择【中移链】即可实现创立
留神: 我的项目创立实现后不容许批改凋谢链框架,参考链接:https://bsnbase.com/static/tm…
四、门户 OpenAPI 的接口调用
(一)在线生成链账户公私钥对
1、接口地址: /ddcoai/sys/v1/opb/account/create/publicprivatekey
2、申请形式: POST
3、接口形容
平台方可通过 OpenAPI 对所属 DDC 链账户进行在线生成公私钥对,哪些框架反对可通过 '凋谢联盟链框架 - 列表查问' 接口返回值中 opcOnlineCreate 为 0 示意。
4、申请头
apitoken:eyJ0eXAiOi**********************************************UG9VHWZFBg
5、申请参数
参数名称 | 参数阐明 | 是否必须 | 数据类型 |
---|---|---|---|
opbChainId | 凋谢联盟链框架 | 是 | integer |
6、响应参数
参数名称 | 参数阐明 | 类型 |
---|---|---|
code | 胜利:0,失败:-1 | integer |
errorLogCode | 谬误日志编码 | string |
errorLogMessage | 谬误日志阐明 | string |
message | 音讯编码 | string |
data | 后果对象 | object |
portalToken | 凭此 token 能够访问共享接口,返回空则示意无奈应用 | string |
7、Java 申请示例
1)测试用例
private String baseUrl = "https://openapi-ddc.bsnbase.com";
private String apiToken = "eyJ0eXAiOi**********************************************UG9VHWZFBg";
@Test
public void testCreateKeyPair() {
String url = baseUrl + "/ddcoai/sys/v1/opb/account/create/publicprivatekey";
CreateKeyPair request = CreateKeyPair.builder()
.opbChainId(9)
.build();
String result = HttpRequest.post(url)
.header("apitoken", apiToken)
.body(JSONUtil.toJsonStr(request))
.execute().body();
System.out.println(result);
}
2)响应后果
{
"code":0,
"errorLogCode":null,
"errorLogMessage":"","message":"MSG_00000","data":"Public key:\nEOS83Vsg9nooWLoEJNvAtAmr8en5UQMdoU7ztdrjxiL4UGytFUQnB\n\nPrivate key:\n5KbkeSYfXgBWYQsv1NoQsp1nRcYBpGe5BnvucmJcUAR1E4ALYV6\n\nChain account address:\n\n\nMnemonic:\n[calm, cram, relief, inside, pistol, blood, merit, monitor, parade, aspect, network, buffalo]\n\nAlgorithm:\nsecp256k1","portalToken":null
}
(二)创立链账户
1、接口地址: /ddcoai/sys/v1/opb/account/create/save
2、申请形式: POST
3、接口形容
生成链账户后,平台方通过官网门户 OpenAPI 登记注册链账户。只有接入官网 DDC 合约的链账户能力启用 BSN-DDC 业务性能。新建时能够不接入官网 DDC 合约,可调“接入官网 DDC 合约”接口接入。
4、申请头
apitoken:eyJ0eXAiOi**********************************************UG9VHWZFBg
5、申请参数
参数名称 | 参数阐明 | 是否必须 | 数据类型 |
---|---|---|---|
opbChainClientName | 链账户名称 | 是 | string |
opbChainClientType | 用户类型(1= 平台方 2= 平台方的用户) | 否 | integer |
opbChainId | 凋谢联盟链框架 ID(调用接口:凋谢联盟链 - 框架列表查问) | 是 | integer |
opbKeyType | 链账户类型(调用接口:凋谢联盟链 - 框架反对的链账户类型) | 是 | integer |
opbPublicKey | 上传公钥(依据链账户类型为 2,值必填) | 否 | string |
openDdc | 是否接入官网 DDC 合约 1= 不接入 5= 接入 | 是 | integer |
proof | DDC 业务开明凭证 内容须要通过 json 本义 | 是 | string |
6、响应参数
参数名称 | 参数阐明 | 类型 |
---|---|---|
code | 胜利:0,失败:-1 | integer |
errorLogCode | 谬误日志编码 | string |
errorLogMessage | 谬误日志阐明 | string |
message | 音讯编码 | string |
data | 后果对象 | object |
opbChainClientAddress | 链账户地址 | string |
portalToken | 凭此 token 能够访问共享接口,返回空则示意无奈应用 | string |
7、Java 申请示例
1)测试用例
private String baseUrl = "https://openapi-ddc.bsnbase.com";
private String apiToken = "eyJ0eXAiOi**********************************************UG9VHWZFBg";
private String proof = "{\"claim\":{\"entName\":\"******\",\"domain\":\"http://www.chinamobilesz.com/\",\"loginName\":\"******\",\"did\":\"******\"},\"context\":\"https://www.w3.org/2018/credentials/v1\",\"cptId\":\"882201251518080013\",\"created\":\"2022-08-19 03:14:15\",\"expirationDate\":\"2042-08-19\",\"id\":\"1560465138044243968\",\"issuerDid\":\"******\",\"proof\":{\"creator\":\"******\",\"type\":\"Secp256k1\",\"signatureValue\":\"******\"},\"shortDesc\":\"DDC 业务凭证模板 \",\"type\":\"Proof\",\"userDid\":\"******\"}";
@Test
public void testSaveAccount() {
String url = baseUrl + "/ddcoai/sys/v1/opb/account/create/save";
SaveAccount request = SaveAccount.builder()
.opbChainClientName("ddctest11112")
.opbChainClientType(1)
.opbChainId(9)
.opbKeyType(2)
.opbPublicKey("EOS6R3jYqb3uZsVgzJz4HVLcYV94CLkr3u9unEzm5rpuAqUos7fqK")
.openDdc("1")
.proof(proof)
.build();
String result = HttpRequest.post(url)
.header("apitoken", apiToken)
.body(JSONUtil.toJsonStr(request))
.execute().body();
System.out.println(result);
}
2)响应后果
{
"code":0,
"errorLogCode":null,
"errorLogMessage":"","message":"MSG_00000","data":{"opbChainClientAddress":"ddctest11112"},"portalToken":null
}
(三)接入官网 DDC 合约
1、接口地址: /ddcoai/sys/v1/opb/account/access/official/save
2、申请形式: POST
3、接口形容
基于已有的链账户地址接入官网 DDC 合约。
4、申请头
apitoken:eyJ0eXAiOi**********************************************UG9VHWZFBg
5、申请参数
参数名称 | 参数阐明 | 是否必须 | 数据类型 |
---|---|---|---|
opbChainClientAddress | 链账户地址 | 是 | string |
opbChainClientType | 用户类型(1= 平台方 2= 平台方的用户) | 否 | integer |
opbChainId | 凋谢联盟链框架 ID(调用接口:凋谢联盟链 - 框架列表查问) | 是 | integer |
proof | DDC 业务开明凭证 内容须要通过 json 本义 | 是 | string |
6、响应参数
参数名称 | 参数阐明 | 类型 |
---|---|---|
code | 胜利:0,失败:-1 | integer |
errorLogCode | 谬误日志编码 | string |
errorLogMessage | 谬误日志阐明 | string |
message | 音讯编码 | string |
data | 后果对象 | object |
opbChainClientAddress | 链账户地址 | string |
portalToken | 凭此 token 能够访问共享接口,返回空则示意无奈应用 | string |
7、Java 申请示例
1)测试用例
private String baseUrl = "https://openapi-ddc.bsnbase.com";
private String apiToken = "eyJ0eXAiOi**********************************************UG9VHWZFBg";
private String proof = "{\"claim\":{\"entName\":\"******\",\"domain\":\"http://www.chinamobilesz.com/\",\"loginName\":\"******\",\"did\":\"******\"},\"context\":\"https://www.w3.org/2018/credentials/v1\",\"cptId\":\"882201251518080013\",\"created\":\"2022-08-19 03:14:15\",\"expirationDate\":\"2042-08-19\",\"id\":\"1560465138044243968\",\"issuerDid\":\"******\",\"proof\":{\"creator\":\"******\",\"type\":\"Secp256k1\",\"signatureValue\":\"******\"},\"shortDesc\":\"DDC 业务凭证模板 \",\"type\":\"Proof\",\"userDid\":\"******\"}";
@Test
public void testSaveOfficial() {
String url = baseUrl + "/ddcoai/sys/v1/opb/account/access/official/save";
SaveOfficial request = SaveOfficial.builder()
.opbChainClientAddress("ddctest11112")
.opbChainClientType(1)
.opbChainId(9)
.proof(proof)
.build();
String result = HttpRequest.post(url)
.header("apitoken", apiToken)
.body(JSONUtil.toJsonStr(request))
.execute().body();
System.out.println(result);
}
2)响应后果
{
"code":0,
"errorLogCode":null,
"errorLogMessage":"","message":"MSG_00000","data":{"opbChainClientAddress":"ddctest11112"},"portalToken":null
}
(四)查看链账户详情
1、接口地址: /ddcoai/sys/v1/opb/account/check/details/search
2、申请形式: POST
3、接口形容
查看 DDC 链账户的根本信息。
4、申请头
apitoken:eyJ0eXAiOi**********************************************UG9VHWZFBg
5、申请参数
参数名称 | 参数阐明 | 是否必须 | 数据类型 |
---|---|---|---|
opbChainClientAddress | DDC 链账户地址 | 是 | string |
opbChainId | 凋谢联盟链框架 ID | 是 | integer |
6、响应参数
参数名称 | 参数阐明 | 类型 |
---|---|---|
code | 胜利:0,失败:-1 | integer |
errorLogCode | 谬误日志编码 | string |
errorLogMessage | 谬误日志阐明 | string |
message | 音讯编码 | string |
data | 后果对象 | object |
business | 官网 DDC 业务费余额(分) | integer |
createDate | 创立工夫 | string |
did | DID | string |
gasNum | 能量值余额(最大 50 长度 8 个小数点) | string |
opbChainClientAddress | 链账户地址 | string |
opbChainClientName | 链账户名称 | string |
opbChainClientType | 用户类型(1= 平台方,2= 平台方的用户) | integer |
opbChainName | 凋谢联盟链框架 | string |
opbChainType | 链账户类型 | string |
openDdcYn | 是否已接入官网 DDC 合约:1= 未接入(只开明 OPB 没有上 DDC 合约)5= 已接入 | integer |
opsPlatformState | 经营方设置状态(0= 未接入官网 DDC 合约 1= 解冻 2= 已启用(未解冻) 3= 解冻中 4= 冻结中) | integer |
platformSetState | 平台方设置状态(0= 未接入官网 DDC 合约 1= 解冻 2= 已启用(未解冻) 3= 解冻中 4= 冻结中) | integer |
portalToken | 凭此 token 能够访问共享接口,返回空则示意无奈应用 | string |
7、Java 申请示例
1)测试用例
private String baseUrl = "https://openapi-ddc.bsnbase.com";
private String apiToken = "eyJ0eXAiOi**********************************************UG9VHWZFBg";
@Test
public void testQueryAccount() {
String url = baseUrl + "/ddcoai/sys/v1/opb/account/check/details/search";
SearchAccount request = SearchAccount.builder()
.opbChainClientAddress("ddctest11112")
.opbChainId(9)
.build();
String result = HttpRequest.post(url)
.header("apitoken", apiToken)
.body(JSONUtil.toJsonStr(request))
.execute().body();
System.out.println(result);
}
2)响应后果
{
"code":0,
"errorLogCode":null,
"errorLogMessage":"","message":"MSG_00000","data":{"did":"did:bsn:49oahBPHZ41zqCbzUPkqRMdqBGvb","opbChainClientName":"ddctest11112","opbChainClientType":1,"business":100,"createDate":"2022-09-05 17:11:22","opbChainName":" 中移链(基于 EOS v2.1)","opbChainClientAddress":"ddctest11112","opbChainType":"2","openDdcYn":5,"gasNum":"NET:1808172 bytes,CPU:688319 us,RAM:10247 bytes","platformSetState":2,"opsPlatformState":2},
"portalToken":null
}
(五)EOS 分配资源
1、接口地址: /ddcoai/sys/v1/opb/eos/resource/save
2、申请形式: POST
3、接口形容
平台方可通过 OpenAPI 对所属 DDC 链账户进行分配资源。链账户分配资源所需总金额可通过 EOS 分配资源价格计算接口进行预览。
4、申请头
apitoken:eyJ0eXAiOi**********************************************UG9VHWZFBg
5、申请参数
参数名称 | 参数阐明 | 是否必须 | 数据类型 |
---|---|---|---|
cpuValue | 充值 cpu 数量(SYS) | 是 | integer |
netValue | 充值 net 数量(SYS) | 是 | integer |
opbChainClientAddress | 链账户地址 | 是 | string |
opbChainId | 凋谢联盟链框架 | 是 | integer |
proof | DDC 业务开明凭证 内容须要通过 json 本义 | 是 | string |
ramValue | 充值 ram 数量(KB) | 是 | integer |
reqTransactionSn | 第三方流水号 | 是 | string |
validDate | 资源有效期(30 天起售)(格局:yyyy-MM-dd) | 是 | string(date-time) |
6、响应参数
参数名称 | 参数阐明 | 类型 |
---|---|---|
code | 胜利:0,失败:-1 | integer |
errorLogCode | 谬误日志编码 | string |
errorLogMessage | 谬误日志阐明 | string |
message | 音讯编码 | string |
data | 后果对象 | object |
portalToken | 凭此 token 能够访问共享接口,返回空则示意无奈应用 | string |
7、Java 申请示例
1)测试用例
private String baseUrl = "https://openapi-ddc.bsnbase.com";
private String apiToken = "eyJ0eXAiOi**********************************************UG9VHWZFBg";
private String proof = "{\"claim\":{\"entName\":\"******\",\"domain\":\"http://www.chinamobilesz.com/\",\"loginName\":\"******\",\"did\":\"******\"},\"context\":\"https://www.w3.org/2018/credentials/v1\",\"cptId\":\"882201251518080013\",\"created\":\"2022-08-19 03:14:15\",\"expirationDate\":\"2042-08-19\",\"id\":\"1560465138044243968\",\"issuerDid\":\"******\",\"proof\":{\"creator\":\"******\",\"type\":\"Secp256k1\",\"signatureValue\":\"******\"},\"shortDesc\":\"DDC 业务凭证模板 \",\"type\":\"Proof\",\"userDid\":\"******\"}";
@Test
public void testSaveResource() {
String url = baseUrl + "/ddcoai/sys/v1/opb/eos/resource/save";
SaveResource request = SaveResource.builder()
.cpuValue(1)
.netValue(1)
.opbChainClientAddress("ddctest11112")
.opbChainId(9)
.proof(proof)
.ramValue(10)
.reqTransactionSn("8950jg89j0fi94i")
.validDate("2022-10-06")
.build();
String result = HttpRequest.post(url)
.header("apitoken", apiToken)
.body(JSONUtil.toJsonStr(request))
.execute().body();
System.out.println(result);
}
2)响应后果
{
"code": 0,
"errorLogCode": null,
"errorLogMessage": "","message":"MSG_00000","data": null,"portalToken": null
}
(六)EOS 分配资源后果查问
1、接口地址: /ddcoai/sys/v1/opb/eos/resource/search
2、申请形式: POST
3、接口形容
平台方可通过 OpenAPI 对所属 DDC 链账户的 EOS 分配资源后果进行查问。
4、申请头
apitoken:eyJ0eXAiOi**********************************************UG9VHWZFBg
5、申请参数
参数名称 | 参数阐明 | 是否必须 | 数据类型 |
---|---|---|---|
opbChainClientAddress | 链账户地址 | 是 | string |
reqTransactionSn | 第三方流水号 | 是 | string |
6、响应参数
参数名称 | 参数阐明 | 类型 |
---|---|---|
code | 胜利:0,失败:-1 | integer |
errorLogCode | 谬误日志编码 | string |
errorLogMessage | 谬误日志阐明 | string |
message | 音讯编码 | string |
data | 后果对象 | object |
opbChainClientAddress | 链账户地址 | string |
rechargeState | GAS 充值状态 1- 充值中 5- 充值失败 10= 充值胜利 | integer |
reqTransactionSn | 第三方流水号 | string |
portalToken | 凭此 token 能够访问共享接口,返回空则示意无奈应用 | string |
7、Java 申请示例
1)测试用例
private String baseUrl = "https://openapi-ddc.bsnbase.com";
private String apiToken = "eyJ0eXAiOi**********************************************UG9VHWZFBg";
@Test
public void testQueryResource() {
String url = baseUrl + "/ddcoai/sys/v1/opb/eos/resource/search";
SearchResource request = SearchResource.builder()
.opbChainClientAddress("ddctest11111")
.reqTransactionSn("8950jg89j0fi94i")
.build();
String result = HttpRequest.post(url)
.header("apitoken", apiToken)
.body(JSONUtil.toJsonStr(request))
.execute().body();
System.out.println(result);
}
2)响应后果
{
"code":0,
"errorLogCode":null,
"errorLogMessage":"","message":"MSG_00000","data":{"opbChainClientAddress":"ddctest11111","reqTransactionSn":"8950jg89j0fi94i","rechargeState":10},
"portalToken":null
}
(七)官网 DDC 业务费充值
1、接口地址: /ddcoai/sys/v1/opb/account/business/save
2、申请形式: POST
3、接口形容
如果应用官网合约发动 DDC 交易则须要官网 DDC 业务费,因而可通过 OpenAPI 给平台方所属 DDC 链账户进行充值。
4、申请头
apitoken:eyJ0eXAiOi**********************************************UG9VHWZFBg
5、申请参数
参数名称 | 参数阐明 | 是否必须 | 数据类型 |
---|---|---|---|
businessMoney | 充值官网 DDC 业务费金额(单位:分) | 是 | integer |
opbChainClientAddress | 链账户地址 | 是 | string |
opbChainId | 凋谢联盟链框架 | 是 | integer |
proof | DDC 业务开明凭证 内容须要通过 json 本义 | 是 | string |
reqTransactionSn | 第三方流水号(数字字母下划线组成) | 是 | string |
6、响应参数
参数名称 | 参数阐明 | 类型 |
---|---|---|
code | 胜利:0,失败:-1 | integer |
errorLogCode | 谬误日志编码 | string |
errorLogMessage | 谬误日志阐明 | string |
message | 音讯编码 | string |
data | 后果对象 | object |
portalToken | 凭此 token 能够访问共享接口,返回空则示意无奈应用 | string |
7、Java 申请示例
1)测试用例
private String baseUrl = "https://openapi-ddc.bsnbase.com";
private String apiToken = "eyJ0eXAiOi**********************************************UG9VHWZFBg";
private String proof = "{\"claim\":{\"entName\":\"******\",\"domain\":\"http://www.chinamobilesz.com/\",\"loginName\":\"******\",\"did\":\"******\"},\"context\":\"https://www.w3.org/2018/credentials/v1\",\"cptId\":\"882201251518080013\",\"created\":\"2022-08-19 03:14:15\",\"expirationDate\":\"2042-08-19\",\"id\":\"1560465138044243968\",\"issuerDid\":\"******\",\"proof\":{\"creator\":\"******\",\"type\":\"Secp256k1\",\"signatureValue\":\"******\"},\"shortDesc\":\"DDC 业务凭证模板 \",\"type\":\"Proof\",\"userDid\":\"******\"}";
@Test
public void testSaveBusiness() {
String url = baseUrl + "/ddcoai/sys/v1/opb/account/business/save";
SaveBusiness request = SaveBusiness.builder()
.businessMoney(100)
.opbChainClientAddress("ddctest11112")
.opbChainId(9)
.proof(proof)
.reqTransactionSn("8950jg89j0fi901")
.build();
String result = HttpRequest.post(url)
.header("apitoken", apiToken)
.body(JSONUtil.toJsonStr(request))
.execute().body();
System.out.println(result);
}
2)响应后果
{
"code": 0,
"errorLogCode": null,
"errorLogMessage": "","message":"MSG_00000","data": null,"portalToken": null
}
(八)官网 DDC 业务费充值后果查问
1、接口地址: /ddcoai/sys/v1/opb/account/business/result/search
2、申请形式: POST
3、接口形容
平台方可通过 OpenAPI 对所属 DDC 链账户的官网 DDC 业务费充值后果进行查问。
4、申请头
apitoken:eyJ0eXAiOi**********************************************UG9VHWZFBg
5、申请参数
参数名称 | 参数阐明 | 是否必须 | 数据类型 |
---|---|---|---|
opbChainClientAddress | 链账户地址 | 是 | string |
reqTransactionSn | 第三方流水号(数字字母下划线组成) | 是 | string |
6、响应参数
参数名称 | 参数阐明 | 类型 |
---|---|---|
code | 胜利:0,失败:-1 | integer |
errorLogCode | 谬误日志编码 | string |
errorLogMessage | 谬误日志阐明 | string |
message | 音讯编码 | string |
data | 后果对象 | object |
opbChainClientAddress | 链账户地址 | string |
rechargeState | 官网 DDC 业务费充值状态 1- 充值中 5- 充 值失败 10= 充值胜利 | integer |
reqTransactionSn | 第三方流水号 | string |
portalToken | 凭此 token 能够访问共享接口,返回空则示意无奈应用 | string |
7、Java 申请示例
1)测试用例
private String baseUrl = "https://openapi-ddc.bsnbase.com";
private String apiToken = "eyJ0eXAiOi**********************************************UG9VHWZFBg";
@Test
public void testQueryBusiness() {
String url = baseUrl + "/ddcoai/sys/v1/opb/account/business/result/search";
SearchBusiness request = SearchBusiness.builder()
.opbChainClientAddress("ddctest11112")
.reqTransactionSn("8950jg89j0fi901")
.build();
String result = HttpRequest.post(url)
.header("apitoken", apiToken)
.body(JSONUtil.toJsonStr(request))
.execute().body();
System.out.println(result);
}
2)响应后果
{
"code":0,
"errorLogCode":null,
"errorLogMessage":"","message":"MSG_00000","data":{"opbChainClientAddress":"ddctest11112","reqTransactionSn":"8950jg89j0fi901","rechargeState":10},
"portalToken":null
}
五、常见问题
(一)申请 OpenAPI 接口时,返回谬误编码:MSG_20010005、MSG_10021005、MSG_10021029、MSG_10022013、MSG_10027007、MSG_10021059 等,如何解决?
MSG_20010005:apitoken 受权认证失败,起因是申请头中的 apitoken 传参谬误,能够从业务开明信息页面的门户 OpenAPI Token 获取;
MSG_10021005:链账户不存在,起因是该链账户没有创立,或者该链账户没有接入官网 DDC 合约;
MSG_10021029:充值流水号反复,起因是第三方流水号反复了,须要放弃第三方流水号全局惟一,同时须要留存以供查问应用;
MSG_10022013:找不到平台方 DID,起因是暂未注册 DID 标识,或者 DID 标识还在注册中,须要注册胜利后申请;
MSG_10027007:购买的资源有效期必须大于 30 天,起因是资源有效期设置必须大于 30 天,暂不反对小于 30 天的资源有效期;
MSG_10021059:链账户名称格局谬误,起因是中移链的链账户格局要求:12 个字符,只能包含【12345 和 26 个小写字母】。
(二)对于链账户创立,链账户的名称是否可反复、可批改,以及平台方账户和终端用户账户有什么区别?
目前是同一个账户下链账户名称不能够反复,不能够批改;平台方账户能够治理终端账户的状态,能够在 DDC-SDK 里对终端用户进行充值。
(三)对于 DDC 业务费充值,为什么用 OpenAPI 进行 DDC 业务费充值后,BSN-DDC 门户网站仍显示为 0?
门户的业务费、能量值、DDC 的显示都不是实时的,是链上同步至链下,链下定时排队去更新的,倡议用户应用 OpenAPI 操作创立链账户,接入官网 DDC,业务费充值,账户状态变更后都间接调用 DDC-SDK 中的办法去链上确认后果。
(四)对于 DDC 生成,应用官网 DDC 合约生成 DDC 都须要领取哪些费用?
应用官网 DDC 合约生成 DDC 时,sender 账户要领取本次交易所须要耗费的能量值(5 分钱左右)和 DDC 业务费(生成 1 元,转移、销毁 3 毛)。
(五)对于 DDC 生成,应用官网 DDC-SDK 进行 mint 操作时 ddcURI 字段该如何传参?
ddcURI 字段为 DDC 标识符,该字段为 String 类型,长度限度是 1000,内容 BSN 不做限度,用户可依据本人的业务场景自行传值,例如:{“amount”:5000,”id”:”001″,”name”:”name”,”company”:” 公司 ”,”seq”:1710,”url”:”https://xxxx/upload/file/xx.jpg”}。
(六)对于 DDC 受权和账户受权,两者的区别是什么?
DDC 受权是用户将名下的某个 DDC 受权给第三方,账户受权是用户将名下的所有 DDC 受权给第三方,DDC 受权在 DDC 被转移后受权生效,账户受权勾销受权后才会生效。