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的例子可以参考: SuperDictionary ,GitHub链接
SuperDictionary 的使用过程可参见以下视频:
https://www.bilibili.com/video/av23217213/