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)测试用例

@Testpublic 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,失败:-1integer
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";@Testpublic 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
proofDDC业务开明凭证 内容须要通过json本义string

6、响应参数

参数名称参数阐明类型
code胜利:0,失败:-1integer
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\":\"******\"}";@Testpublic 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
proofDDC业务开明凭证 内容须要通过json本义string

6、响应参数

参数名称参数阐明类型
code胜利:0,失败:-1integer
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\":\"******\"}";@Testpublic 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、申请参数

参数名称参数阐明是否必须数据类型
opbChainClientAddressDDC链账户地址string
opbChainId凋谢联盟链框架IDinteger

6、响应参数

参数名称参数阐明类型
code胜利:0,失败:-1integer
errorLogCode谬误日志编码string
errorLogMessage谬误日志阐明string
message音讯编码string
data后果对象object
 business官网DDC业务费余额(分)integer
 createDate创立工夫string
 didDIDstring
 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";@Testpublic 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
proofDDC业务开明凭证 内容须要通过json本义string
ramValue充值ram数量(KB)integer
reqTransactionSn第三方流水号string
validDate资源有效期(30天起售)(格局:yyyy-MM-dd)string(date-time)

6、响应参数

参数名称参数阐明类型
code胜利:0,失败:-1integer
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\":\"******\"}";@Testpublic 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,失败:-1integer
errorLogCode谬误日志编码string
errorLogMessage谬误日志阐明string
message音讯编码string
data后果对象object
 opbChainClientAddress链账户地址string
 rechargeStateGAS充值状态 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";@Testpublic 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
proofDDC业务开明凭证 内容须要通过json本义string
reqTransactionSn第三方流水号(数字字母下划线组成)string

6、响应参数

参数名称参数阐明类型
code胜利:0,失败:-1integer
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\":\"******\"}";@Testpublic 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,失败:-1integer
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";@Testpublic 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被转移后受权生效,账户受权勾销受权后才会生效。