介绍
为什么使用打点开放平台
打点开放平台帮助你更简单的使用 Bitcoin SV 的区块链上的基础设施。
用打点开放平台 API,给 APP 添加强大的功能。
使用打点登陆的 APP 可以展示在打点钱包应用市场,引流海量用户量。
登录
你可以为用户提供简单便捷的登录和注册方法。 打点钱包用户可以一键注册你的 APP,非打点钱包用户也可以通过 Facebook,Google,微信,手机或电子邮件立即注册打点钱包。集成后,你可以在打点钱包 应用商场上展示你的 APP,并开始带来大量新用户流量。
收付款
传统应用只能接受来自用户的付款,而不能向用户付款。使用打点开放平台 API 接口,你可以在 APP 和用户之间以及用户和用户之间安排交易。可以轻松设置高级付款选项,例如配置多个接收方,并将交易数据包含在比特币的 OP_RETURN 中。
请参考 订单支付
自动支付功能
提示用户授权你的APP和划转币到自动支付的钱包里去,在余额之内用户不需手动授权每次的付款。除了为用户带来便利之外,这还为基于微交易的 APP 和服务器到服务器用例开辟了新的可能性。使用打点开放平台的先进网络技术,我们 API 上的自动支付可以突破比特币网络的交易限制。
请参考 自动支付
Token代币和自定义资产
使用打点“Card”卡包资产轻松创建数字资产,打点用户可以直接从打点APP查看,收集和交易这些数字资产。如果您想制作“卡包”兼容的资产,建议您从打点PRO APP用户界面创建它。这将资产自动展示在卡包市场中,之后,您可以使用我们的badgeAPI来处理转移和其他管理。
也可以直接使用badgeAPI创建自定义资产。“Card”是给予badge功能,只是Card具有一组特定的属性,这使得它们在打点APP中更容易使用和展现。如果您需要对tokenized代币化资产需要更多自定义控制可以创建一个badge。
Card卡包和Badge均可使用试金石Touchstone进行独立验证。 如果您是钱包提供商或希望支持badge的交易所,则可以考虑运行轻量级的Touchstone节点。详细信息,请参见[github](https://github.com/dotwallet/touchstone)。
区块链数据存储
将你的用户数据或 APP 数据存储在区块链上的不可篡改记录中,让用户安心他们的重要的数据有安全的备份。这可以用来证明某些数据是在某个时间创建/接收的,并可以用来验证数据的完整性和准确性。有了这个可以是可审核的记录,可以证明奖金支付条件的公平性。
数据上链,可以通过支付,在订单的to参数里的type填写script然后再content参数里附加数据。可以在用户的交易订单附加数据也可以自己注册一个打点钱包自己交上链的费用。详细步骤请参考数据上链、 订单支付、 和 自动支付。
检查区块链
我们能够提供有关区块链的最详细和最新的信息。使用我们的查询 API 查询交易和区块链数据,并通过与 Merchant API 的直接连接检查区块链的状态。
请参考 区块链查询
入门
本教程使用了我们SDK和工具 中提供的JavaScript库 和 Docker 微服务服务器. 如果需要更完整,纯JavaScript的例子,请详见 纯js教程。
本教程的完整代码在我们的JavaScript范例中
搭建
<!-- 拉进打点js库,要保证它在body之后加载,要不然它会找不到相关要挂钩的div,所以使用defer -->
<script
src="https://unpkg.com/@dotwallet/js/dist/dotwallet.umd.js"
defer
></script>
<!-- 逻辑在此js文件,要保证它比打点js库之后加载 -->
<script src="./index.js" defer></script>
<!-- 做两个div,给打点js库使用,会变成我们的登录和付款按钮 -->
<body>
<div alt="dotwallet login button" id="my-login-button"></div>
<div alt="dotwallet payment button" id="my-pay-button"></div>
</body>
// index.js
const DotWallet = dotwallet.default;
/**
* API文档详见:
* https://dotwallet-microservice-xfl2wlshtq-de.a.run.app/docs
*/
const SERVER_URL = 'https://dotwallet-microservice-xfl2wlshtq-de.a.run.app';
/** 此client_id是我们的测试服务器的ID,在真实app里请用你自己的ID */
const authEndpoint = SERVER_URL + '/auth';
const clientID = '89d001043806644fdb4fb14099ff6be5';
/** 收款地址记得换成你自己的! */
const receiveAddress = '1L4eTJidJjVajv4caJkmQyTFRXBnoN4Pap';
/** 可以是其他页面,可是跳转页面必须叫 DotWallet.loginRedirect() */
const redirectURI = window.location.origin;
Login
// index.js
// ... 继续以上
DotWallet.loginButton('login-button', {
clientID,
redirectURI,
});
/**
* 此函数也会返回用户信息,可是本例子只需要用server_token,我们的微服务服务器有这个校验token,之后的请求都需要附上
*/
DotWallet.loginRedirect({
authEndpoint,
successCallback: (userData) => {
localStorage.setItem('server-token', userData.server_token);
},
});
Payment orders
叫服务器,让它生成一个order_id
,之后用它给用户跳转到付款确认界面。
// index.js
// ... 继续以上
const createOrderEndpoint = SERVER_URL + '/create-order';
const notifyURL = SERVER_URL + '/payment-result';
DotWallet.payButton('pay-button', {
productName: 'Bananas',
orderAmount: 900,
receiveAddress,
createOrderEndpoint,
redirectURI,
notifyURL,
fetchHeaders: {
Authorization: 'Bearer ' + localStorage.getItem('server-token'),
'Content-type': 'application/json; charset=UTF-8',
},
});
完事了!用这简单的函数已经成功的集成打点钱包,实现了用户授权登录和付款功能。
规范约定
以下是打点开放平台 API 资源的使用规范,如有任何疑问,可以联系我们的官方支持
协议
- 开放平台所有的 API 都将通过
https
协议进行访问
HTTP 请求
- 支持
GET
请求的 API,参数可以通过 http query string 的形式发送 - 支持
POST
请求的 API,不在 URL 中的参数,需使用JSON
发送,Http headerContent-Type
设置为application/json
HTTP 响应
如何判断 HTTP 是否请求成功?
以下为 HTTP 请求成功时的结果
HTTP 200
{
"code": 0,
"msg": "",
"data": {
"access_token": "YOUR-ACCESS-TOKEN",
"expires_in": 7200,
"token_type": "Bearer"
}
}
必须同时满足以下 2 个条件:
- HTTP Status Code 为 200
- 返回 JSON 的 body 中 code 字段为 0
身份认证
# 使用 shell 的话, 每次请求可以用以下的header
curl "api_endpoint_here"
-H "Authorization: Bearer YOUR-ACCESS-TOKEN"
如果 access_token 无效或者过期
code
会返回75000
错误
HTTP 200
{
"code": 75000,
"msg": "Invalid access token",
"data": null
}
DotWallet 将对所有的 Api 资源请求进行身份认证,应用程序通过在 HTTP Header 中添加如下格式的数据:
Authorization: Bearer YOUR-ACCESS-TOKEN
,来实现身份认证
如何进行身份授权,以获取 JWT 形式的 access_token
安全问题
为确保安全,请不要泄露你的 client_id/client_secret,应使用 Server-to-Server 方式,即由应用服务器端向 DotWallet 鉴权服务器发起请求获取 access_token
速率限制
目前为止没有请求速率限制
get
身份授权
DotWallet 开放平台的 API 需要经过授权后才能使用。 目前支持 3 种授权方式,以满足不同的开发需求
- 应用授权 token
- 用户授权 token
- 公私钥签名(beta)
用法概括:
- 应用授权 token 此 token 证明请求来源是在打点开放平台注册过的 app。 使用的 API 接口:订单支付、自动支付、区块链查询
- 用户授权 token 此 token 包含了用户对 app 授权了哪些权限(获取用户信息、允许自动支付、等) 使用的 API 接口:获取用户信息
- 公私钥签名(beta) 绑定一个打点钱包,然后通过签名方式证明你是此钱包的主人,之后可以直接替此钱包账户进行一些行为 使用的 API 接口:badge
使用用户授权和应用授权 token,需要先在 DotWallet 开放平台注册开发者账号及创建应用。
- 1: 申请注册开发者账号: https://developers.dotwallet.com/register
- 2: 在开放平台管理后台,创建应用。创建后请查看你提供的邮箱获取
client_id/client_secret
使用公私钥签名授权方式请联系我们。
应用授权
应用授权,使用 OAuth2 的 Client Credentials 授权模式,详见 RFC6749 (https://tools.ietf.org/html/rfc6749#section-4.4)
+---------+ +---------------+
| | | |
| |>--(A)- Client Authentication --->| Authorization |
| Client | | Server |
| |<--(B)---- Access Token ---------<| |
| | | |
+---------+ +---------------+
应用授权,使用 OAuth2 的 Client Credentials 授权模式
应用授权,是针对开发者应用级别的授权,是为了验证请求是由 DotWallet 开放平台的应用方发出的 这种类型的授予通常用于必须在后台运行且不与用户立即进行交互的服务器到服务器的交互。
curl -X POST 'https://api.ddpurse.com/v1/oauth2/get_access_token' \
-H 'Content-Type: application/json' \
--data-raw '{
"client_id": "<YOUR-CLIENT-ID>",
"grant_type": "client_credentials",
"client_secret":"<YOUR-CLIENT-SECRET>"
}'
以上请求的回返数据例子(JSON):
{
"code": 0,
"msg": "",
"data": {
"access_token": "JWT access token",
"expires_in": 7200,
"token_type": "Bearer"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/oauth2/get_access_token
Request Body
参数名 | 是否必须 | 说明 |
---|---|---|
client_id | 是 | 开发者应用 ID |
client_secret | 是 | 开发者应用私钥 |
grant_type | 是 | 固定值: client_credentials |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
access_token | string | 用于访问 API 接口的 access_token |
expires_in | int | access_token 的过期时间(秒) |
token_type | string | token 类型,返回固定值:Bearer |
使用 access_token
如何使用 access_token
进行 API 接口身份认证,请参考 身份认证
用户授权
用户授权,使用 OAuth2 的 Authorization code 授权模式,详见 RFC6749 (https://tools.ietf.org/html/rfc6749#section-4.1)
+----------+
| Resource |
| Owner |
| |
+----------+
^
|
(B)
+----|-----+ Client Identifier +---------------+
| -+----(A)-- & Redirection URI ---->| |
| User- | | Authorization |
| Agent -+----(B)-- User authenticates --->| Server |
| | | |
| -+----(C)-- Authorization Code ---<| |
+-|----|---+ +---------------+
| | ^ v
(A) (C) | |
| | | |
^ v | |
+---------+ | |
| |>---(D)-- Authorization Code ---------' |
| Client | & Redirection URI |
| | |
| |<---(E)----- Access Token -------------------'
+---------+ (w/ Optional Refresh Token)
用户授权基于 Oauth2 的 Authorization Code 流程,让第三方应用以 DotWallet 用户的身份,安全的访问用户授权的某些能力。
使用场景:
- 用户登录:通过用户授权,可以快速、安全的使用 DotWallet 登录应用。
- 获取用户信息:用户授权应用 - 获取用户信息的权限。
- 自动支付授权:用户授权应用 - 自动支付的权限。
- NFT授权:用户授权应用 - NFT铸造、转移、销毁的权限。
用户授权流程:
第 1 步: 构造授权的 URI
URI 范例:
https://api.ddpurse.com/v1/oauth2/authorize?client_id=YOUR-CLIENT-ID&redirect_uri=http%3A%2F%2FYOUR-REDIRECT-URL&response_type=code&state=YOUR-STATE&scope=user.info
- 按需要申请对应的
scope
权限,scope
需要用户同意授权
URL Parameters
参数名 | 是否必须 | 说明 |
---|---|---|
client_id | 是 | 开发者应用 ID |
redirect_uri | 是 | 授权后的跳转地址,需要对 redirect_uri 链接进行 url_encode 编码处理 |
response_type | 是 | 填写固定值: code |
state | 是 | 建议使用 32 位以上的随机字符串(比如 UUID)。state 是用于保持请求和回调的状态是否一致。该参数可用于防止 csrf 攻击(跨站请求伪造攻击) |
scope | 是 | 授权作用域,您需要获得用户同意授权的权限列表,获得用户授权后,可以使用和打点钱包用户有关的 API。申请多个权限使用空格分隔。目前支持的 scope 权限列表,请查看以下的 scope 列表 |
scope 列表
scope | 说明 |
---|---|
user.info | 获取用户基础信息权限 |
autopay.bsv | 获取自动支付 bsv 权限, 获取该权限后,可以对用户的自动支付账户,进行 bsv 扣款 |
autopay.btc | 获取自动支付 btc 权限, 获取该权限后,可以对用户的自动支付账户,进行 btc 扣款 |
autopay.eth | 获取自动支付 eth 权限, 获取该权限后,可以对用户的自动支付账户,进行 eth 扣款 |
autopay.{badge_code} | 获取自动支付 badge 权限, 获取该权限后,可以对用户的自动支付账户,进行 badge 扣款。注意:此处需要填入具体的badge标识码,如:autopay.9bbe61bede9868a194a3568b88f4d504cb9de7aca407adf7d1ad9bf867373914 |
agent.nft | 获取NFT授权后可以替普通用户进行铸造、转移、销毁NFT等操作 |
第 2 步: 引导用户跳转至第 1 步构造好的 URI
比如你可以通过一个简单的
<a>
标签,引导用户跳转到 DotWallet 进行授权登录
<a href="https://api.ddpurse.com/authorize?client_id=YOUR-CLIENT-ID&redirect_uri=http://localhost:9094/oauth2&response_type=code&state=xxx&scope=user.info">Use Dotwallet Login</a>
- 用户点击后将跳转到 DotWallet 授权页面,DotWallet 会要求用户登录,然后询问是否同意给予应用授权
第 3 步: 客户端通过回调 uri 获取 code
授权服务器,将重定向到应用客户端指定回调地址:
# The auth server will redirect to your callback url
curl -L https://YOUR-HOST/YOUR-REDIRECT-URI?code=xxxxx&state=YOUR-STATE-VALUE
- 在第 2 步用户同意授权后,DotWallet 将重定向到应用指定的 redirect_uri ,并在 query 参数中返回一个授权码
code
,同时原样返回应用传递过来的state
参数。 - 收到参数,请核对第 2 步发送的 state 和第 3 步收回的 state 是否一致。
URL Parameters
参数名 | 是否必须 | 说明 |
---|---|---|
state | true | 建议使用 32 位以上的随机字符串(比如 UUID)。state 是用于保持请求和回调的状态是否一致。该参数可用于防止 csrf 攻击(跨站请求伪造攻击) |
code | true | 授权服务器生成的 code |
第 4 步: 通过 code 换取 access_token
curl -X POST 'https://api.ddpurse.com/v1/oauth2/get_access_token' \
-H 'Content-Type: application/json' \
--data '{
"client_id": "<YOUR-CLIENT-ID>",
"client_secret": "<YOUR-CLIENT-SECRET>",
"grant_type": "authorization_code",
"code": "<YOUR-AUTHORIZATION-CODE>",
"redirect_uri":"https://your_callback_url"
}'
以上请求的回返数据例子(JSON):
{
"code": 0,
"msg": "",
"data": {
"access_token": "JWT access token",
"expires_in": 7200,
"refresh_token": "PDIWLOLXXQM5KAWINUFP7G",
"scope": "user.info autopay.bsv autopay.eth",
"token_type": "Bearer"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/oauth2/get_access_token
URL Parameters
参数名 | 是否必须 | 说明 |
---|---|---|
client_id | 是 | 开发者应用 ID |
client_secret | 是 | 开发者应用私钥 |
grant_type | 是 | 固定值:authorization_code |
code | 是 | 第 3 步获取到的 code |
redirect_uri | 是 | 这里的redirect_uri 必须和第一步提交的地址一致. 注:这个接口不会让浏览器跳转,在这里提交这个redirect_uri 只是为了验证请求来源是否一致 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
access_token | string | access_token,用于访问 API 接口 |
expires_in | int | access_token 的过期时间(秒) |
refresh_token | string | refresh_token 有效期默认为 7 天,当 access_token 过期时,可以通过 refresh_token 重新获取 access_token |
scope | string | 用户授权的 scope 权限列表 |
token_type | string | token 类型,返回固定值:Bearer |
第 5 步: 通过 refresh_token 重新获取 access_token (可选)
curl -X POST 'https://api.ddpurse.com/v1/oauth2/get_access_token' \
--header 'Content-Type: application/json' \
--data-raw '{
"client_id": "YOUR-CLIENT-ID",
"client_secret": "YOUR-CLIENT-SECRET",
"grant_type": "refresh_token",
"refresh_token":"LUWNYMQ0WG69LLYN--SMIG"
}'
以上请求的回返数据例子(JSON):
{
"code": 0,
"msg": "",
"data": {
"access_token": "JWT access token",
"expires_in": 7200,
"refresh_token": "PDIWLOLXXQM5KAWINUFP7G",
"scope": "user.info autopay.bsv autopay.eth",
"token_type": "Bearer"
}
}
- 注意:为避免安全问题,该操作必须在应用的服务器端完成,不能泄露
client_secret
HTTP Request
POST https://api.ddpurse.com/v1/oauth2/get_access_token
Request Body
Parameter | Required | Description |
---|---|---|
client_id | true | 应用客户端 ID |
client_secret | true | 应用客户端秘钥 |
grant_type | true | 固定值:refresh_token |
refresh_token | true | 第 4 步获取到的 refresh_token 值 |
Response Body
Parameter | Type | Description |
---|---|---|
access_token | string | access_token 用于访问 API 接口 |
expires_in | int | access_token 用于访问 的过期时间(秒) |
refresh_token | string | 当 access_token 用于访问 过期时,可以通过 refresh_token 重新获取 access_token 用于访问 |
scope | string | 用户授权的 scope 权限列表 |
token_type | string | token 类型,默认:Bearer |
使用 access_token
如何使用 access_token
进行 API 接口身份认证,请参考 身份认证
私钥签名
如果您可以证明自己拥有打点钱包账号的私钥,则可以代表该钱包执行操作。这样就无需像前两种身份验证方法一样申请和管理auth_token身份验证令牌。
对于想要从自己的帐户执行操作的开发人员来说,这通常更方便。 同时,这个签名验证功能让打点开放平台的API更开放,供具有一定编程能力的DotWallet用户使用。
此授权方式经常在Badge服务API使用。
使用范例
/* JavaScript */
//npm install bitcore-mnemonic
// (本例子是使用bitcore-mnemonic 8.24.1版本)
//npm install bsv
// (本例子是使用bsv 2.0.3版本)
const Mnemonic = require('bitcore-mnemonic');
const bsv = require('bsv')
// words=从你的打点钱包导出的助记词
const words = 'able chase soccer vocal kid car motor absurd test glass firm quick'
const code = new Mnemonic(words);
const xpri = code.toHDPrivateKey()
const xp = xpri.deriveChild("m/44'/0'/0'/0/0")
//生成私钥
const privateKey = bsv.PrivKey.fromBn(xp.privateKey.toBigNumber())
//生成公钥
const publicKey = bsv.PubKey.fromPrivKey(privateKey)
console.log("Base58私钥:", bsv.Base58.encode(privateKey.toBuffer()));
console.log("Hex压缩公钥:", publicKey.toHex());
//1、填充payload数据,替换成真正payload字段
const data = {
col1: "1",
col2: 2
};
//2、将payload转换成json字符串
const jsonStr = JSON.stringify(data);
//3、将json字符串数据进行sha256哈希
const hashStr = bsv.Hash.sha256(Buffer.from(jsonStr));
//4、使用私钥对hash字符串进行签名
const signature = bsv.Ecdsa.sign(hashStr, bsv.KeyPair.fromPrivKey(privateKey));
//封装打点API请求参数
const reqParams = {
payload: jsonStr,
signature: signature.toHex(),
pubkey: publicKey.toHex()
};
console.log("请求Body参数:", JSON.stringify(reqParams));
/* 代码执行结果 */
//Base58私钥: 3tro9DeCRC6R2uoFhMEpZ6GxuCwqgcRuF79YyiVAzov8XXN
//Hex压缩公钥: 02d126757e947016f9014cdab666fc47b8031bb3cdb47401d68182333ac2b489f5
//请求Body参数: {"payload":"{\"color\":\"black\",\"age\":15}","signature":"3044022023c1a7230e55215d9156f82a9e911ff1cd04a8ae0577539388bdada19fd2010a0220169e04cd1123b61f5c4825c2c73ead3251df13dd7a960b56429030090deab414","pubkey":"02d126757e947016f9014cdab666fc47b8031bb3cdb47401d68182333ac2b489f5"}
获取公私钥
使用此接口必须是使用打点钱包用户的公私钥。开发者可以先用打点钱包网页APP(目前pro不支持)注册账号,然后到账号&安全
> 备份钱包
导出助记词,再用助记词生成公私钥(详见代码例子)
公私钥算法说明
- 公私钥的生成,采用非对称加密,椭圆曲线算法
secp256k1
,即比特币中使用的公私钥算法 - pubkey 必须是压缩公钥
注意事项
请严格保管您的私钥,避免泄露,私钥泄露,直接关系到个人资产安全。
使用范例
开发者可通过范例代码从助记词生成私钥与公钥、再进行签名
- 签名:即生成签名方将传送的消息用私钥进行签名的过程。
- 验签:指验签方(通常为打点开放平台的服务端)使用公钥对消息进行验证的过程。
详见代码例子
API 文档
以下是 DotWallet 开放平台提供的 API 接口文档
汇率查询
免责声明:该汇率数据来自主流交易所,因汇率波动和准确度引发的任何纠纷,我司不承担任何责任,在您决定使用该服务之前,请自行做好调查和判断。
获取当前汇率
获取当前汇率
curl https://api.ddpurse.com/alchemist/authed_public/get_rate
上述的命令会返回的结果如下:
{
"code": 0,
"msg": "",
"data": {
"CNY": 100000000,
"USD": 637400000,
"JPY": 5636050,
"USDT": 622500000,
"BTC": 34982912625000,
"BSV": 91404787500,
"BCH": 345677362500,
"ETH": 2792911612500,
"EOS": 2448697125,
"timestamp": 1638500865
}
}
HTTP Request
https://api.ddpurse.com/alchemist/authed_public/get_rate
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Response Body
参数 | 类型 | 描述 |
---|---|---|
CNY | int | 参与汇率计算的数值,具体计算方式如下 |
USD | int | 参与汇率计算的数值,具体计算方式如下 |
JPY | int | 参与汇率计算的数值,具体计算方式如下 |
USDT | int | 参与汇率计算的数值,具体计算方式如下 |
BTC | int | 参与汇率计算的数值,具体计算方式如下 |
BSV | int | 参与汇率计算的数值,具体计算方式如下 |
BCH | int | 参与汇率计算的数值,具体计算方式如下 |
ETH | int | 参与汇率计算的数值,具体计算方式如下 |
EOS | int | 参与汇率计算的数值,具体计算方式如下 |
timestamp | int | unix 时间戳 |
如果你获得如下的一个结果:
json
{
"code": 0,
"msg": "",
"data": {
"CNY": 100000000,
"USD": 637400000,
"JPY": 5636050,
"USDT": 622500000,
"BTC": 34982912625000,
"BSV": 91404787500,
"BCH": 345677362500,
"ETH": 2792911612500,
"EOS": 2448697125,
"timestamp": 1638500865
}
}
这意味着一个bsv价值146.835(91404787500/622500000)usdt或者914.047875(91404787500/100000000)元
用户
获取用户信息
通过用户基础信息 API 接口,可以获取到 DotWallet 开放平台的用户授权给第三方应用的基础信息
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/user/get_user_info' \
-H "Authorization: Bearer <USER-ACCESS-TOKEN>"
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"id": "1278104675169476608",
"nickname": "hello world",
"avatar": "https://your_avatar"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/user/get_user_info
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer USER-ACCESS-TOKEN,授权方式: 用户授权 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
id | string | 用户 id |
nickname | string | 用户昵称 |
avatar | string | 用户头像 |
获取用户收款地址
通过用户收款地址 API 接口,可以获取到打点用户的收款地址
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/user/get_user_receive_address' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"coin_type":"BSV",
"user_id":"USER-ID"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"autopay_wallet": {
"wallet_index": 0,
"coin_type": "BSV",
"address": "mu66m5zsDKQRPioi3KE6YagcJwFVqJAbcr",
"paymail": "y1Qzj7@localhost:9871"
},
"primary_wallet": {
"wallet_index": 0,
"coin_type": "BSV",
"address": "mjSsxjLKvqhixNL6h9NkWbx7K3PwGoUPXZ",
"paymail": "7rE8vS@localhost:9871"
}
}
}
HTTP Request
POST https://api.ddpurse.com/v1/user/get_user_receive_address
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
user_id | string | 是 | 打点用户ID |
coin_type | string | 是 | 付款的币种,支持 BTC,BSV,ETH |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
+primary_wallet | object | 用户主钱包 |
└ address | string | 地址 |
└ paymail | string | paymail地址,仅BSV有paymail地址 |
└ coin_type | string | 币种 |
└ wallet_index | string | 钱包索引,0 表示WEB钱包,其他表示PRO钱包 |
+autopay_wallet | object | 用户自动支付钱包 |
└ address | string | 地址 |
└ paymail | string | paymail地址,仅BSV有paymail地址 |
└ coin_type | string | 币种 |
└ wallet_index | string | 钱包索引,固定值0 |
查询用户Badge余额
get_badge_balance
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/user/get_badge_balance' \
--header 'Authorization: Bearer <USER-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"badge_code": "<BADGE-CODE>"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"confirm": 0,
"unconfirm": 98998000,
"wallet_index": 0,
}
}
HTTP Request
POST https://api.ddpurse.com/v1/user/get_badge_balance
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer USER-ACCESS-TOKEN,授权方式: 用户授权 |
Request Payload
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
badge_code | string | 是 | badge id |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
confirm | int | 已确认数量 |
unconfirm | int | 未确认数量 |
wallet_index | int | 钱包索引,0 表示WEB钱包,其他表示PRO钱包 |
查询用户Web钱包地址
get_user_web_address
HTTP Request
POST https://api.ddpurse.com/v1/user/get_user_web_address
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN |
Request Payload
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
user_id | string | 是 | 用户ID |
coin_type | string | 是 | 币种,BSV;BTC;ETH |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
address | string | 钱包地址 |
获取用户地址详情
get_user_address_detail
HTTP Request
POST https://api.ddpurse.com/v1/user/get_user_address_detail
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN |
Request Payload
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
address | string | 是 | 钱包地址 |
coin_type | string | 是 | 币种,BSV;BTC;ETH |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
wallet_index | int | 钱包索引,0 表示WEB钱包,其他表示PRO钱包 |
wallet_type | string | 钱包类型,coin_regular、token_regular:普通钱包 coin_autopay、token_autopay:自动支付钱包 |
订单支付
用打点开放平台API支付功能,第三方应能简单快速地集成强大支付功能。
支付时候,要引导DotWallet用户登录到打点钱包应用(web app)完成交易支付。
单笔订单支付需要用户每次交易手动确认放款。用自动支付,用户只要授权一次然后应用能自行发起交易。
单笔订单支付
订单支付流程:
1:开发者创建交易订单,提交给打点,获取订单号
order_id
2:引导用户跳转至构造好的 URL 进行支付
3:用户完成支付,通知支付结果,完成交易
Step1: 创建交易订单
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/transact/order/create' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"out_order_id":"0001",
"coin_type":"BSV",
"to":[{
"type":"address",
"content":"mnjV6Fy9ge35xWsqu9rSS4bTG2wxsuoKy7",
"amount":10000000
},
{
"type":"script",
"content":"006a",
"amount":0
}
],
"product":{
"id":"001",
"name":"apple",
"detail":"This is a red apple."
},
"subject":"Red Apple",
"notify_url":"https://test.com",
"redirect_uri":"https://test.com",
"expires":2601452710
}'
HTTP Request
POST https://api.ddpurse.com/v1/transact/order/create
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
out_order_id | string | 是 | 商家订单号,随机字符串,建议使用 UUID |
coin_type | string | 是 | 付款的币种,支持 BTC,BSV,ETH。因USDT使用基于BSV链badge协议的Token记账方案,故USDT付款需要选择BSV币种。 |
+to | object[] | 是 | 收款方列表 |
└ type | string | 是 | 接收方类型,见下表。 |
└ content | string | 是 | 接收方内容,见下表。 |
└ amount | int | 是 | 金额。BSV\BTC的最小单位为:聪(satoshi),BSV\BTC的最小金额为546聪,1BSV(或BTC)代表1亿聪;script和ETH没有最小金额;USDT最小单位就是USDT,或最小金额为 0.000001USDT |
+product | object | 是 | 商品信息 |
└ id | string | 是 | 商品的编号 |
└ name | string | 是 | 商品名称 |
└ detail | string | 否 | 商品描述 |
badge_code | string | 否 | badge标识码,填写则代表本次交易为badge交易。因USDT使用基于BSV链badge协议的Token记账方案,故USDT支付需要填写对应USDT发行的badge标识码 |
subject | string | 否 | 订单标题,会在打点钱包的交易详情中“交易说明”字段展示该内容 |
notify_url | string | 否 | 支付结果通知地址,notify_url 与redirect_uri 必填一项 |
redirect_uri | string | 否 | 支付完成后跳转地址,notify_url 与redirect_uri 必填一项 |
expires | int | 否 | 订单过期时间,值为 unix 时间,单位秒,不填或者为0 不过期 |
接收方类型
type | content |
---|---|
address | 填写用户收款地址 |
script | 填写 hex 脚本 |
paymail | 填写用户paymail收款地址 |
user_primary_web | 填写收款用户ID,注意:最终款项将打到用户web钱包 |
- 注意:
- 1、BTC与ETH交易,仅支持地址转账,接收方类型为固定值为
address
- 2、ETH转账至打点用户地址支持多个收款方;转账至非打点用户地址,只支持一个接收方,即一转一
- 3、USDT交易,仅支持地址转账。因USDT使用基于BSV链badge协议的Token记账方案,所以USDT收款可直接填写用户的BSV收款地址进行收款。(注:USDT一期仅支持Web钱包,故请填写Web钱包的收款地址)
- 4、badge交易,币种为固定值
BSV
- 5、badge交易,接收方类型为
address
或者user_primary_web
- 6、paymail转账最多支持一个paymail接收方与一个script接收方,其中script接收方
amount
固定为0,且content
以006a开头 - 7、script接收方,如果
amount
为0,content
以006a开头
Response Body
{
"code": 0,
"msg": "",
"data": "1318817847320780800"
}
参数名 | 类型 | 说明 |
---|---|---|
data | string | 订单号 (order_id ) |
Step2:构建支付 URL,并引导用户跳转至构造好的 URL 进行支付
比如你可以通过一个简单的
<a>
标签,引导用户跳转到 DotWallet 进行支付操作
<a href="https://api.ddpurse.com/v1/transact/order/apply_payment?order_id=<YOUR-ORDER-ID>">打点支付</a>
https://api.ddpurse.com/v1/transact/order/apply_payment?order_id={YOUR-ORDER-ID}
用户点击构造好的链接后,将跳转到 DotWallet 应用的支付页面,用户可以选择使用 web/app 等方式进行支付,并且要求用户登录,随后进行支付操作
Step3:用户支付,完成交易
用户完成支付,并通知支付结果,支付结果以 JSON 格式 POST 发送至notify_url
Notify Request Body
为了方便核实订单通知,支付结果会附加我们的官方公钥的签名的结果。
通知数据范例
{
"signature": "3045022100ae6ab3f9d45e24cc03b5db5e82cfc16df893e6e49914755673b365c8342342ad022015ba247646cd16e75986d802405ad869bb3dec56233562cc483f3fa05dc4e187",
"pubkey": "03bf122b0f479faffecd165cae37b0441b9e3ca6f85edc43a870973c61f1375d33",
"payload": "{\"order_id\":\"1354638810134093824\",\"out_order_id\":\"1077\",\"user_id\":\"b940725f2fb97534122613a9683015c6\",\"amount\":1111,\"fee\":272,\"txid\":\"7a26ac299829509cd4503682eef7d68ffd7022d39c1b814e072ce980a5be8c38\",\"badge_code\":\"e412fe75527b9251ede97d84b17037cd2524698bd68b9561df3d4ab221515c6d\"}"
}
验证签名范例
//JavaScriot Demo
//npm install bsv
//bsv库版本号:2.0.4
const bsv = require('bsv')
let payload = `{"order_id":"1354638810134093824","out_order_id":"1077","user_id":"b940725f2fb97534122613a9683015c6","amount":1111,"fee":272,"txid":"7a26ac299829509cd4503682eef7d68ffd7022d39c1b814e072ce980a5be8c38","badge_code":"e412fe75527b9251ede97d84b17037cd2524698bd68b9561df3d4ab221515c6d"}`
let signatureHex = `3045022100ae6ab3f9d45e24cc03b5db5e82cfc16df893e6e49914755673b365c8342342ad022015ba247646cd16e75986d802405ad869bb3dec56233562cc483f3fa05dc4e187`
let pubkeyHex = `03bf122b0f479faffecd165cae37b0441b9e3ca6f85edc43a870973c61f1375d33`
let hash = bsv.Hash.sha256(Buffer.from(payload,'utf8'))
let pubkey = bsv.PubKey.fromBuffer(Buffer.from(pubkeyHex,'hex'))
let sig = bsv.Sig.fromBuffer(Buffer.from(signatureHex,"hex"))
let verify = bsv.Ecdsa.verify(hash,sig,pubkey)
//true:成功 false:失败
console.log(verify);
//Java Demo
//gradle dependencies: compile group: 'org.bitcoinj', name: 'bitcoinj-core', version: '0.14.7'
import com.subgraph.orchid.encoders.Hex;
import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.Sha256Hash;
public class Demo {
public static void main(String[] args) {
String payload = "{\"order_id\":\"1354638810134093824\",\"out_order_id\":\"1077\",\"user_id\":\"b940725f2fb97534122613a9683015c6\",\"amount\":1111,\"fee\":272,\"txid\":\"7a26ac299829509cd4503682eef7d68ffd7022d39c1b814e072ce980a5be8c38\",\"badge_code\":\"e412fe75527b9251ede97d84b17037cd2524698bd68b9561df3d4ab221515c6d\"}";
String signatureHex = "3045022100ae6ab3f9d45e24cc03b5db5e82cfc16df893e6e49914755673b365c8342342ad022015ba247646cd16e75986d802405ad869bb3dec56233562cc483f3fa05dc4e187";
String pubkeyHex = "03bf122b0f479faffecd165cae37b0441b9e3ca6f85edc43a870973c61f1375d33";
ECKey.ECDSASignature sig = ECKey.ECDSASignature.decodeFromDER(Hex.decode(signatureHex));
ECKey pubkey = ECKey.fromPublicOnly(Hex.decode(pubkeyHex));
Sha256Hash payloadHash = Sha256Hash.of(payload.getBytes());
boolean result = pubkey.verify(payloadHash,sig);
System.out.println(result);
}
}
参数名 | 类型 | 说明 |
---|---|---|
payload | json string | 通知参数的集合,值为json string,详见Payload |
signature | string | 通知参数签名串,验证签名范例请看代码例子 |
pubkey | string | 开放平台官方公钥,请认准03bf122b0f479faffecd165cae37b0441b9e3ca6f85edc43a870973c61f1375d33 |
Payload
参数名 | 类型 | 说明 |
---|---|---|
order_id | string | 订单号 |
out_order_id | string | 商户订单号 |
user_id | string | 付款用户 ID |
amount | int | 交易金额,单位:聪 satoshi(bsv)或者 gwei (eth) |
fee | int | 交易矿工费,单位:聪 satoshi(bsv)或者 gwei (eth) |
txid | string | 交易的 txid |
开发者接收到打点通知的支付结果后,需要返回以下数据来确认收到通知
Notify Response Body
参数名 | 类型 | 说明 |
---|---|---|
code | int | 状态码,0 表示成功 |
msg | string | 描述 |
通知返回示例,例:
{
"code": 0,
"msg": "",
}
自动支付
自动支付,是 DotWallet 用户授权应用能够以 DotWallet 用户的身份,进行自动支付的权限。应用无需每次的支付获取用户授权,只需用户进行一次授权之后可以在余额内自由发起交易。
使用场景: 适合频率高的支付行为,避免让用户一直要跳转到支付确认页面。在抽奖、代付、游戏、微博等场景进行消费时,通常需要向用户获取自动支付的权限;如允许第三方应用代缴水电费、代还信用卡等。
自动支付流程
- Step 1:引导 DotWallet 用户到自动支付授权界面,以获取用户授权,同时申请
scope
为 autopay 相关权限
Step 2:通过用户授权获取到
access_token
,调用获取用户信息接口,以获取用户 ID,应用方可保存授权的用户 ID,以便后续使用Step 3:调用自动支付接口,发起支付
自动支付接口
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/transact/order/autopay' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"out_order_id":"0001",
"coin_type":"BSV",
"user_id":"6a1b2161094e32bf2c35298048da",
"to":[{
"type":"address",
"content":"mnjV6Fy9ge35xWsqu9rSS4bTG2wxsuoKy7",
"amount":10000
},
{
"type":"script",
"content":"006a",
"amount":0
}],
"product":{
"id":"001",
"name":"apple",
"detail":"This is a red apple."
},
"subject":"Red Apple",
"notify_url":"https://www.ddpurse.com/"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"order_id": "1318822791176265728",
"out_order_id": "0001",
"user_id": "6a1b2161094e32bf2c3218048da",
"amount": 10000,
"fee": 233,
"txid": "6d99b1f014ac1e22ed5977b5191883c098e820476283bbad438ffcf95c5663f9"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/transact/order/autopay
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
out_order_id | string | 是 | 商家订单号,随机字符串,建议使用 UUID,订单号不可重复 |
coin_type | string | 是 | 付款的币种,支持 BTC,BSV,ETH。因USDT使用基于BSV链badge协议的Token记账方案,故USDT付款需要选择BSV币种。 |
badge_code | string | 否 | badge标识码,填写则代表本次交易为badge交易。因USDT使用基于BSV链badge协议的Token记账方案,故USDT支付需要填写对应USDT发行的badge标识码 |
user_id | string | 是 | 用户 ID |
+to | object[] | 是 | 接收方列表 |
└ type | string | 是 | 接收方类型,见下表。 |
└ content | string | 是 | 接收方内容,见下表。 |
└ amount | int | 是 | 金额。BSV\BTC的最小单位为:聪(satoshi)。BSV\BTC的最小金额为546聪,1BSV(或BTC)代表1亿聪;script和ETH没有最小金额;USDT最小单位就是USDT,或最小金额为 0.000001USDT |
+product | object | 是 | 商品信息 |
└ id | string | 是 | 商品的编号 |
└ name | string | 是 | 商品名称 |
└ detail | string | 否 | 商品描述 |
subject | string | 否 | 订单标题,会在打点钱包的交易详情中“交易说明”字段展示该内容 |
notify_url | string | 否 | 支付结果通知地址 |
接收方类型
type | content |
---|---|
address | 填写用户收款地址 |
script | 填写 hex 脚本 |
paymail | 填写用户paymail收款地址 |
user_primary_web | 填写收款用户ID,注意:最终款项将打到用户web钱包 |
- 注意:
- 1、BTC 与 ETH 仅支持地址转账,即
to[*].type
为address
- 2、ETH转账至打点用户地址支持多个收款方;转账至非打点用户地址,只支持一个收款方,即一转一
- 3、USDT交易,仅支持地址转账。因USDT使用基于BSV链badge协议的Token记账方案,所以USDT收款可直接填写用户的BSV收款地址进行收款。(注:USDT一期仅支持Web钱包,故请填写Web钱包的收款地址)
- 4、paymail交易最多支持一个paymail接收方与一个script接收方,其中script接收方
amount
固定为0,且content
以006a开头 - 5、
script
接收方类型,只有BSV交易支持,且如果amount
为0,content
必须以006a开头 - 6、badge交易,币种为固定值
BSV
- 7、badge交易,接收方类型为
address
或者user_primary_web
Response Body
参数名 | 类型 | 说明 |
---|---|---|
order_id | string | 订单号 |
out_order_id | string | 商户订单号 |
user_id | string | 付款用户 ID |
amount | int | 交易金额,单位:聪 satoshi(bsv)或者 gwei (eth) |
fee | int | 交易矿工费,单位:聪 satoshi |
txid | string | 交易的 txid |
用户完成支付,打点平台将支付结果以 JSON 格式 POST 发送至notify_url
Notify Request Body
为了方便核实订单通知,支付结果会附加我们的官方公钥的签名的结果。
通知数据范例
{
"signature": "3045022100ae6ab3f9d45e24cc03b5db5e82cfc16df893e6e49914755673b365c8342342ad022015ba247646cd16e75986d802405ad869bb3dec56233562cc483f3fa05dc4e187",
"pubkey": "03bf122b0f479faffecd165cae37b0441b9e3ca6f85edc43a870973c61f1375d33",
"payload": "{\"order_id\":\"1354638810134093824\",\"out_order_id\":\"1077\",\"user_id\":\"b940725f2fb97534122613a9683015c6\",\"amount\":1111,\"fee\":272,\"txid\":\"7a26ac299829509cd4503682eef7d68ffd7022d39c1b814e072ce980a5be8c38\",\"badge_code\":\"e412fe75527b9251ede97d84b17037cd2524698bd68b9561df3d4ab221515c6d\"}"
}
验证签名范例
//npm install bsv
//bsv库版本号:2.0.4
const bsv = require('bsv')
let payload = `{"order_id":"1354638810134093824","out_order_id":"1077","user_id":"b940725f2fb97534122613a9683015c6","amount":1111,"fee":272,"txid":"7a26ac299829509cd4503682eef7d68ffd7022d39c1b814e072ce980a5be8c38","badge_code":"e412fe75527b9251ede97d84b17037cd2524698bd68b9561df3d4ab221515c6d"}`
let signatureHex = `3045022100ae6ab3f9d45e24cc03b5db5e82cfc16df893e6e49914755673b365c8342342ad022015ba247646cd16e75986d802405ad869bb3dec56233562cc483f3fa05dc4e187`
let pubkeyHex = `03bf122b0f479faffecd165cae37b0441b9e3ca6f85edc43a870973c61f1375d33`
let hash = bsv.Hash.sha256(Buffer.from(payload,'utf8'))
let pubkey = bsv.PubKey.fromBuffer(Buffer.from(pubkeyHex,'hex'))
let sig = bsv.Sig.fromBuffer(Buffer.from(signatureHex,"hex"))
let verify = bsv.Ecdsa.verify(hash,sig,pubkey)
//true:成功 false:失败
console.log(verify);
参数名 | 类型 | 说明 |
---|---|---|
payload | json string | 通知参数的集合,值为json string,详见Payload |
signature | string | 通知参数签名串,验证签名范例请看代码例子 |
pubkey | string | 开放平台官方公钥,请认准03bf122b0f479faffecd165cae37b0441b9e3ca6f85edc43a870973c61f1375d33 |
Payload
参数名 | 类型 | 说明 |
---|---|---|
order_id | string | 订单号 |
out_order_id | string | 商户订单号 |
user_id | string | 付款用户 ID |
amount | int | 交易金额,单位:聪 satoshi(bsv)或者 gwei (eth) |
fee | int | 交易矿工费,单位:聪 satoshi(bsv)或者 gwei (eth) |
txid | string | 交易的 txid |
开发者接收到打点通知的支付结果后,需要返回以下数据来确认收到通知。
Notify Response Body
参数名 | 类型 | 说明 |
---|---|---|
code | int | 状态码,0 表示成功 |
通知返回示例,例:
{
"code": 0,
}
自动支付相关错误
上一步的支付请求将返回错误码code
,以下为错误码描述与解决方案
10180007
表示用户的自动支付余额不足
开发者可以引导用户跳转到打点自动支付划转页面进行充值,自动支付划转URL:
https://api.ddpurse.com/v1/user/autopay_transfer?redirect_url=<redirect_url>
参数 | 是否必须 | 说明 |
---|---|---|
redirect_url | 否 | 划转后的跳转地址。 必须是url_encoded |
10180029
表示订单支付金额大于用户的授权金额
开发者可以引导用户跳转到打点自动支付单笔限额设置页面进行限额设置,设置单笔限额URL:
https://api.ddpurse.com/v1/user/autopay_config?client_id=<client_id>&redirect_url=<redirect_url>
参数 | 是否必须 | 说明 |
---|---|---|
client_id | 是 | 开发者应用 ID |
redirect_url | 否 | 设置完成后的跳转地址。 必须是url_encoded |
获取用户自动支付余额
通过该 API 接口,可以获取到用户自动钱包余额
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/user/get_autopay_balance' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"coin_type":"BSV",
"user_id": "6a1b2161094e32bf2c352910218048da"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"confirm": 85613,
"unconfirm": 0
}
}
HTTP Request
POST https://api.ddpurse.com/v1/user/get_autopay_balance
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
coin_type | string | 是 | 需要查询的币种,支持 BTC,BSV,ETH |
user_id | string | 是 | 需要查询的用户 ID |
badge_code | string | 否 | badge标识码,填写则代表本次为查询badge余额 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
confirm | int | 已确认金额 |
unconfirm | int | 未确认金额 |
订单查询
查询单笔订单
支持订单支付和自动支付的订单查询
# 每次请求,提交正确的header(shell例子):
curl --location --request GET 'https://api.ddpurse.com/v1/transact/order/get_order' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"order_id":"1306515412057333760"
}'
请求回返是JSON,例:
{
"code": 0,
"msg": "",
"data": {
"order_id": "1306515412057333760",
"out_order_id": "0001",
"payer_user_id": "6a1b2161094e32bf2c352910218048da",
"coin_type": "BSV",
"txid": "9bbe61bede9868a194a3568b88f4d504cb9de7aca407adf7d1ad9bf867373914",
"fee": 233,
"amount": 10000,
"subject": "Red Apple",
"product_id": "001",
"product_name": "apple",
"product_detail": "This is a red apple.",
"status": 2,
"created_at": 1602829881,
"confirmation": -1,
"transaction": {
"blockhash": "",
"blockheight": -1,
"confirmation": -1,
"fee": 116,
"time": 1605254849,
"vins": [
{
"address": "mqcsXSYXd1fimNKWZS7tyPFyunA1ewzVhV",
"amount": 9881906,
"index": 0
}
],
"vouts": [
{
"address": "mjLxBnPyFPP1qTDzu7Lhv597gJGR5kpPvd",
"amount": 200000,
"index": 0
},
{
"address": "n2V8gRt1ytG8QGaA9VqH7JnSLvNcU2pGW6",
"amount": 9681790,
"index": 1
}
]
}
}
}
HTTP Request
POST https://api.ddpurse.com/v1/transact/order/get_order
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
order_id | string | 是 | 订单号 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
order_id | string | 订单号 |
out_order_id | string | 商户订单号 |
payer_user_id | string | 付款用户 ID |
coin_type | string | 支付的币种 |
amount | int | 交易金额,单位:聪 satoshi(bsv)或者 gwei (eth) |
fee | int | 交易矿工费,单位:聪 satoshi(bsv)或者 gwei (eth) |
txid | string | 交易的 txid |
subject | string | 订单标题 |
product_id | string | 商品的编号 |
product_name | string | 商品名称 |
product_detail | string | 商品描述 |
confirmation | int | 交易确认数,-1 表示还未上链 |
status | int | 订单状态,1 表示订单未支付,2 表示订单已支付 |
created_at | int | 订单创建时间,值为 unix 时间,单位秒 |
+transaction | object | 交易详情,仅在订单已支付状态下有值 |
└ blockhash | string | 交易所在区块hash |
└ blockheight | int | 交易所在区块高度,-1 表示交易还未上块 |
└ time | int | 交易被打包上区块时间,unix时间,单位秒 |
└ confirmation | int | 交易确认数,-1 表示交易还未上块 |
└ fee | int | 交易手续费 |
└ txid | string | 交易ID |
└ +vins | object[] | 交易输入 |
└ └ address | string | 地址 |
└ └ amount | string | 金额 |
└ └ index | string | 位置下标 |
└ +vouts | object[] | 交易输出 |
└ └ address | string | 地址 |
└ └ amount | string | 金额 |
└ └ index | string | 位置下标 |
查询订单列表
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/transact/order/get_orders' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data-raw '{
"page":1,
"page_size":5,
"begin_at":1603851855,
"end_at":2603851857,
"order_type":2,
"order_status":2
}'
请求回返是JSON,例:
{
"code": 0,
"msg": "",
"data": {
"total": 48,
"page": 1,
"list": [
{
"order_id": "1335845637819736064",
"out_order_id": "111223233",
"txid": "47f84fedbc56033c11642dc78476d317010cdfaf4f6241d130bc284f64eaa50a",
"type": 2,
"amount": 600,
"badge_code": "",
"payer_user_id": "6a1b2161094e32bf2c352910218048da",
"coin_type": "BSV",
"to": [
{
"type": "address",
"content": "17eiwViFhQ6vKoUjvS7UoP4BAoLPn2oW6x",
"amount": 600
}
],
"status": 2,
"created_at": 1607325393,
"create_time": "2020-12-07 15:16:33"
}
]
},
"req_id": "1555487231730565120"
}
HTTP Request
POST https://api.ddpurse.com/v1/transact/order/get_orders
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
page | int | 是 | 第几页 |
page_size | int | 是 | 每页多少条数据,最大500 |
begin_at | int | 否 | 订单开始时间,unix时间 |
end_at | int | 否 | 订单结束时间,unix时间 |
order_type | int | 否 | 订单类型,1 表示自动支付 2 表示订单支付 |
order_status | int | 否 | 订单状态,1 表示订单未支付,2 表示订单已支付 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
total | int | 订单数量 |
page | int | 当前页码 |
+list | object[] | 订单列表 |
└ order_id | string | 订单号 |
└ out_order_id | string | 商户订单号 |
└ payer_user_id | string | 付款用户 ID |
└ coin_type | string | 支付的币种 |
└ amount | int | 交易金额,单位:聪 satoshi(bsv)或者 gwei (eth) |
└ txid | string | 交易的 txid |
└ type | int | 订单类型,1 表示自动支付 2 表示订单支付 |
└ badge_code | string | badge标识码,填写则代表本次交易为badge交易 |
└ +to | object[] | 收款方列表 |
└ └ type | string | 接收方类型,见下表。 |
└ └ content | string | 接收方内容,见下表。 |
└ └ amount | int | 金额,单位:聪satoshi(bsv)或者gwei (eth)。最小金额546(BSV, BTC),script 和ETH没有最小金额 |
└ status | int | 订单状态,1 表示订单未支付,2 表示订单已支付 |
└ created_at | int | 订单创建时间,值为 unix 时间,单位秒 |
└ created_time | string | 订单创建时间,值为格式化时间 |
数据和脚本上链
数据或者脚本可以使用我们平台的订单支付接口或者自动支付接口提交交易。这两个接口的详细介绍请点击链接了解。
https://api.ddpurse.com/v1/transact/order/autopay
或
https://api.ddpurse.com/v1/transact/order/create
在request的to
数组里的一个object里,script
参数提交 type
, 然后在content
参数里提交你的数据或者脚本.
- 注: 只有BSV交易支持数据上链和脚本
使用场景
这可用于验证或存储各种记录和数据。将数据保存在链上可用于提高数据寿命。它可以与时间戳一起使用,以证明某个数据事务在某个时间发生。对于大型数据集,有时最好将数据的哈希值保存在链上,之后可以将哈希与数据进行比较,以验证数据是否已被修改。
数据/脚本格式
确保您的数据/脚本是十六进制编码的字符串。在数据前加上006a
# Saving data with automatic payment:
curl --location --request POST 'https://api.ddpurse.com/v1/transact/order/autopay' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"out_order_id":"0001",
"coin_type":"BSV",
"user_id":"6a1b2161094e32bf2c35298048da",
"to":[{
"type":"script",
"content":"006a<YOUR HEX ENCODED DATA HERE>",
"amount":0
}],
"product":{
"id":"001",
"name":"data",
"detail":"This is some important data."
},
"notify_url":"https://www.example.com/"
}'
// 使用自动支付存储数据:
async function saveDataWithAutopayment(DATA, YOUR_APP_ACCESS_TOKEN, USER_ID) {
const hexEncoded = Buffer.from(JSON.stringify(DATA), 'utf8').toString('hex');
const orderData = {
user_id: USER_ID,
out_order_id: uuidv4(),
coin_type: 'BSV',
to: [
{
type: 'script',
content: `006a${hexEncoded}`,
amount: 0,
},
],
product: {
id: uuidv4(),
},
notify_url:'https://www.example.com/'
};
const options = {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${YOUR_APP_ACCESS_TOKEN}`,
},
method: 'POST',
data: orderData,
};
const response = await axios(`https://api.ddpurse.com/v1/transact/order/autopay`, options);
const txid = response.data.data.txid;
return txid;
}
您将收到交易信息。它将也发送到您的notify_url。请存储交易ID(txid),以便以后检索数据。
检索数据
您可以使用我们的[交易查询API](#tx_query)查找包含您的数据的交易。检查链接以获取用法详细信息。
https://api.ddpurse.com/v1/bsvchain/get_transaction
在响应中,您的数据将位于vouts
数组中。通常,与您的数据进行的事务将是数组中的第一位(索引0)。为了确认是正确vout,您可以查看数组中的每个对象检查script_hex
属性。以006a
开头的将是您的数据。
记住要删除006a
并从hex进制解码数据。
async function getData(YOUR_APP_ACCESS_TOKEN, TXID) {
const options = {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${YOUR_APP_ACCESS_TOKEN}`,
},
method: 'POST',
data: JSON.stringify({ transaction_hash: TXID }),
};
const response = await axios('https://api.ddpurse.com/v1/bsvchain/get_transaction', options);
const responseData = response.data;
let data;
responseData.data.vouts.forEach((vout) => {
if (vout.script_hex.startsWith('006a')) {
const hexDecoded = Buffer.from(
vout.script_hex.slice(4), // 去掉 '006a'
'hex'
).toString('utf8');
data = JSON.parse(hexDecoded);
}
});
return data;
}
Badge
由打点团队与sCrypt团队合作推出,一项全新的面向开发者的Token服务。
Badge基于BSV的sCrypt协议,第一阶段优先开放部分接口。
创建/发行Token
支持该协议的任意第三方程序,都可以提供查询功能(查询功能包括流水,余额等)。所有记录均公开可审计,与区块链上的UTXO转移过程相呼应。
查询Token
支持开发者自行创建各类Token,所有具体描述信息均写入区块中,并且开发者可以自行添加规则(例如token的有效期,是否公开可审计等)。
转移Token
可去中心化转移Token,不依赖特定的服务器,从而避免单点故障。同时,Token数额被记录在UTXO而非op_return中,可以自动同步区块链上的各类双花,重组等事件及其影响(UTXO中脚本跟传统的P2PKH不一样,不会导致无意中UTXO被花掉)。
销毁Token
将已创建的Token转回给发行方即实现了回收销毁,整个过程简单方便且高效。
badge的创建
# With shell, you can just pass the correct header with each request
curl --location --request POST 'https://api.ddpurse.com/v1/badge/create' \
--header 'Content-Type: application/json' \
--data-raw '{
"payload": "{\"amount\":8888,\"wallet_index\":0,\"wallet_type\":\"coin_regular\"}",
"signature": "3045022100a9f5270f368933bdc2812b83f8e4809331157c79a64e809bbf66b7a01577626402207dba9a876e83a74f023473e4f25e28e55e933571557a9dfc500a2e831811d351",
"pubkey": "0332c837d3ca3dfab8f4170a56f7f18384417e03b8a395af0c6fb2b1352cc867cc"
}'
The above command returns JSON structured like this:
{
"code": 0,
"msg": "",
"data": {
"badge_code": "c52bf511d0186a18dcd45cf7becfc12dc0f17595b353e6c26e692729cdb455ca",
"tx_info": {
"fee": 223,
"rawtx": "0200000002ab60958aeb976a3bd0c96ff0d24a2fcaaee0104f68cf18c45abc9d9ba19f0875000000006a4730440220295af79f7c150b1ed7c617e4fba0c0e231fef79b5d5140a3fbf6e55903c40ab502201b0152fb8c0f6bf6973f5af70eea9b64c74f4ed177480c731bb410a43930572b4121037347726fc59f7ede2db0913903db0a42458f77011e67217812580990b9f175f4ffffffff18ea9174304057b8164bbd229849c15fbe8c1b047b68fc499a82019be0cfea8c000000006b483045022100c2e13ba1dc3e82ad55986dbfd47e05f72ad4ed054e0b586575b5ca0c5d7ac3e50220548d37a9f5e1620073f43031d668cf7cf4dffec67dc31e269d351f51c69888144121037347726fc59f7ede2db0913903db0a42458f77011e67217812580990b9f175f4ffffffff027803000000000000535101400100015101b101b261146261bdd1a5f0200383d92c9e255e236ce9e5409e005179517a7561587905626164676587695979a9517987695a795a79ac77777777777777777777776a08b822000000000000a1260000000000001976a914d9472b1bc1115851a0efe99556d76fb4d7bc5f9a88ac00000000",
"txid": "c52bf511d0186a18dcd45cf7becfc12dc0f17595b353e6c26e692729cdb455ca"
}
}
}
HTTP Request
POST https://api.ddpurse.com/v1/badge/create
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
payload | string | 是 | 请求参数的集合,值为json string,详见以下的Request Payload |
signature | string | 是 | 请求参数签名串,详见签名 |
pubkey | string | 是 | 用户验证签名的公钥 |
Request Payload
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
wallet_type | string | 是 | 钱包类型,固定值coin_regular |
wallet_index | int | 是 | 钱包索引,默认为0 |
amount | int | 是 | 创建badge的数量 |
message | string | 否 | opreturn附带信息 |
+badge_info | object | 是 | badge信息,该信息将会存储至区块链上 |
└ issuer_name | string | 否 | 发行者名称 |
└ issuer_avatar | string | 否 | 发行者头像 |
└ contact_details | string | 否 | 联系方式 |
└ badge_name | string | 否 | badge名称 |
└ badge_name_abbreviation | string | 否 | badge名称缩写 |
└ badge_logo | string | 否 | badge logo头像 |
└ badge_color | string | 否 | badge颜色 |
└ badge_cover | string | 否 | badge封面 |
└ badge_back | string | 否 | badge背景色 |
└ title | string | 否 | badge详情标题 |
└ subtitle | string | 否 | badge详情副标题 |
└ description | string | 否 | badge描述 |
└ details | string | 否 | badge详情描述 |
└ smallest_unit | string | 是 | badge最小单位名称,比如BSV为satoshi |
└ default_unit | string | 是 | badge默认单位名称 |
└ unit_ratio | int | 是 | badge默认单位与最小单位比值,比如BSV为100000000 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
+tx_info | object | 交易创建结果 |
└ txid | string | 交易的txid |
└ fee | int | 交易手续费 |
└ rawtx | string | 这笔交易的raw transaction |
badge_code | string | 生成的badge的id,用于后续的查询以及发送等操作 |
转移badge至用户
# With shell, you can just pass the correct header with each request
curl --location --request POST 'https://api.ddpurse.com/v1/badge/transfer_to_user' \
--header 'Content-Type: application/json' \
--data-raw '{
"payload":"{\"badge_code\":\"ed61c3b45253570e001d50283c37c1820549f3af58adb915a9f19b4811f17f3b\",\"payees\":[{\"amount\":998,\"user_id\":\"1321773458270461952\",\"wallet_index\":0,\"wallet_type\":\"coin_regular\"}],\"wallet_index\":0,\"wallet_type\":\"coin_regular\"}",
"signature":"304402200d10bb78e13d7e649ceb16b4c7acffb47b70506904ce3a75092dc98ed0eb7d260220582df2d21f0cd6778504aaa84d62fd2eefcfc524e1f79f5eab2dda52da268ce6",
"pubkey":"0332c837d3ca3dfab8f4170a56f7f18384417e03b8a395af0c6fb2b1352cc867cc"
}'
The above command returns JSON structured like this:
{
"code": 0,
"msg": "",
"data": {
"fee": 272,
"rawtx": "0200000002ebb93c38b383cd8681252567217620a25793ce8583c710f1ba15d4094c9718390100000070473044022052c3efdd42bf410d8d1b01aaee83377fd09a63edc8eccafdf5ab2a283fc7dafe022077eca91b9a790079530f7724e3fd104823bc04b0968e5ceee8f85aa1e4b3a2d541210362b83ac39f1f26734abaa034ad8b6bf7fbb52d0c3caf3585ed3a266195531c93056261646765ffffffff3773e900c09fe2e349f8aa107135dd749f9eb7f103630b4a23da265830556290020000006a473044022100a9ebaa52a264ff93fe920f03674a690a4e549778e990b94e21ee1962faf14efc021f50a07016e4af8c0145182fc257fb8393954863ed59da7b86ab95649e034269412102f9f7501ec42d33d90827cb6a82c3efa96c2c6c763f1400fe58d321b72806202fffffffff037803000000000000535101400100015101b101b261145e4c212664441bd01a7253975559e9f28121d5af005179517a7561587905626164676587695979a9517987695a795a79ac77777777777777777777776a08e6030000000000007803000000000000535101400100015101b101b26114ec8240727e2502ad10b303d1817e72762f3911df005179517a7561587905626164676587695979a9517987695a795a79ac77777777777777777777776a08d27e010000000000b4ed1f08000000001976a914ec8240727e2502ad10b303d1817e72762f3911df88ac00000000",
"txid": "5d811a5af91e4e35e5285a135a050005abc5e5fc03d69b5c9efc2105a20dce26"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/badge/transfer_to_user
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
payload | string | 否 | 请求参数的集合,值为json string,详见以下的Request Payload |
signature | string | 否 | 请求参数签名串,详见签名 |
pubkey | string | 否 | 用户验证签名的公钥 |
Request Payload
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
wallet_type | string | 是 | 钱包类型,固定值coin_regular |
wallet_index | int | 是 | 钱包索引,默认为0 |
badge_code | string | 是 | badge id |
message | string | 否 | opreturn附带信息 |
+payees | object[] | 是 | 接收人数组 |
└ wallet_type | string | 是 | 钱包类型,固定值coin_regular |
└ wallet_index | int | 是 | 钱包索引,默认为0 |
└ amount | int | 是 | 转移badge的数量 |
└ user_id | string | 是 | 接收用户ID |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
txid | string | 交易的txid |
fee | int | 手续费 |
rawtx | string | 这笔交易的raw transaction |
转移badge至地址
- 注意:只能转给打点钱包用户地址
# With shell, you can just pass the correct header with each request
curl --location --request POST 'https://api.ddpurse.com/v1/badge/transfer' \
--header 'Content-Type: application/json' \
--data-raw '{
"payload":"{\"badge_code\":\"ed61c3b45253570e001d50283c37c1820549f3af58adb915a9f19b4811f17f3b\",\"to\":[{\"amount\":1555,\"content\":\"mq5VHs1bVKy3XYwGnP3r4ysCvpGUFwLA9e\",\"type\":\"address\"}],\"wallet_index\":0,\"wallet_type\":\"coin_regular\"}",
"signature":"304402204a1009b7173b4a57b3f8b2f6a4dde5b4650193566fc50c4958f1d91ecd8e49ac022031b292ceb1b7e9cbd9098ead020c8ecc6bbe9abfef38aa2adf9d94c11a89cc7b",
"pubkey":"0332c837d3ca3dfab8f4170a56f7f18384417e03b8a395af0c6fb2b1352cc867cc"
}'
The above command returns JSON structured like this:
{
"code": 0,
"msg": "",
"data": {
"fee": 272,
"rawtx": "0200000002ebb93c38b383cd8681252567217620a25793ce8583c710f1ba15d4094c9718390100000070473044022052c3efdd42bf410d8d1b01aaee83377fd09a63edc8eccafdf5ab2a283fc7dafe022077eca91b9a790079530f7724e3fd104823bc04b0968e5ceee8f85aa1e4b3a2d541210362b83ac39f1f26734abaa034ad8b6bf7fbb52d0c3caf3585ed3a266195531c93056261646765ffffffff3773e900c09fe2e349f8aa107135dd749f9eb7f103630b4a23da265830556290020000006a473044022100a9ebaa52a264ff93fe920f03674a690a4e549778e990b94e21ee1962faf14efc021f50a07016e4af8c0145182fc257fb8393954863ed59da7b86ab95649e034269412102f9f7501ec42d33d90827cb6a82c3efa96c2c6c763f1400fe58d321b72806202fffffffff037803000000000000535101400100015101b101b261145e4c212664441bd01a7253975559e9f28121d5af005179517a7561587905626164676587695979a9517987695a795a79ac77777777777777777777776a08e6030000000000007803000000000000535101400100015101b101b26114ec8240727e2502ad10b303d1817e72762f3911df005179517a7561587905626164676587695979a9517987695a795a79ac77777777777777777777776a08d27e010000000000b4ed1f08000000001976a914ec8240727e2502ad10b303d1817e72762f3911df88ac00000000",
"txid": "5d811a5af91e4e35e5285a135a050005abc5e5fc03d69b5c9efc2105a20dce26"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/badge/transfer
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
payload | string | 否 | 请求参数的集合,值为json string,详见以下的Request Payload |
signature | string | 否 | 请求参数签名串,详见签名 |
pubkey | string | 否 | 用户验证签名的公钥 |
Request Payload
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
wallet_type | string | 是 | 钱包类型,固定值coin_regular |
wallet_index | int | 是 | 钱包索引,默认为0 |
badge_code | string | 是 | badge id |
message | string | 否 | opreturn附带信息 |
+to | object[] | 是 | 接收方数组 |
└ type | string | 是 | 接收方类型,固定值address |
└ content | string | 是 | 接收方地址(打点用户BSV钱包地址) |
└ amount | int | 是 | 转移badge的数量 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
txid | string | 交易的txid |
fee | int | 手续费 |
rawtx | string | 这笔交易的raw transaction |
查询badge数量
# With shell, you can just pass the correct header with each request
curl --location --request POST 'https://api.ddpurse.com/v1/badge/get_balance' \
--header 'Content-Type: application/json' \
--data-raw '{
"payload": "{\"badge_code\":\"c52bf511d0186a18dcd45cf7becfc12dc0f17595b353e6c26e692729cdb455ca\",\"wallet_index\":0,\"wallet_type\":\"coin_regular\"}",
"signature": "3044022034663aec9a59dbd1342ded18edb79909b2c45188e6b893ffbc92be5f4bd4157b02201551f9bca2ecd19c6072efdcd50caf5ec52108e5daedb45d9eb00e3b96b1ae90",
"pubkey": "0332c837d3ca3dfab8f4170a56f7f18384417e03b8a395af0c6fb2b1352cc867cc"
}'
The above command returns JSON structured like this:
{
"code": 0,
"msg": "",
"data": {
"confirm": 0,
"unconfirm": 8888
}
}
HTTP Request
POST https://api.ddpurse.com/v1/badge/get_balance
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
payload | string | 是 | 请求参数的集合,值为json string,详见以下的Request Payload |
signature | string | 是 | 请求参数签名串,详见签名 |
pubkey | string | 是 | 用户验证签名的公钥 |
Request Payload
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
wallet_type | string | 是 | 钱包类型,固定值coin_regular |
wallet_index | int | 是 | 钱包索引,默认为0 |
badge_code | string | 是 | badge id |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
confirm | int | 已确认数量 |
unconfirm | int | 未确认数量 |
查询badge流水
# With shell, you can just pass the correct header with each request
curl --location --request POST 'https://api.ddpurse.com/v1/badge/get_history' \
--header 'Content-Type: application/json' \
--data-raw '{
"payload": "{\"badge_code\":\"ed61c3b45253570e001d50283c37c1820549f3af58adb915a9f19b4811f17f3b\",\"io_type\":0,\"limit\":10,\"offset\":0,\"wallet_index\":0,\"wallet_type\":\"coin_regular\"}",
"signature": "30440220284733c549f6ff99bcb9afc416268ac6e81b5893bed21e5ea7f539c1f3904eb602207cd569d10e845e5beba4632400d1ba07d1cfa834e474f32556088bdb4f0282f4",
"pubkey": "0332c837d3ca3dfab8f4170a56f7f18384417e03b8a395af0c6fb2b1352cc867cc"
}'
The above command returns JSON structured like this:
{
"code": 0,
"msg": "",
"data": {
"count": 5,
"data": [
{
"badge_code": "ed61c3b45253570e001d50283c37c1820549f3af58adb915a9f19b4811f17f3b",
"blockhash": "",
"height": -1,
"timestamp": 1606361812,
"txid": "1eef9a5c45ea735c2bf547a9c088a9e1bb37b30d441b93860615adf8c148e1e1",
"value": -1555
},
{
"badge_code": "ed61c3b45253570e001d50283c37c1820549f3af58adb915a9f19b4811f17f3b",
"blockhash": "",
"height": -1,
"timestamp": 1606355830,
"txid": "ed61c3b45253570e001d50283c37c1820549f3af58adb915a9f19b4811f17f3b",
"value": 100000
}
]
}
}
HTTP Request
POST https://api.ddpurse.com/v1/badge/get_history
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
payload | string | 是 | 请求参数的集合,值为json string,详见以下的Request Payload |
signature | string | 是 | 请求参数签名串,详见签名 |
pubkey | string | 是 | 用户验证签名的公钥 |
Request Payload
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
wallet_type | string | 是 | 钱包类型,固定值coin_regular |
wallet_index | int | 是 | 钱包索引,默认为0 |
badge_code | string | 是 | badge id |
io_type | int | 是 | 流水类型,固定值,0 代表收入与支出,1 代表收入,2 代表支出 |
offset | int | 是 | 查询记录偏移量,比如1 代表跳过一条记录 |
limit | int | 是 | 查询的数量 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
count | int | 总流水数量 |
+data | object[] | 流水数组 |
└ badge_code | string | badge ID |
└ blockhash | string | 交易所在块hash,未出块为空 |
└ height | int | 交易所在块高度,未出块为-1 |
└ timestamp | int | 交易时间 |
└ value | int | badge转移数量,正数表示收入,负数表示支出 |
└ txid | string | 交易的txid |
Merchant API
开发者通过Merchant API可以实现
- 查询费率
- 交易广播
- 查询交易状态
查询费率
获取最新费率信息
curl --location --request GET 'https://api.ddpurse.com/v1/mapi/feeQuote'\
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>'
请求回返是 JSON,例:
{
"payload": "{\"apiVersion\":\"0.1.0\",\"timestamp\":\"2020-01-28T11:15:03.722Z\",\"expiryTime\":\"2020-01-28T11:25:03.722Z\",\"minerId\":\"03fcfcfcd0841b0a6ed2057fa8ed404788de47ceb3390c53e79c4ecd1e05819031\",\"currentHighestBlockHash\":\"000000000000000001cedc3dec00ecd29943a275498e812e72b2afdf5df8814a\",\"currentHighestBlockHeight\":619574,\"minerReputation\":\"N/A\",\"fees\":[{\"feeType\":\"standard\",\"miningFee\":{\"satoshis\":1,\"bytes\":1},\"relayFee\":{\"satoshis\":1,\"bytes\":1}},{\"feeType\":\"data\",\"miningFee\":{\"satoshis\":1,\"bytes\":1},\"relayFee\":{\"satoshis\":1,\"bytes\":1}}]}",
"signature": "304402202a7f70855739a6948c00c2a85dd733f087c4f1ae4beb256c225eadab767d5e1d02207870c57728166f61b0334bd89640d6d6c26f31ada4aac42b29971ebfa5c414e1",
"publicKey": "03fcfcfcd0841b0a6ed2057fa8ed404788de47ceb3390c53e79c4ecd1e05819031",
"encoding": "UTF-8",
"mimetype": "application/json"
}
HTTP Request
GET https://api.ddpurse.com/v1/mapi/feeQuote
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
payload | string | main data payload encoded in a specific format type |
signature | string | signature on payload string. This may be null. |
publicKey | string | public key to verify signature. This may be null. |
encoding | string | encoding type |
mimetype | string | Multipurpose Internet Mail Extensions type |
Payload
参数名 | 类型 | 说明 |
---|---|---|
apiVersion | string | version of merchant api spec |
timestamp | string | timestamp of payload document |
expiryTime | string | expiry time of quote |
minerId | string | minerID / public key of miner. This may be null. |
currentHighestBlockHash | string | hash of current blockchain tip |
currentHighestBlockHeight | int | hash of current blockchain tip |
minerReputation | string | reputation of miner |
fees | object[] | fees charged by miner (feeSpec BRFC) |
查询交易状态
curl --location --request GET 'https://api.ddpurse.com/v1/mapi/tx/594aa632facc2bdbce31ee02f7865997c0fa17a3360acb2f621cb117ad25c277'\
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>'
请求回返是 JSON,例:
{
"payload": "{\"apiVersion\":\"0.1.0\",\"timestamp\":\"2020-01-15T11:41:29.032Z\",\"returnResult\":\"failure\",\"resultDescription\":\"Transaction in mempool but not yet in block\",\"blockHash\":\"\",\"blockHeight\":0,\"minerId\":\"03fcfcfcd0841b0a6ed2057fa8ed404788de47ceb3390c53e79c4ecd1e05819031\",\"confirmations\":0,\"txSecondMempoolExpiry\":0}",
"signature": "3045022100f78a6ac49ef38fbe68db609ff194d22932d865d93a98ee04d2ecef5016872ba50220387bf7e4df323bf4a977dd22a34ea3ad42de1a2ec4e5af59baa13258f64fe0e5",
"publicKey": "03fcfcfcd0841b0a6ed2057fa8ed404788de47ceb3390c53e79c4ecd1e05819031",
"encoding": "UTF-8",
"mimetype": "application/json"
}
HTTP Request
GET https://api.ddpurse.com/v1/mapi/tx/{hash}
URL Parameters
参数名 | 是否必须 | 说明 |
---|---|---|
hash | 是 | 交易 hash |
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
payload | string | main data payload encoded in a specific format type |
signature | string | signature on payload string. This may be null. |
publicKey | string | public key to verify signature. This may be null. |
encoding | string | encoding type |
mimetype | string | Multipurpose Internet Mail Extensions type |
Payload
参数名 | 类型 | 说明 |
---|---|---|
apiVersion | string | version of merchant api spec |
timestamp | string | timestamp of payload document |
returnResult | string | will contain either success or failure |
resultDescription | string | will contain the error on failure or empty on success |
blockHash | string | hash of tx block |
blockHeight | int | hash of tx block |
minerId | string | minerId public key of miner |
confirmations | int | number of block confirmations |
txSecondMempoolExpiry | int | Duration (minutes) Tx will be kept in secondary mempool |
发送交易 Rawtx
curl --location --request POST 'https://api.ddpurse.com/v1/mapi/tx'\
-H "Authorization: Bearer APP-ACCESS-TOKEN" \
-H 'Content-Type: application/json' \
--data-raw '{
"rawtx":"020000000111f4be4399b8f466ba2788a6398caa4bf901d04003c653e78b6bb18da2bf9940000000006b483045022100ecdd8c9b34a8a8b10478b8a2bb06af18f294bffd19784bc68b58cba41a70165b022054679dad5e210236321eb09156beab18ea152fb76a97ced3ed418c85fad4ced9412102877b34ce9d3c57813e5730ee41fdc387f4a0f1fa23280774433c415d8e812bd5ffffffff0258020000000000001976a9147499270faa0ca65be4329ad2e1afa71869d1470e88ac15900300000000001976a9142d42015fe20db9eea5694f850fddf2729989fa6388ac00000000"
}'
请求回返是 JSON,例:
{
"payload": "{\"apiVersion\":\"0.1.0\",\"timestamp\":\"2020-01-15T11:40:29.826Z\",\"txid\":\"6bdbcfab0526d30e8d68279f79dff61fb4026ace8b7b32789af016336e54f2f0\",\"returnResult\":\"success\",\"resultDescription\":\"\",\"minerId\":\"03fcfcfcd0841b0a6ed2057fa8ed404788de47ceb3390c53e79c4ecd1e05819031\",\"currentHighestBlockHash\":\"71a7374389afaec80fcabbbf08dcd82d392cf68c9a13fe29da1a0c853facef01\",\"currentHighestBlockHeight\":207,\"txSecondMempoolExpiry\":0}",
"signature": "3045022100f65ae83b20bc60e7a5f0e9c1bd9aceb2b26962ad0ee35472264e83e059f4b9be022010ca2334ff088d6e085eb3c2118306e61ec97781e8e1544e75224533dcc32379",
"publicKey": "03fcfcfcd0841b0a6ed2057fa8ed404788de47ceb3390c53e79c4ecd1e05819031",
"encoding": "UTF-8",
"mimetype": "application/json"
}
HTTP Request
POST https://api.ddpurse.com/v1/mapi/tx
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
rawtx | string | 是 | 交易的 raw hex |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
payload | string | main data payload encoded in a specific format type |
signature | string | signature on payload string. This may be null. |
publicKey | string | public key to verify signature. This may be null. |
encoding | string | encoding type |
mimetype | string | Multipurpose Internet Mail Extensions type |
Payload
参数 | 类型 | 说明 |
---|---|---|
apiVersion | string | version of merchant api spec |
timestamp | string | timestamp of payload document |
txid | string | transaction ID |
returnResult | string | will contain either success or failure |
resultDescription | string | will contain the error on failure or empty on success |
minerId | string | minerId public key of miner |
currentHighestBlockHash | string | hash of current blockchain tip |
currentHighestBlockHeight | int | hash of current blockchain tip |
txSecondMempoolExpiry | int | Duration (minutes) Tx will be kept in secondary mempool |
区块链信息
区块头部查询
通过区块 hash 获取 raw block header
curl -X POST 'https://api.ddpurse.com/v1/bsvchain/get_raw_block_header' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer APP-ACCESS-TOKEN" \
-d '{
"blockhash": "<YOUR-blockhash>"
}'
上面的命令返回的 JSON 结构如下:
{
"code": 0,
"msg": "",
"data": {
"header_hex": "02000000028f2cb75e0b6b2bcaba83efa34cb6af4a7bc04e882de8c2090000000000000023d7fee87f54bfb980f383b80742ac060bb5294ff9cb82d159caa8acaf1eec1647f9fc51f2db721961769100"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/bsvchain/get_raw_block_header
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
blockhash | string | 是 | 区块 hash |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
header_hex | string | 16 进制区块头 |
根据 hash 查询区块信息
根据区块 hash 查询区块信息
curl -X POST 'https://api.ddpurse.com/v1/bsvchain/get_block_by_hash' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer APP-ACCESS-TOKEN" \
-d '{
"hash": "<YOUR-hash>"
}'
上面的命令返回的 JSON 结构如下:
{
"code": 0,
"msg": "",
"data": {
"height": 625882,
"reward": 1250601893,
"timestamp": 1583999952,
"transaction_count": 1771,
"size": 1015875,
"hex_coinbase": "03da8c092f68747470733a2f2f636f696e6765656b2e636f6d2f6d696e65722d6f757472656163682f2f4b37633144d892a7db975fcb22337800c0",
"hash": "0000000000000000017d4326a7232eaefde92465ae77d762c6d1892914e5f0e5",
"difficulty": 415922505851.8293
}
}
HTTP Request
POST https://api.ddpurse.com/v1/bsvchain/get_block_by_hash
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
hash | string | string | 区块 hash |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
height | int | 高度 |
hash | string | 区块 hash |
size | int | 大小(单位:byte) |
timestamp | int | 时间戳 |
reward | int | 出块奖励(单位:satoshi) |
hex_coinbase | string | 16 进制编码脚本 |
transaction_count | int | 交易数量 |
difficulty | float64 | 在此区块挖掘的难度 |
根据高度查询区块信息
根据高度查询区块信息
curl -X POST 'https://api.ddpurse.com/v1/bsvchain/get_block_by_height' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer APP-ACCESS-TOKEN" \
-d '{
"height": "<YOUR-height>"
}'
上面的命令返回的 JSON 结构如下:
{
"code": 0,
"msg": "",
"data": {
"height": 625882,
"reward": 1250601893,
"timestamp": 1583999952,
"transaction_count": 1771,
"size": 1015875,
"hex_coinbase": "03da8c092f68747470733a2f2f636f696e6765656b2e636f6d2f6d696e65722d6f757472656163682f2f4b37633144d892a7db975fcb22337800c0",
"hash": "0000000000000000017d4326a7232eaefde92465ae77d762c6d1892914e5f0e5",
"difficulty": 415922505851.8293
}
}
HTTP Request
POST https://api.ddpurse.com/v1/bsvchain/get_block_by_height
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 类型 | 说明 |
---|---|---|---|
height | int | int | 区块高度 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
height | int | 高度 |
hash | string | 区块 hash |
size | int | 大小(单位:byte) |
timestamp | int | 时间戳 |
reward | int | 出块奖励(单位:satoshi) |
hex_coinbase | string | 16 进制编码脚本 |
transaction_count | int | 交易数量 |
difficulty | float64 | 在此区块挖掘的难度 |
根据高度批量查看区块信息
批量获取区块
curl -X POST 'https://api.ddpurse.com/v1/bsvchain/get_blocks_by_height' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer APP-ACCESS-TOKEN" \
-d '{
"offset": "<YOUR-OFFSET>",
"limit":"<YOUR-LIMIT>"
}'
上面的命令返回的 JSON 结构如下:
{
"code": 0,
"msg": "",
"data": [
{
"height": 625890,
"reward": 1250171398,
"timestamp": 1584005058,
"transaction_count": 782,
"size": 284711,
"hex_coinbase": "03e28c0904b8ff695e322f537069646572506f6f6c2ffabe6d6dda153ebb0e68d606ba543955fc4aece1fa6ebf31c8dec55114914bb4cfc20a2401000000000000000100076acb69000000000000",
"hash": "00000000000000000080a268f9d00b7e05a3362884cd525fa540308205af8e04",
"difficulty": 415922505851.8293
},
{
"height": 625889,
"reward": 1250319195,
"timestamp": 1584004809,
"transaction_count": 802,
"size": 368455,
"hex_coinbase": "03e18c0904c9fe695e088100079a7606000057617270486173685c30",
"hash": "00000000000000000226910abdfddb05cea178e3eb7f9086b8600a9970fecd9c",
"difficulty": 415922505851.8293
}
]
}
HTTP Request
POST https://api.ddpurse.com/v1/bsvchain/get_blocks_by_height
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
offset | int | int | 偏移, 例:[1,2,3,4,5] offset:2, limit:3 得到[3,4,5] |
limit | int | 是 | 条目,最大为 100 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
height | int | 高度 |
hash | string | 区块 hash |
size | int | 大小(单位:byte) |
timestamp | int | 时间戳 |
reward | int | 出块奖励(单位:satoshi) |
hex_coinbase | string | 16 进制编码脚本 |
transaction_count | int | 交易数量 |
difficulty | float64 | 在此区块挖掘的难度 |
获取区块交易列表
获取区块交易列表
curl -X POST 'https://api.ddpurse.com/v1/bsvchain/get_blocks_txs' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer APP-ACCESS-TOKEN" \
-d '{
"hash":"<YOUR-HASH>",
"offset": "<YOUR-OFFSET>",
"limit":"<YOUR-LIMIT>"
}'
上面的命令返回的 JSON 结构如下:
{
"code": 0,
"msg": "",
"data": {
"txs": [
"4ef83acd026495adff7dfb276bfaf271b0e6ba6c2bc462ef105dd8e1c5fc29f4",
"9de197b307f650835765150bff25220408eb6d2d753990645d38bd085ff72053",
"1d6982b15f828b77f48146cee3f4f8a4658c0a9dce287e59b27dc14ee9654780",
"51679f5421403d13b204827f5e09f0c1316a311645f850ec925007d6ae135fe4",
"81a95fab656ca6fe6060d9d202419e00a34c400d3c8215b33ec06e5f10a4b033"
]
}
}
Http Request
POST https://api.ddpurse.com/v1/bsvchain/get_blocks_txs
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
hash | string | i | 区块 hash |
offset | int | 是 | 偏移, 例:[1,2,3,4,5] offset:2, limit:3 得到[3,4,5] |
limit | int | 是 | 条目,最大为 100 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
txs | string[] | txid 数组 |
获取区块链基础信息
查询区块链的一些基础信息
curl -X POST 'https://api.ddpurse.com/v1/bsvchain/get_chain_info' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer APP-ACCESS-TOKEN" \
上面的命令返回的 JSON 结构如下:
{
"code": 0,
"msg": "",
"data": {
"bestblock": 625891,
"unconfirm_tx_count": 37525,
"bestfeerate": {
"feebyte": 1,
"feesatoshi": 1
},
"hashes_per_sec": 2829162.275754181,
"diffculty": 415922505851.8293,
"nbits": 418216206
}
}
POST https://api.ddpurse.com/v1/bsvchain/get_chain_info
Response Body
参数名 | 类型 | 说明 |
---|---|---|
bestblock | int | 最新高度 |
unconfirm_tx_count | int | 未确认交易数量 |
BestFee | json | btc:表示当前内存池内交易小于 0.8m 的交易费率;bsv:固定返回 1:1 |
feebyte | int | 与 feesatoshi 配合,表示几聪 /几字节 中的几字节 |
feesatoshi | int | 与 feebyte 配合,表示几聪 /几字节 中的几聪 |
hashes_per_sec | float | 算力 |
diffculty | float | 难度 |
交易查询
通过 txid 查询交易信息
curl -X POST 'https://api.ddpurse.com/v1/bsvchain/get_transaction' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer APP-ACCESS-TOKEN" \
-d '{
"transaction_hash": "<YOUR-TXID>"
}'
上面的命令返回的 JSON 结构如下:
{
"code": 0,
"msg": "",
"data": {
"transaction_hash": "016a195a865e57a24d2f606aef89d8775ed2f8ae9016419542b9ad798574f6f6",
"vins": [
{
"index": 0,
"script_hex": "4730440220493447148876bb55b63712c93004384ad0e0b35500ce96949751682afe8e7d4d022050ff787468c73a3ca51207a93805e96de032a2fa2a6fd8a0153447148876bb55b63712c93004384ad0e0b35500ce96949751682afe8e7d4d022050ff787468c73a3ca51207a93805e96de032a2fa2a6fd8a0153447148876bb55b63712c93004384b704fd57dbadfcc95106df8",
"amount": 1110213
},
{
"index": 1,
"script_hex": "4730440220449daee99fd72d026864fa084ec5a338be4e3c355ff3a7f6d01951c25957b6b702200fe26fb621da1c2df8d870a5bf6029bb6fb775a58c320f5589e90fb8df3cd46783ced46dcd72d026864fa084ec5a338be4e3c355ff3a7f6d01951c25957b6b702200fe26fb621da1c2df8d870a5bf6029bb6fb775a58c320f5589e90fb8dcd46783ceecdcd",
"amount": 3602800
},
{
"index": 2,
"script_hex": "483045022100c3d55580d62ac027676e5d352be4cc710051726c68d5ff76085682dd4b3636fb02203b5ff2f5b298a42efbabde5273efda8329547de469f32279cae25d5b3984edfd41210286f4ff4b3984edfd41210286f4ff4dafebf4252900734614546",
"amount": 1424703
},
{
"index": 3,
"script_hex": "473044022047ae5c1c2ac3211418708141633fe6952f8dd8e7d9baa878d2323323f25c3c38022076af30794eabb63dc9d840152c1b29921adeb67c93e8eb39efaa5c1c2ac3211418708141633fe6952f8dd8e7d9baa878d2323323f25c3c38022076af30794eabb63dc9d840152c1b29921adeb67c93e8eb39efaa5c1c2ac3211418708141633c",
"amount": 254000
},
{
"index": 4,
"script_hex": "483045022100d9522a1e107375b184459091855c36c0a2fff577d9270ca140c4f6a253986a1e02200cd4934de777f188fe5d85fc8bbe111569c58b48cb46c0b3cfdc7ef60fb024b024350024a",
"amount": 144110712
}
],
"vouts": [
{
"index": 0,
"script_hex": "76a9142fa431e514155b7d36955a7b204aca593043128288ac",
"amount": 149500000
},
{
"index": 1,
"script_hex": "76a914cb13d2b179851b7b37a34763a698fabfe401c7bf88ac",
"amount": 1001610
}
],
"height": 625876,
"size": 815,
"timestamp": 1583995981,
"confirmation": 6
}
}
HTTP Request
POST https://api.ddpurse.com/v1/bsvchain/get_transaction
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
transaction_hash | string | 是 | 交易 hash(txid) |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
vouts | json | 所有的 vout |
vins | json | 所有的 vin |
index | int | vin 或者 vout 的 index |
confirmation | int | 确认数 |
timestamp | int | 时间戳 |
size | int | 交易大小 (单位:byte) |
amount | int | 交易金额 (单位:satoshi) |
script_hex | string | 16 进制编码过的脚本 |
transaction_hash | string | 交易的 txid |
height | int | 区块高度,-1 表示未确认 |
DAPP开发新增接口
获取 utxos
获取 utxos
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/grandet_dapp/dapp_list_unspent' \
-H "Authorization: Bearer <USER-ACCESS-TOKEN>"
--data-raw '{
"min_amount": 0
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"utxos": [
{
"tx_hash": "6e6ca644fbce1311a8078a93868244f6f3f11484aaa6b5fb0bbe9e51c1e70396",
"output_index": 2,
"satoshis": 8374,
"script": "76a9146b1bb91452b7585b326b3bda87c761e6aa03ef9388ac",
"addr": "1AmLWkaTnJKPX45cTXLoWbpLoM2X4QyBve",
"pubkey": "03acc481ada69bea5ec190f3470eaed4b6c19636c3cd80daf5d4db7303a139f0bd"
}
]
}
}
HTTP Request
POST https://api.ddpurse.com/v1/grandet_dapp/dapp_list_unspent
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer USER-ACCESS-TOKEN,授权方式: 用户授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
min_amount | int | 是 | 需要的 utxo 的总量 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
tx_hash | string | |
output_index | int | |
satoshis | int | |
script | string | |
addr | string | |
pubkey | string |
获取用户原始交易
获取用户 rawtx
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/grandet_dapp/dapp_sign_raw_transaction' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"rawtx":"<YOUR RAWTX>",
"input_index":0,
"sig_type":1,
"addr":"<ADDR>"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"signed_rawtx": "SIGNED_RAWTX"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/grandet_dapp/dapp_sign_raw_transaction
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
rawtx | string | 是 | 需要的签名的 rawtx |
input_index | int | 是 | 第几个 vin 需要签名 |
sig_type | int | 是 | 签名的类型,1 代表 sig_all |
addr | string | 是 | 地址 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
signed_rawtx | string | 签好后的 tx |
获取用户 signature
获取用户 signature
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/grandet_dapp/dapp_get_signature' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"rawtx":"<RAWTX>",
"input_index":0,
"sig_type":1,
"addr":"<ADDR>"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"hex_signature": "HEX_SIGNATURE"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/grandet_dapp/dapp_get_signature
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
rawtx | string | 是 | 需要的签名的 rawtx |
input_index | int | 是 | 第几个 vin 需要签名 |
sig_type | int | 是 | 签名的类型,1 代表 sig_all |
addr | string | 是 | 地址 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
signed_rawtx | string | 签好后的 tx |
广播交易
Broadcast transaction
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/grandet_dapp/dapp_send_raw_transaction' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"rawtx":"<YOUR RAWTX>"
}'
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
rawtx | string | 是 | rawtx |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
txid | string | txid |
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"txid": "TXID"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/grandet_dapp/dapp_send_raw_transaction
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
rawtx | string | 是 | rawtx |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
txid | string | txid |
获取地址
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/grandet_dapp/dapp_get_raw_change_address' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"address": "1Fpik4DBHH2PyBf8gxNRaV8DdzDa1Bm9w7"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/grandet_dapp/dapp_get_raw_change_address
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer APP-ACCESS-TOKEN,授权方式: 应用授权 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
address | string | 地址 |
查询用户余额
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/grandet_dapp/dapp_get_balance' \
--header 'Authorization: Bearer <USER-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"confirm": 515937433,
"unconfirm": 0
}
}
HTTP Request
POST https://api.ddpurse.com/v1/grandet_dapp/dapp_get_balance
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer USER-ACCESS-TOKEN,授权方式: 用户授权 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
confirm | int | 已确认数量 |
unconfirm | int | 未确认数量 |
查询用户公钥
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/grandet_dapp/dapp_get_public_key' \
--header 'Authorization: Bearer <USER-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"public_key": "035edcabbe3795595e2236cbe34f5b7f288487a2aeae7f3c8b8d7313c62e7b1968"
}
}
HTTP Request
POST https://api.ddpurse.com/v1/grandet_dapp/dapp_get_public_key
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer USER-ACCESS-TOKEN,授权方式: 用户授权 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
confirm | int | 已确认数量 |
unconfirm | int | 未确认数量 |
BAAS
无币裸数据上链
HTTP Request
POST https://api.ddpurse.com/v1/bsv/baas_send_raw_data_to_chain
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer USER-ACCESS-TOKEN |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
data_hex | string | 是 | 上链的数据 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
code | int | 状态码,0表示成功,其他表示失败 |
msg | string | 错误描述 |
Webot
获取某一个地址的某一种卡包的余额
curl --location --request POST 'https://api.ddpurse.com/v1/bsv/get_badge_balance_by_address' \
--header 'Authorization: Bearer <USER-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"badge_code":"<BADGE-CODE>",
"addresses":["<ADDRESS>","<ADDRESS>"]
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"balance": 63244
}
}
HTTP Request
POST https://api.ddpurse.com/v1/bsv/get_badge_balance_by_address
Request Header
http://192.168.1.13:8090/api/v1/users/*
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer USER-ACCESS-TOKEN,授权方式: 用户授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
badge_code | string | 是 | badge id |
addresses | []string | 是 | 地址数组 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
balance | int | 最小单位的金额 |
获取某一个地址的某一种卡包的流水
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/v1/bsv/get_badge_history_by_address' \
--header 'Authorization: Bearer <USER-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"badge_code":"<BADGE-CODE>,
"address":"<ADDRESS>"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"list": [
{
"txid": "cb616124609644b197f667810eba17f22991805f8b4fd4871bb2e3110db793a4",
"amount": 30000
},
{
"txid": "27b3e152ff31be2f6a97f9b20816d4897f6fa1446a0ee19746866326f2dc9cc4",
"amount": -23
}
],
"total": 2
}
}
HTTP Request
POST https://api.ddpurse.com/v1/bsv/get_badge_history_by_address
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer USER-ACCESS-TOKEN,授权方式: 用户授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
badge_code | string | 是 | badge id |
address | string | 是 | 地址 |
offset | int | 否 | 默认0 |
limit | int | 否 | 默认20 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
+list | []object | 流水列表 |
└ txid | string | 交易号 |
└ amount | int | 最小单位交易金额 |
total | int | 记录总数 |
创建一笔未签名的交易
curl --location --request POST 'https://api.ddpurse.com/v1/bsv/create_unsign_insufficient_fee_tx' \
--header 'Authorization: Bearer <USER-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"from":["<PUBKEY>","<PUBKEY>"],
"to":[{"address":"<ADDRESS>","amount":"<AMOUNT>"}],
"badge_code":"<BADGE-CODE>",
"change_address":"<CHANGE-ADDRESS>"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": "0200000001c49cdcf22663864697e10e6a44a16f7f89d41608b2f9976a2fbe31ff52e1b3270100000000ffffffff027803000000000000535101400100015101b101b261146edab19d5b36339361fe674450ec00a513cb3343005179517a7561587905626164676587695979a9517987695a795a79ac77777777777777777777776a0821000000000000007803000000000000535101400100015101b101b26114582e39b66ce249ee5c69c42da33fe4b62d2a095e005179517a7561587905626164676587695979a9517987695a795a79ac77777777777777777777776a08bb8100000000000000000000"
}
HTTP Request
POST https://api.ddpurse.com/v1/bsv/create_unsign_insufficient_fee_tx
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer USER-ACCESS-TOKEN,授权方式: 用户授权 |
Request Body
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
from | []string | 是 | 发送者公钥 |
to | []object | 是 | 接收者信息 |
└ address | string | 是 | 接收者地址 |
└ amount | int | 是 | 接收者金额 |
badge_code | string | 是 | badge id |
change_address | string | 是 | 找零地址 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
data | string | 未签名的rawtx |
法币订单
创建法币订单
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/ikki/user_all/create_fiat_order' \
-H "Authorization: Bearer <ACCESS-TOKEN>"
--header 'Content-Type: application/json' \
--data-raw '{
"request_id": "6666666666666666",
"currency_amount_bp":"10000000000",
"currency_code": "cny",
"notify_url": "https://",
"redirect_uri": "https://",
"info": "备注"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"order_sn": "afec21c2ac724fccda997ff638a08ac2",
}
}
HTTP Request
POST https://api.ddpurse.com/ikki/user_all/create_fiat_order
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer ACCESS-TOKEN |
Request Body
参数名 | 是否必须 | 类型 | 说明 |
---|---|---|---|
request_id | 是 | string | 商家订单号,查询时使用 |
currency_amount_bp | 是 | string | 法币金额,精确到元后面4位数, 例如 十元二角五分为 102500 |
currency_code | 是 | string | 法币类型, cny、usd、eur、gbp |
notify_url | 否 | string | 支付结果通知地址,以https://作为前缀,如 https://www.example.com/notify, |
redirect_uri | 是 | string | 支付完成后跳转地址,以https://作为前缀,如 https://www.example.com/redirect_uri |
info | 是 | string | 订单的备注信息 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
order_sn | string | 订单号 |
获取订单信息
# 每次请求,提交正确的header(shell例子):
curl --location --request POST 'https://api.ddpurse.com/ikki/user_all/get_fiat_order' \
-H "Authorization: Bearer <ACCESS-TOKEN>"
--header 'Content-Type: application/json' \
--data-raw '{
"request_id": "6666666666666666"
}'
请求回返是 JSON,例:
{
"code": 0,
"msg": "",
"data": {
"order_sn":"xxx",
"request_id":"xxx",
"status":1
}
}
HTTP Request
POST https://api.ddpurse.com/ikki/user_all/get_fiat_order
Request Header
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Authorization | string | 是 | Authorization: Bearer ACCESS-TOKEN |
Request Body
参数名 | 是否必须 | 类型 | 说明 |
---|---|---|---|
request_id | 是 | string | 商家订单号,查询时使用 |
Response Body
参数名 | 类型 | 说明 |
---|---|---|
status | int | 账单状态,0 待发布,1 待支付,2 关闭中, 3 数字货币部分到账,4 数字货币已到账, 9 法币到账,-1订单关闭, -2 超时关闭,-9 已删除 |
request_id | string | 商家订单号 |
order_sn | string | 订单号 |
Badge NFT
开发者钱包接入NFT
开发者用自己钱包进行铸造、转移、销毁NFT等操作。开发者应用的用户无需接入打点钱包,所有的NFT均在开发者子钱包之间转移。 若想为开发者应用中的用户生成对应的钱包,可以使用开发者钱包下的user_index钱包绑定开发者应用的用户,通过此种方式可以管理开发者应用下不同用户之间的资产。 当使用某个user_index钱包进行铸造、转移、销毁、获取地址时,如果该user_index钱包没有创建则会自动生成该钱包。且所有铸造、转移、销毁的矿工费均从user_index=0的钱包中扣除。
铸造NFT
curl 示例:
curl https://api.ddpurse.com/phoenix/user_all/makao_mint_nft
上面的命令输出如下:
curl --location --request POST 'https://api.ddpurse.com/phoenix/user_all/makao_mint_nft' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"name":"",
"nft_owner_user_index":123,
"pics":[
{
"pic":""
}
],
"desc":"",
"count":50,
}'
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_mint_nft
Request Header
参数 | 类型 | 是否必须 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
name | string | NFT作品名称 |
nft_owner_user_index | int | 用户对应的user_index钱包 |
pics.pic | object[] | 图片url |
desc | string | 作品描述 |
count | int | NFT作品的份数。比如:10,则编号为1-10,共10份 |
Response Body
Param | Type | Description |
---|---|---|
fee | int64 | 铸造手续费 |
fee_str | string | 铸造手续费,字符串格式 |
fee_coin_type | string | 手续费的币种 |
txid | string | 铸造交易的txid |
work_info | object | NftWorkGroupInfo |
批量铸造NFT
curl 示例:
curl https://api.ddpurse.com/phoenix/user_all/makao_batch_mint_nft
上面的命令输出如下:
curl --location --request POST 'https://api.ddpurse.com/phoenix/user_all/makao_batch_mint_nft' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"nfts":[
{
"name":"",
"nft_owner_user_index":123,
"pics":[
{
"pic":""
}
],
"desc":"",
"count":50,
},
{...}
]
}'
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_batch_mint_nft
Request Header
参数 | 类型 | 是否必须 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
nfts | Array | |
nfts.name | string | NFT作品的名字 |
nfts.nft_owner_user_index | int | 用户对应的user_index钱包 |
nfts.pics.pic | string | 图片url |
nfts.desc | string | 作品描述 |
nfts.count | int | NFT作品的份数。比如:10,则编号为1-10,共10 |
Response Body
Param | Type | Description |
---|---|---|
fee | int64 | 铸造手续费 |
fee_str | string | 铸造手续费,字符串格式 |
fee_coin_type | string | 手续费的币种 |
work_info | object | NftWorkGroupInfo |
转移NFT
curl 示例:
curl https://api.ddpurse.com/phoenix/user_all/makao_transfer_nft
上面的命令输出如下:
curl --location --request POST 'https://api.ddpurse.com/phoenix/user_all/makao_transfer_nft' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"from_user_index":123,
"to_user_index":456,
"ids":[]
}'
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_transfer_nft
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
from_user_index | int | 从哪个user_index对应的用户转移资产 |
to_user_index | int | 资产转移到哪个user_index对应的用户 |
ids | []string | NFT的badge_code(即铸造的txid+编号) |
Response Body
Param | Type | Description |
---|---|---|
fee | int64 | 转移费用 |
fee_str | string | 转移费用,字符串格式 |
txids | []string | 交易的txids |
子钱包NFT转移流水
curl 示例:
curl https://api.ddpurse.com/phoenix/nft_intl_get_account_history
上面的命令输出如下:
curl --location --request POST 'https://api.ddpurse.com/v1/phoenix/nft_intl_get_account_history' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"page":1,
"page_size":10,
"user_index":5,
"transfer_type": "ALL"
}'
HTTP Request
https://api.ddpurse.com/v1/phoenix/nft_intl_get_account_history
Request Header
Parameter | Type | Required | Description |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
page | int | 从1开始 |
page_size | int | |
user_index | int | 用户对应的user_index钱包 |
transfer_type | string | ALL(全部)/income(收入)/pay(支出) |
Response Body
Param | Type | Description |
---|---|---|
total | int | 历史记录总数,用于分页 |
items.id | string | 记录ID |
items.badge_code | string | NFT的badge_code(即铸造的txid+编号) |
items.created_time | int64 | 作品转移时间 |
items.avatar | string | 作品图片url |
items.coin | string | |
items.coin_type | string | |
items.title | string | NFT作品名称 |
获取NFT资产
curl 示例:
curl https://api.ddpurse.com/phoenix/user_all/makao_get_work_group_list
上面的命令输出如下:
curl --location --request POST 'https://api.ddpurse.com/phoenix/user_all/makao_get_work_group_list' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"page":1,
"page_size":10,
"user_index":5,
}'
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_get_work_group_list
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
参数 | 类型 | 描述 |
---|---|---|
page | int | 从1开始 |
page_size | int | |
user_index | int | 用户对应的user_index钱包 |
Response Body
Param | Type | Description |
---|---|---|
total | int | 总数 |
items | NftWorkGroupInfo[] |
对应的结构体定义如下: ```
type NftWorkGroupInfo struct {
Id string json:"id"
Name string json:"name"
Cover string json:"cover"
Pics []string json:"pics"
Desc string json:"desc"
CreatedAt int64 json:"created_at"
Creator *NftUserInfo json:"creator"
PriceRange string json:"price_range"
Count *NftCount json:"count"
ChainInfo *NftChainInfo json:"chain_info"
IsLike bool json:"is_like"
LikeNumber int64 json:"like_number"
NumberRange string json:"number_range"
SingleWorkList []*SingleWork json:"single_work_list"
}
type NftUserInfo struct {
Id string json:"id"
Name string json:"name"
Avatar string json:"avatar"
Address string json:"address,omitempty"
Introduction string json:"introduction,omitempty"
Achievements []*Achievement json:"achievements,omitempty"
}
type Achievement struct {
Id string json:"id"
Name string json:"name"
Pics []string json:"pics"
}
type NftCount struct {
Total int64 json:"total"
OnShelf int64 json:"on_shelf"
OffShelf int64 json:"off_shelf"
OnShelfing int64 json:"on_shelfing"
Deleted int64 json:"deleted"
}
type NftChainInfo struct {
Tx string json:"tx"
Chain string json:"chain"
}
type SingleWork struct {
IdIndex string json:"id_index"
IndexLabel string json:"index_label"
}
```
获取余额
curl 示例:
curl https://api.ddpurse.com/phoenix/user_all/makao_get_user_balance
上面的命令输出如下:
curl --location --request POST 'https://api.ddpurse.com/v1/phoenix/makao_get_user_balance' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_index":0
}'
HTTP Request
https://api.ddpurse.com/v1/phoenix/user_all/makao_get_user_balance
Request Header
Parameter | Type | Required | Description |
---|---|---|---|
Authorization | String | 是 | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
user_index | int | 用户对应的user_index钱包 |
Response Body
Param | Type | Description |
---|---|---|
amount | int | BSV余额 |
异步批量铸造
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_batch_mint_nft_async
请求示例
{
"request_id": "",
"nfts": [
{
"name": "",
"nft_owner_user_index": 0,
"pics": [
{
"pic": ""
}
],
"desc": "",
"count": 0
}
]
}
{
"code": 0,
"msg": "",
"data": null
}
查询异步批量铸造结果
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_get_batch_mint_nft_async_result
{
"request_id": ""
}
{
"code": 0,
"msg": "",
"data": {
"results": [
{
"fee": 0,
"fee_str": "",
"fee_coin_type": "",
"txid": "",
"work_info": {
"id": "",
"name": "",
"cover": "",
"pics": [
""
],
"desc": "",
"created_at": 0,
"creator": null,
"price_range": "",
"count": null,
"chain_info": null,
"is_like": false,
"like_number": 0,
"number_range": ""
},
"state": 0,
"descript": ""
}
]
}
}
state 0 表示还在处理中 state 1 表示失败,原因在描descript里 state 2 成功
获取钱包地址
curl 示例:
curl https://api.ddpurse.com/phoenix/user_all/makao_get_address
上面的命令输出如下:
{
"code": 0,
"msg": "",
"data": {
"addr":"xxx"
}
}
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_get_address
Request Header
参数 | 类型 | 是否必须 | 描述 |
---|---|---|---|
Authorization | string | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
user_index | int | user_index(传入则查询子钱包地址) |
Response Body
Param | Type | Description |
---|---|---|
addr | string | 主钱包收款的bsv地址 |
根据badge_code查询作品流动记录
curl 示例:
curl --location --request POST 'https://api.ddpurse.com/phoenix/user_all/makao_get_nft_history' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"page": 1,
"page_size": 1,
"id":"ad99409c1ae5d470dcdccafb0d53055da1729772581445d36e0ce16865318d12_1",
}'
上面的命令输出如下:
{
"code": 0,
"msg": "",
"data": {
"total": 3,
"name": "AAA",
"sn": "#2/2",
"history": [
{
"txid": "8122f33c6bb6f53075dd20f50977b1b181e65d96842056725d68177374a08acc",
"sender_ucid": "0d158bc3605fffe30f7046f0c9c7e4bf",
"receiver_ucid": "0d158bc3605fffe30f7046f0c9c7e4bf",
"send_address": "miHQkTet61zrNS7WqVjEqfH345p6CkVYmN",
"receive_address": "mx5Ah5Q4VWGSxSPJVKR24jZ6hsvUhVkh9E",
"timestamp": 1647324886
}
]
}
}
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_get_nft_history
Request Header
参数 | 类型 | 是否必须 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
id | string | NFT的badge_code(即铸造的txid+编号) |
Response Body
Param | Type | Description |
---|---|---|
total | int | 总数 |
name | string | 名称 |
sn | string | 编号 |
history | array | nft流转记录 |
history.txid | string | txid |
history.sender_ucid | string | 发送者id |
history.sender_user_index | int | 发送者的user_index |
history.send_address | string | 发送者地址 |
history.receiver_ucid | string | 接收者id |
history.receiver_user_index | int | 接收者的user_index |
history.receive_address | string | 接收者地址 |
history.timestamp | int | 时间 |
转移NFT到外部地址
curl 示例:
curl https://api.ddpurse.com/phoenix/user_all/makao_transfer_nft_to_address
上面的命令输出如下:
curl --location --request POST 'https://api.ddpurse.com/phoenix/user_all/makao_transfer_nft_to_address' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"from_user_index":123,
"to_address":"mvAXXmqBEnq1uuT4CL9mFXLCVEhviakGJw",
"ids":[]
}'
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_transfer_nft_to_address
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
from_user_index | int | 从哪个uid对应的用户转移资产 |
to_address | string | 地址 |
ids | []string | NFT的badge_code(即铸造的txid+编号) |
Response Body
Param | Type | Description |
---|---|---|
fee | int64 | 转移费用 |
fee_str | string | 转移费用,字符串格式 |
查询NFT最新持有人
根据"NFT的badge_code(即铸造的txid+编号)"查询当前NFT的拥有者对应哪个的user_index钱包
curl --location --request POST 'https://api.ddpurse.com/phoenix/user_all/makao_get_hold_info
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"badge_code": "bcc39512da2d198de137cf3f6b8a25647c2c96babcb6dd0c3d726dc6e7cf9d96_6"
}'
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_get_hold_info
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
badge_code | string | NFT的badge_code(即铸造的txid+编号) |
Response Body
Param | Type | Description |
---|---|---|
user_index | int | 用户对应的user_index钱包 |
is_destroy | bool | 是否销毁 |
销毁NFT
根据"NFT的badge_code(即铸造的txid+编号)"销毁NFT
curl --location --request POST 'https://api.ddpurse.com/phoenix/user_all/makao_destroy_nft
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"badge_code": "bcc39512da2d198de137cf3f6b8a25647c2c96babcb6dd0c3d726dc6e7cf9d96_6",
"user_index": 10
}'
HTTP Request
https://api.ddpurse.com/phoenix/user_all/makao_destroy_nft
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
badge_code | string | NFT的badge_code(即铸造的txid+编号) |
user_index | int | 用户对应的user_index钱包 |
Response Body
Param | Type | Description |
---|---|---|
txid | string | 销毁的txid |
开发者应用接入NFT
用户可以通过自己的钱包连接到应用,用户在应用里用自己的钱包进行铸造、转移、销毁NFT
业务说明: - 1、打点钱包用户有三种类型:开发者、应用、普通用户,均可以有自己的钱包。 - 2、应用的钱包:可以通过应用的app_id、secret在打点web钱包进行登录 - 3、应用只能操作用户自动支付的钱包(用户NFT授权的前提下),所以NFT需要通过自动支付钱包来接收
业务场景: - 1、普通用户(或开发者)的自动支付钱包NFT授权后应用可以为普通用户(或开发者)进行铸造、转移、销毁NFT。 - 2、应用也可以自己铸造后直接转移给开发者和普通用户
代铸造NFT
curl https://api.ddpurse.com/v1/nft/agent_mint_nft
curl示例:
curl --location --request POST 'https://api.ddpurse.com/v1/nft/agent_mint_nft' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_id":"",
"name":"",
"Desc":"",
"pics":[{"pic":"", "md5":""}],
"count":1
}'
HTTP Request
https://api.ddpurse.com/v1/nft/agent_mint_nft
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
user_id | string | 被代理的用户id |
name | string | NFT作品的名字 |
pics.pic | object[] | 图片url |
desc | string | 作品描述 |
count | int | NFT作品的份数。比如:10,则编号为1-10,共10份 |
Response Body
Param | Type | Description |
---|---|---|
fee | int64 | 铸造手续费 |
fee_str | string | 铸造手续费,字符串格式 |
txid | string | NFT的txid (相应的NFT的badge_code 为 txid + "_" + 编号, 如:dd856320242247da7bb192b0e3501e7b05eb913df51c8e909c35dee7cdf492e8_1) |
work_info | object | NFT的详细信息 |
代转移NFT
curl https://api.ddpurse.com/v1/nft/agent_transfer_nft
curl示例:
curl --location --request POST 'https://api.ddpurse.com/v1/nft/agent_transfer_nft' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_id":""
"to_address":"",
"ids":[""],
}'
HTTP Request
https://api.ddpurse.com/v1/nft/agent_transfer_nft
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
user_id | string | 被代理的用户id |
to_address | string | 要转移的目标地址(需是自动支付钱包的地址) |
ids | []string | NFT的badge_code(即铸造的txid+编号) |
Response Body
Param | Type | Description |
---|---|---|
fee | int64 | 转移费用 |
fee_str | string | 转移费用,字符串格式 |
代销毁NFT
curl https://api.ddpurse.com/v1/nft/agent_destroy_nft
curl示例:
curl --location --request POST 'https://api.ddpurse.com/v1/nft/agent_destroy_nft' \
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_id":"",
"ids":[""]
}'
HTTP Request
https://api.ddpurse.com/v1/nft/agent_destroy_nft
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
user_id | string | 被代理的用户id |
ids | []string | NFT的badge_code(即铸造的txid+编号) |
Response Body
Param | Type | Description |
---|---|---|
txid | string | 交易的txid |
查询NFT转移历史
curl https://api.ddpurse.com/phoenix/public/get_nft_transaction_history
curl示例:
curl --location --request POST 'https://api.ddpurse.com/phoenix/public/get_nft_transaction_history
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"badge_code": "bcc39512da2d198de137cf3f6b8a25647c2c96babcb6dd0c3d726dc6e7cf9d96_6"
}'
HTTP Request
https://api.ddpurse.com/phoenix/public/get_nft_transaction_history
Request Body
Param | Type | Description |
---|---|---|
badge_code | string | NFT的badge_code(即铸造的txid+编号) |
Response Body
Param | Type | Description |
---|---|---|
name | string | NFT名称 |
cover | string | NFT封面 |
publish_time | int64 | 发行时间 |
creator | string | 创作者 |
genesis_transaction | string | 创世交易 |
creator_address | string | 创作者 |
destroy | bool | 是否已销毁 |
transaction_history.total | int | 记录条数 |
transaction_history.items.txid | string | nft id |
transaction_history.items.timestamp | int64 | 时间戳 |
transaction_history.items.from | string | 转出地址 |
transaction_history.items.to | string | 转入地址 |
查询NFT最新的持有人
curl https://api.ddpurse.com/phoenix/public/get_badge_owner_info
curl示例:
curl --location --request POST 'https://api.ddpurse.com/phoenix/public/get_badge_owner_info
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"badge_code": "bcc39512da2d198de137cf3f6b8a25647c2c96babcb6dd0c3d726dc6e7cf9d96_6"
}'
HTTP Request
https://api.ddpurse.com/phoenix/public/get_badge_owner_info
Request Body
Param | Type | Description |
---|---|---|
badge_code | string | NFT的badge_code(即铸造的txid+编号) |
Response Body
Param | Type | Description |
---|---|---|
owner | string | 持有者user id |
owner_address | string | 持有者地址 |
timestamp | int64 | 时间 |
destroy | bool | 是否已销毁 |
查询用户NFT资产
curl https://api.ddpurse.com/v1/nft/query_user_hold_nft_list
curl示例:
curl --location --request POST 'https://api.ddpurse.com/v1/nft/query_user_hold_nft_list
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_id": ""
}'
HTTP Request
https://api.ddpurse.com/v1/nft/query_user_hold_nft_list
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
user_id | string | 用户id |
Response Body
Param | Type | Description |
---|---|---|
total | int | 记录总数 |
items.badge_code | string | nft id |
items.timestamp | int64 | 时间戳 |
查询NFT持有人
通过铸造者的UCID查询他铸造的NFT当前哪些用户持有
curl --location --request POST 'https://api.ddpurse.com/v1/nft/query_nft_owner
--header 'Authorization: Bearer <APP-ACCESS-TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_id": ""
}'
HTTP Request
https://api.ddpurse.com/v1/nft/query_nft_owner
Request Header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Authorization | String | YES | Authorization: Bearer APP-ACCESS-TOKEN , Oauth2 token |
Request Body
Param | Type | Description |
---|---|---|
user_id | string | 铸造者的用户ID |
Response Body
Param | Type | Description |
---|---|---|
total | int | 记录总数 |
items.badge_code | string | nft id |
items.owner | string | 持有者用户ID |
items.timestamp | int64 | 时间戳 |
items.autopay | bool | 是否在自动支付钱包 |
SDK、库、工具
打点团队提供了以下资源来帮助您快速集成和运行。开源代码可以在我们的GitHub上找到。
提供这些库是为了您的方便和参考,它们没有经过像我们的核心产品一样严格级别的测试和审核。如果在production环境中使用,请仔细阅读源代码,了解它,并自行承担风险。
非常欢迎您提交PR。
Go SDK
将github.com/dotwallet/dotwallet-go-sdk添加至你的工程,更加快捷方便的调用打点团队开放平台的接口
本库包含了示例代码以供参考。
JavaScript 组件
将@dotwallet/js库放入你的前端、并快速实现登录和付款功能。
该库可以以<script>
标签或者node import方式集成。
该库包含登录和付款按钮的svg图像。
注意:您仍将需要一个后端服务器来对您的交易进行身份验证。您的
client_secret
不能在客户端使用。可以使用我们提供的node.js sdk或我们的Docker 微服务镜像快速设置服务器。
Vue 组件
这个Vue.js组件库 的原理与前面javascript库类似,但在Vue.js应用中使用起来更加方便
注意:您仍将需要一个后端服务器来对您的交易进行身份验证。您的
client_secret
不能在客户端使用。可以使用我们提供的node.js sdk或我们的Docker 微服务镜像快速设置服务器
Node.js SDK
一个node.js SDK,用于快速集成服务器,使用打点开放平台的API进行登录,支付和其他区块链服务。
该SDK自动处理user和app访问token的刷新,并提供常见的错误处理。
本库提供了express.js示例,但该SDK可轻松应用于任何Node.js服务器框架。
Docker微服务服务器
打点身份验证轻量服务器微服务镜像。
可以在我们实时跑行的测试服务器 上尝试http请求,也可以在它自动生成的API文档上了解请求选择和规范。
如果想极速地集成打点功能,该微服务是一个优秀的选择,可以在几分钟之内成功将它在云服务提供商上运行。
如果您的后端使用的是我们没有SDK的语言(目前只有Node.js),那么这微服务可能是个不错的选择。如何将微服务的身份验证token转发到您的主要后端服务器,请参见readme文件。
教程
A collection of tutorials for using DotWallet for Developers APIs. Most of the code for these examples can be found at our Github
纯JavaScript(无SDK、库)
这个简单的教程能教你怎么在一个app里快速集成打点钱包的用户登录和单笔支付功能。示例是用JavaScript。可以参考这些例子的更完整的版本(包括错误处理等)在这里。
获取开发人员密钥
首先,在打点开放平台进行注册,以申请CLIENT ID和CLIENT SECRET。
单击打点开放平台主页右上角的“立即入驻”按钮。完成后,登录并单击导航栏中的“应用程序”,然后单击该页面上的“ +创建应用”。CLIENT ID和CLIENT SECRET将发送到您提供的电子邮件中。
将“使用打点登录”添加到您的应用中
登录按钮
在您的应用前端添加一个简单的按钮,并将其包装在一个链接中,该链接会将浏览器跳转到打点的身份验证屏幕。
<a id="login-link" >
<img src="src/assets/dotwallet-login.png" alt="dotwallet-login" />
</a>
<!-- 下一步会需要uuid或者其他的随机字符串的生成方式 -->
<!-- <script src="https://unpkg.com/uuid@latest/dist/umd/uuidv4.min.js"></script> -->
const scope = encodeURIComponent('user.info autopay.bsv autopay.btc autopay.eth'); // scope是我们想要询问用户的权限
const redirectURI = encodeURIComponent(`${YOUR_APP_URL}/your-login-landing-page`);
const loginState = uuidv4(); // 'state'应该是一个随机字符串。用于确认登录请求是否来自同一来源,并避免csrf攻击
localStorage.setItem('loginState', loginState); // 保存好“状态”为了之后对比
const loginURL = `https://api.ddpurse.com/authorize?client_id=${YOUR_CLIENT_ID}&redirect_uri=${redirectURI}&response_type=code&state=${loginState}&scope=${scope}`; // 构造链接
document.getElementById('login-link').href = loginURL;
从我们的UI资源页面下载按钮图像
本地开发说明
“redirect_uri”不能用“localhost” 为了进行本地开发,请在terminal中输入以下命令来找到您机器的IP:
ifconfig | grep netmask
您会得到这样的结果
inet 127.0.0.1 netmask 0xff000000
inet 192.168.1.142 netmask 0xffffff00 broadcast 192.168.1.255
使用 192.168.1.142
+ 您的端口号和路由作为 redirect_uri
, 例: http://192.168.1.142:3000/auth/
登录到您的DotWallet for Developers帐户,然后单击“查看”应用程序。选择您的应用程序,然后在“展示信息”,单击编辑按钮,然后将您的域添加到“应用回调域名”字段。不要添加http,因此在这种情况下,只需添加192.168.1.142:3000/auth/
。确保单击保存,然后刷新页面以确保已保存。
获取code
,核对state
用户批准后,浏览器将被跳转到您提供的redirect_uri
并携带code
和state
作为查询参数。
const urlParams = new URLSearchParams(window.location.search);
const state = urlParams.get('state');
const code = urlParams.get('code');
const savedState = localStorage.getItem('loginState');
if (state != savedState) { // 如果状态与步骤1相同...
alert('error validating request');
} else {
fetch(`${YOUR_BACKEND_SERVER}/auth`, { // ...那么将代码发送到您的后端服务器
method: 'POST',
body: JSON.stringify({ code }),
headers: {
'Content-type': 'application/json; charset=UTF-8',
},
});
}
获取用户访问token(从后端)
警告:这必须从您的后端服务器完成。不要泄露CLIENT ID和CLIENT SECRET,请记住使用.env文件,并且永远不要将秘钥上传到GitHub。
假设我们有这个简单的Express.js服务器:
const express = require('express');
const axios = require('axios');
const path = require('path');
const dotenv = require('dotenv');
const app = express();
const PORT = process.env.PORT || 3000;
const YOUR_CLIENT_SECRET = process.env.CLIENT_SECRET;
const YOUR_CLIENT_ID = process.env.CLIENT_ID;
const DOTWALLET_API = 'https://api.ddpurse.com/v1'
// ...
// 路由逻辑将在这里
// ...
app.listen(PORT, () =>
console.log(`DotWallet example app listening at PORT: ${PORT}`)
);
创建一个POST
端点来接受代码。
app.post('/auth', async (req, res) => {
const data = {
client_id: YOUR_CLIENT_ID,
client_secret: YOUR_CLIENT_SECRET,
grant_type: 'authorization_code',
code: code,
redirect_uri: `${YOUR_APP_URL}/your-login-landing-page`, // 必须与第一步中的URL相同
};
const accessTokenRequest = await axios.post(`${DOTWALLET_API}/oauth2/get_access_token`, data);
const userAccessToken = accessTokenRequest.data.data.access_token
// 通过user_access_token,我们可以查找用户的个人资料信息:
if (userAccessToken) {
const options = {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${accessToken}`,
},
method: 'POST',
};
const userInfoRequest = await axios(`${DOTWALLET_API}/user/get_user_info`, options);
const userInfo = userInfoRequest.data.data
}
});
成功!您已确认用户的身份。基于user.info autopay.bsv autopay.btc autopay.eth
权限,您已被授予获取用户的基本个人资料信息的权限,并可以替用户执行自动付款。
添加付款按钮
制作一个简单的按钮:
<button id="banana-button" type="button">546 satoshis</button>
546聪是最低付款金额
创建订单并发送到后端
在脚本中处理按钮的单击,然后创建一个带有您的付款单详细信息的对象。
将订单详细信息发送到您的后端。从您的后端会把订单详细信息发送到打点的API,换取订单IDorder_sn
。
document.getElementById('banana-button').addEventListener('click', async () => {
const orderData = {
out_order_id: uuidv4(),
coin_type: 'BSV',
to: [
{
type: 'address',
content: '1L3z6DzHpfr7pkkZmKfVGMjwY1984D5YRv', // 用您的钱包地址替换!!!!
amount: 546,
},
],
product: {
id: uuidv4(),
name: 'bananas',
},
notify_url: YOUR_SERVER_URL + '/payment-result',
redirect_uri: window.location.href,
};
const orderSnResponse = await fetch(
YOUR_SERVER_URL + '/create-order',
{
method: 'POST',
body: JSON.stringify(orderData),
headers: {
'Content-type': 'application/json; charset=UTF-8',
},
}
);
const orderSnData = await orderSnResponse.json();
// 当我们的后端返回order_sn时,构造跳转链接,让用户确认付款:
window.location.href = `${DOTWALLET_API}/v1/transact/order/apply_payment?order_id=${orderSnData.order_sn}`;
}
获取 API 访问 token (从后端)
开发人员/应用程序身份验证是大多数打点开放平台API接口的先决条件。使用您的client_secret和client_id获取身份验证token access_token
。
let appAccessToken = '';
async function getAppAccessToken() {
const data = {
client_id: YOUR_CLIENT_ID,
client_secret: YOUR_CLIENT_SECRET,
grant_type: 'client_credentials',
};
const accessTokenRequest = await axios.post(`${DOTWALLET_API}/oauth2/get_access_token`, data);
appAccessToken = accessTokenRequest.data.data.access_token;
}
将订单发送到DotWallet(从后端)
这将使用您的密钥,必须从后端服务器端完成。
设置我们的Express.js应用接口,以接收订单并将其发送到打点开放平台,换取order_sn
。
app.post('/create-order', async (req, res) => {
const options = {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${appAccessToken}`,
},
method: 'POST',
data: { ...orderData },
};
const orderSnResponse = await axios(`${DOTWALLET_API}/transact/order/create`, options);
const orderSn = orderSnResponse.data.data;
res.json({ order_sn: orderSn })
});
完事!您的应用现在可以处理登录和基本付款功能。
错误说明
DotWallet Api 可能返回的 Http 状态码:
Http 状态码 | 说明 |
---|---|
403 | 禁止访问 |
404 | 资源不存在 |
500 | 服务内部错误 |
502 | 网关错误 |
503 | 服务暂时不可用,请稍后重试 |
504 | 网关超时 |
DotWallet Api 可能返回的 code
业务错误码:
code | 说明 |
---|---|
75000 | 无效的 access token |
联系我们
可以通过以下方式联系 DotWallet 官方以获取支持: Email: developers@dotwallet.com Telegram: https://t.me/mempool_developer