下载

arrow_down

开发者服务

arrow_down

更多

arrow_down
activityactivityactivityactivity
  • themelight
  • languageIcon

  • menu
Skip to Content
Zh CnDocs
Bitget Wallet Pay

Bitget Wallet Pay

Bitget Wallet 提供了便捷又强大的支付能力,本章描述如何从接入唤起 Bitget Wallet Pay 到支付成功。

Bitget Wallet Pay 如何使用?

用户只需输入金额并点击按钮,就可以唤起 Bitget Wallet Pay 进行支付,过程丝滑。

当然,你也可以在站外打开。

接入 Bitget Wallet Pay 流程

Step1: 申请 appId 和 apiSecret

需要先申请拿到 appIdapiSecret,用于创建支付和加密相关。

Step2: 接口签名

实现接口签名才能正确访问 Pay 服务。

算法描述

参与签名的字段分别是:

  • apiPath:URI(必须
  • body:请求体(必须),JSON 字符串
  • x-api-key:同appId必须
  • x-api-timestamp:当前时间戳,单位毫秒(必须
  • 其他在 URI 中的参数

按照以下步骤实现:

  1. 将以上所有参数的名称和值放入contentMap,对contentMapkey进行升序排序
  2. contentMap进行 JSON 序列化
  3. 使用SHA256算法对 JSON 字符串+密钥进行加密
  4. 最后对加密结果进行BASE64编码,得到的结果就是签名字符串

如以下示例:

curl -H 'x-api-key: key' \ -H 'x-api-timestamp: 1744636844000' \ -H 'x-api-signature: 0xb7Kxxxx=' \ 'https://{HOST}/path/to/pay?param1=test1&param2=test2' \ -d '{"data":"test"}'

JSON 序列化后的contentMap如下:

{ "apiPath": "/path/to/pay", "body": { "data": "test" }, "param1": "test1", "param2": "test2", "x-api-key": "key", "x-api-timestamp": "17200001" }

最后对这个 JSON 字符串进行加密。

代码实现

import crypto from "crypto"; /** * 生成所需签名 * @param {string} appId - 应用ID * @param {string} apiSecret - API密钥 * @param {string} pathUrl - 完整的URL路径(包含查询参数) * @param {string} payload - 请求体字符串 * @param {number} tm - 时间戳(毫秒) * @returns {string} - Base64 编码的签名字符串 */ function genSign(appId, apiSecret, pathUrl, payload, tm) { let path = ""; const contentMap = {}; try { const url = new URL( pathUrl.startsWith("https") ? pathUrl : `https://api.paydify.com${pathUrl}` ); path = url.pathname; for (const [key, value] of url.searchParams) { if (value) { contentMap[key] = value; } } } catch (err) { const parts = pathUrl.split("?"); path = parts[0]; if (parts[1]) { const queryParams = new URLSearchParams(parts[1]); for (const [key, value] of queryParams) { if (value) { contentMap[key] = value; } } } } contentMap["x-api-key"] = appId; contentMap["x-api-timestamp"] = tm.toString(); // 毫秒 contentMap["apiPath"] = path; contentMap["body"] = payload; const keys = Object.keys(contentMap).sort(); const orderedMap = {}; keys.forEach((key) => { orderedMap[key] = contentMap[key]; }); const content = JSON.stringify(orderedMap); const mac = crypto.createHmac("sha256", apiSecret); mac.update(content); return mac.digest("base64"); } // 使用示例 const signature = genSign( "A123456", "ABC123", "/path/to/pay?param1=test1&param2=test2", '{"data":"test"}', Date.now() ); console.log("签名:", signature);

Step3: 创建支付订单

用户下单或扫码支付等场景,接入方可以参考以下代码创建订单进行跳支付。

// 假设你已有以下变量: const appId = "你的appId"; const mchTxnId = "接入方订单ID"; const url = "https://api.paydify.com/payment/payin/v1/createPayment"; const signature = "签名"; const requestBody = { appId, mchTxnId, txnAmount: "100.23", currency: "USDT", checkoutMode: 1, payMethod1: "BGW", }; const bodyString = JSON.stringify(requestBody); fetch(url, { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": appId, "x-api-timestamp": timestamp, "x-api-signature": signature, }, body: bodyString, }) .then((res) => res.json()) .then((data) => { console.log("创建支付返回:", data); if (data.status === 0) { // 可跳转到支付链接 window.location.href = data.data.httplink; } else { console.error("支付失败:", data.msg); } });

在创建订单成功后,会返回 deeplink 和 httplink 两种字段来唤起 Bitget Wallet Pay。那么 deeplink 和 httplink 的区别又是什么。

Step4: 唤起收银台

deeplink 是一个 bitkeep:// 开头的协议,无法通过 href 或 window.open 等方式打开。如果商户在站内,商户可安装 @bitget-wallet/utils 依赖用于跳转 deeplink 唤起收银台。如果商户在站外,需要使用 Bitget Wallet deeplink 唤起 app 并打开收银台。具体 demo 代码如下:

import { transfer } from "@bitget-wallet/utils"; const link = data.deeplink; if (/(BitKeep)/i.test(navigator.userAgent)) { // 站内 transfer(link); } else { // 站外 window.open(`https://bkcode.vip/?deep_link_value=${link}`, "_blank"); }

如果觉得上述步骤麻烦,可以直接使用 httplink 唤起收银台,但是相比 deeplink 会稍慢。

const link = data.deeplink; window.open(link, "_blank");

deeplink

httplink

订单查询

支付提交后会进入订单状态页,实时获取支付结果。

历史订单

在历史订单中查看订单详情。

Preview

各个模块的历史订单入口。

Preview
Preview
PayHome
Preview
Preview
购物中心

扩展

更多细节请看paydify 文档

Last updated on