[星云链]如何在Dapp中使用NebPay SDK

NebPay SDK介绍

NeyPay 是官方发布的星云链支付工具,可以用来解决Dapp中的支付需求。

用户在使用Dapp过程中需要发送交易,但是直接在Dapp中导入钱包文件或输入私钥是极不安全的,所以Nebulas官方提供了一个支付接口NebPay。Dapp开发者可以使用NebPay作为支付通道,来处理sendTransaction的需求。Dapp用户需要安装浏览器插件(桌面端)或钱包APP(移动端)来完成Dapp页面发起的交易请求。

如果Dapp页面需要与Nebulas网络进行其他非交易类的信息交互,比如查询数据、订阅event等,则可以使用neb.js直接与Nebulas网络交互。

NebPay 根据不同的支付场景提供了4个支付API和1个交易查询API。关于接口的详细说明可以参考文档

接口简介
pay用于账户间的NAS转账
nrc20pay用于NRC20代币的转账,仅接口实现,app不支持
deploy用于部署智能合约,仅接口实现(目前尚不支持该API)
call用于调用智能合约
queryPayInfo用于查询支付结果

调用支付API时会返回一个交易序列号,然后Dapp可以使用查询API通过该序列号查询交易的结果。

Dapp页面中使用 NebPay

如果在Dapp中使用NebPay,需要在github下载NebPay源码,然后按照readme中的说明用gulp指令打包生成nebpay.js。然后插入到Dapp页面就可以使用了。

示例代码如下:

<script src="nebPay.js"></script>
<script >
    var NebPay = require("nebpay");
    var nebPay = new NebPay();    
    var serialNumber; //交易序列号
    var intervalQuery; //定时查询交易结果

    //点击按钮发起交易, 这里为调用智能合约的例子
    function onButtonClick() {        
        var to = dappAddress;   //Dapp的合约地址
        var value = "0";
        var callFunction = "" //调用的函数名称
        var callArgs =  ""  //参数格式为参数数组的JSON字符串, 比如'["arg"]','["arg1","arg2]'        
        var options = {
            goods: {        //商品描述
                name: "example"
            },
            //callback 是交易查询服务器地址,
            //callback: NebPay.config.mainnetUrl //在主网查询(默认值)
            callback: NebPay.config.testnetUrl //在测试网查询
        }

        //发送交易(发起智能合约调用)
        serialNumber = nebPay.call(to, value, callFunction, callArgs, options);

        //设置定时查询交易结果
        intervalQuery = setInterval(function() {
            funcIntervalQuery();
        }, 10000); //建议查询频率10-15s,因为星云链出块时间为15s,并且查询服务器限制每分钟最多查询10次。
    }

    //查询交易结果. queryPayInfo返回的是一个Promise对象.
    function funcIntervalQuery() {   
        //queryPayInfo的options参数用来指定查询交易的服务器地址,(如果是主网可以忽略,因为默认服务器是在主网查询)
        nebPay.queryPayInfo(serialNumber, options)   //search transaction result from server (result upload to server by app)
            .then(function (resp) {
                console.log("tx result: " + resp)   //resp is a JSON string
                var respObject = JSON.parse(resp)
                //code==0交易发送成功, status==1交易已被打包上链
                if(respObject.code === 0 && respObject.data.status === 1){                    
                    //交易成功,处理后续任务....
                    clearInterval(intervalQuery)    //清除定时查询
                }
            })
            .catch(function (err) {
                console.log(err);
            });
    }

</script>

queryPayInfo(serialNumber) 查询到的结果格式为JSON字符串,可以反序列化JSON.parse(resp)得到JS对象。查询结果的格式为:

//查询失败, 没有该记录, 可以多查询几次
{
    "code": 1,
    "data": {},
    "msg": "payId ZBTSkk74dB4tPJI9J8FDFMu270h7yaut get transaction error"
}
//查询成功
{
    "code": 0,
    "data": {
        "data": null,
        "contractAddress": "",
        "type": "binary",
        "nonce": 136,
        "gasLimit": "30000",
        "gasUsed": "20000",
        "chainId": 1001,
        "from": "n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE",
        "to": "n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE",
        "value": "1000000000000000000",
        "hash": "f9549a5c01f50f372607b9fd29bf15d483246578f6cc7008d6e2a537920802e6",
        "gasPrice": "1000000",
        "status": 1,  //建议使用status来判断是否已上链
        "timestamp": 1525508076
    },
    "msg": "success"
}

以NebPay + 钱包App为例,一个交易的发送过程大致有以下几步:

  • 用户发起交易,Dapp 调用NebPay 发送交易信息到App, 此时NebPay返回交易序列号给Dapp。
  • 用户通过App将交易发送到星云链, 并得到交易的TxHash
  • App 将交易序列号TxHash 发送到由callback指定的交易查询服务器。
  • Dapp调用queryPayInfo 到交易查询服务器查询交易结果.
    这里写图片描述

需要注意的是,NebPay 并不关心当前使用的是主网或测试网,只是把交易信息发给浏览器插件或手机app,由后者决定将交易发送到哪个网络。callback参数也只是决定使用哪个服务器查询交易结果,并不会影响交易发送的网络。

NebPay 使用范例

这里有个使用nebPay的例子可以参考: SuperDictionaryGitHub链接

SuperDictionary 的使用过程可参见以下视频:
https://www.bilibili.com/video/av23217213/

欢迎对星云感兴趣的开发者或爱好者来StackExchange 沟通交流。
Stack Exchange Q&A site proposal: Nebulas

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值