关于区块链开发:中移链DDCSDK技术对接全流程三

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被转移后受权生效,账户受权勾销受权后才会生效。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理