NAV
cURL

介绍

为什么使用打点开放平台

打点开放平台帮助你更简单的使用 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 资源的使用规范,如有任何疑问,可以联系我们的官方支持

协议

HTTP 请求

HTTP 响应

如何判断 HTTP 是否请求成功?

以下为 HTTP 请求成功时的结果

HTTP 200
{
    "code": 0,
    "msg": "",
    "data": {
        "access_token": "YOUR-ACCESS-TOKEN",
        "expires_in": 7200,
        "token_type": "Bearer"
    }
}

必须同时满足以下 2 个条件:

身份认证

# 使用 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,需要先在 DotWallet 开放平台注册开发者账号及创建应用。

使用公私钥签名授权方式请联系我们。

应用授权

应用授权,使用 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 用户的身份,安全的访问用户授权的某些能力。

使用场景:

用户授权流程:

第 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

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>

第 3 步: 客户端通过回调 uri 获取 code

Authorize

授权服务器,将重定向到应用客户端指定回调地址:

# The auth server will redirect to your callback url
curl -L https://YOUR-HOST/YOUR-REDIRECT-URI?code=xxxxx&state=YOUR-STATE-VALUE

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"
  }
}

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不支持)注册账号,然后到账号&安全> 备份钱包导出助记词,再用助记词生成公私钥(详见代码例子)

公私钥算法说明

注意事项

请严格保管您的私钥,避免泄露,私钥泄露,直接关系到个人资产安全。

使用范例

开发者可通过范例代码从助记词生成私钥与公钥、再进行签名

详见代码例子

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)完成交易支付。

单笔订单支付需要用户每次交易手动确认放款。用自动支付,用户只要授权一次然后应用能自行发起交易。

单笔订单支付

订单支付流程:

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_urlredirect_uri必填一项
redirect_uri string 支付完成后跳转地址,notify_urlredirect_uri必填一项
expires int 订单过期时间,值为 unix 时间,单位秒,不填或者为0不过期

接收方类型

type content
address 填写用户收款地址
script 填写 hex 脚本
paymail 填写用户paymail收款地址
user_primary_web 填写收款用户ID,注意:最终款项将打到用户web钱包

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}

Authorize

用户点击构造好的链接后,将跳转到 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 用户的身份,进行自动支付的权限。应用无需每次的支付获取用户授权,只需用户进行一次授权之后可以在余额内自由发起交易。

使用场景: 适合频率高的支付行为,避免让用户一直要跳转到支付确认页面。在抽奖、代付、游戏、微博等场景进行消费时,通常需要向用户获取自动支付的权限;如允许第三方应用代缴水电费、代还信用卡等。

自动支付流程

自动支付接口

# 每次请求,提交正确的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钱包

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,以下为错误码描述与解决方案

开发者可以引导用户跳转到打点自动支付划转页面进行充值,自动支付划转URL:

https://api.ddpurse.com/v1/user/autopay_transfer?redirect_url=<redirect_url>

参数 是否必须 说明
redirect_url 划转后的跳转地址。 必须是url_encoded

开发者可以引导用户跳转到打点自动支付单笔限额设置页面进行限额设置,设置单笔限额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/autopayhttps://api.ddpurse.com/v1/transact/order/create

在request的to数组里的一个object里,script 参数提交 type, 然后在content参数里提交你的数据或者脚本.

使用场景

这可用于验证或存储各种记录和数据。将数据保存在链上可用于提高数据寿命。它可以与时间戳一起使用,以证明某个数据事务在某个时间发生。对于大型数据集,有时最好将数据的哈希值保存在链上,之后可以将哈希与数据进行比较,以验证数据是否已被修改。

数据/脚本格式

确保您的数据/脚本是十六进制编码的字符串。在数据前加上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服务器框架。

GitHub

Docker微服务服务器

打点身份验证轻量服务器微服务镜像。

可以在我们实时跑行的测试服务器 上尝试http请求,也可以在它自动生成的API文档上了解请求选择和规范。

如果想极速地集成打点功能,该微服务是一个优秀的选择,可以在几分钟之内成功将它在云服务提供商上运行。

如果您的后端使用的是我们没有SDK的语言(目前只有Node.js),那么这微服务可能是个不错的选择。如何将微服务的身份验证token转发到您的主要后端服务器,请参见readme文件。

GitHub

教程

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并携带codestate作为查询参数。

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