NAV
cURL

介绍

为什么使用打点开放平台

打点开放平台帮助你更简单的使用 Bitcoin SV 的区块链上的基础设施。

用打点开放平台 API,给 APP 添加强大的功能。

使用打点登陆的 APP 可以展示在打点钱包应用市场,引流海量用户量。

登录

你可以为用户提供简单便捷的登录和注册方法。 打点钱包用户可以一键注册你的 APP,非打点钱包用户也可以通过 Facebook,Google,微信,手机或电子邮件立即注册打点钱包。集成后,你可以在打点钱包 应用商场上展示你的 APP,并开始带来大量新用户流量。

请参考 身份授权获取账户信息

收付款

传统应用只能接受来自用户的付款,而不能向用户付款。使用打点开放平台 API 接口,你可以在 APP 和用户之间以及用户和用户之间安排交易。可以轻松设置高级付款选项,例如配置多个接收方,并将交易数据包含在比特币的 OP_RETURN 中。

请参考 订单支付

自动支付功能

提示用户授权你的APP和划转币到自动支付的钱包里去,在余额之内用户不需手动授权每次的付款。除了为用户带来便利之外,这还为基于微交易的 APP 和服务器到服务器用例开辟了新的可能性。使用打点开放平台的先进网络技术,我们 API 上的自动支付可以突破比特币网络的交易限制。

请参考 自动支付

区块链数据存储

将你的用户数据或 APP 数据存储在区块链上的不可篡改记录中,让用户安心他们的重要的数据有安全的备份。这可以用来证明某些数据是在某个时间创建/接收的,并可以用来验证数据的完整性和准确性。有了这个可以是可审核的记录,可以证明奖金支付条件的公平性。

数据上链,可以通过支付,在订单的to参数里的type填写script然后再content参数里附加数据。可以在用户的交易订单附加数据也可以自己注册一个打点钱包自己交上链的费用。详细步骤请参考数据上链订单支付、 和 自动支付

检查区块链

作为比特币采矿业的重要参与者,我们的 Mempool 矿池使我们能够提供有关区块链的最详细和最新的信息。使用我们的查询 API 查询交易和区块链数据,并通过与 Merchant API 的直接连接检查比特币挖矿的状态。

请参考 区块链查询

入门

这个简单的教程能教你怎么在一个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 })
});

完事!您的应用现在可以处理登录和基本付款功能。

规范约定

以下是打点开放平台 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 扣款

第 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 接口文档

用户

获取用户信息

通过用户基础信息 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钱包

订单支付

用打点开放平台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
+to object[] 收款方列表
└ type string 接收方类型,固定值address或者script或者paymail
└ content string 接收方地址或者脚本内容。如果typeaddress,则填写该币种地址;如果typescript,则填写 hex 脚本;如果typepaymail,则添加paymail地址。
└ amount int 金额,单位:聪satoshi(bsv)或者gwei (eth)。最小金额546(BSV, BTC),script和ETH没有最小金额
+product object 商品信息
└ id string 商品的编号
└ name string 商品名称
└ detail string 商品描述
badge_code string badge标识码,填写则代表本次交易为badge交易
subject string 订单标题
notify_url string 支付结果通知地址,notify_urlredirect_uri必填一项
redirect_uri string 支付完成后跳转地址,notify_urlredirect_uri必填一项
expires int 订单过期时间,值为 unix 时间,单位秒,不填或者为0不过期

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

查询订单

# 每次请求,提交正确的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 位置下标

自动支付

自动支付,是 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
user_id string 用户 ID
+to object[] 接收方列表
└ type string 接收方类型,固定值address或者script或者paymail
└ content string 接收方地址或者脚本内容。如果typeaddress,则填写该币种地址;如果typescript,则填写 hex 脚本;如果typepaymail,则添加paymail地址。
└ amount int 金额,单位:聪 satoshi(bsv)或者 gwei (eth)。最小金额 546(BSV, BTC),script和 ETH 没有最小金额
+product object 商品信息
└ id string 商品的编号
└ name string 商品名称
└ detail string 商品描述
subject string 订单标题
notify_url string 支付结果通知地址

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>

参数 是否必须 说明
client_id 开发者应用 ID

获取用户自动支付余额

通过该 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

Response Body

参数名 类型 说明
confirm int 已确认金额
unconfirm int 未确认金额

数据和脚本上链

数据或者脚本可以使用我们平台的订单支付接口或者自动支付接口提交交易。这两个接口的详细介绍请点击链接了解。

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 string badge转移数量,正数表示收入,负数表示支出
└ txid int 交易的txid

Merchant API

Merchant API 是开发者与矿工的桥梁,开发者通过 MAPI 可以实现

查询 Mempool 矿池矿工费率

从矿池中获取最新的矿工费率

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

获取用户 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 未确认数量

SDK、库、工具

打点团队提供了以下资源来帮助您快速集成和运行。开源代码可以在我们的GitHub上找到。

提供这些库是为了您的方便和参考,它们没有经过像我们的核心产品一样严格级别的测试和审核。如果在production环境中使用,请仔细阅读源代码,了解它,并自行承担风险。

非常欢迎您提交PR。

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

错误说明

DotWallet Api 可能返回的 Http 状态码:

Http 状态码 说明
403 禁止访问
404 资源不存在
500 服务内部错误
502 网关错误
503 服务暂时不可用,请稍后重试
504 网关超时

DotWallet Api 可能返回的 code 业务错误码:

code 说明
75000 无效的 access token

联系我们

可以通过以下方式联系 DotWallet 官方以获取支持: Email: business@boquaninc.com Telegram: https://t.me/mempool_developer