Bitget Wallet Pay
Bitget Wallet 提供了便捷又强大的支付能力,本章描述如何从接入唤起 Bitget Wallet Pay 到支付成功。
Bitget Wallet Pay 如何使用?
用户只需输入金额并点击按钮,就可以唤起 Bitget Wallet Pay 进行支付,过程丝滑。
当然,你也可以在站外打开。
接入 Bitget Wallet Pay 流程
Step1: 申请 appId 和 apiSecret
需要先申请拿到 appId 和 apiSecret,用于创建支付和加密相关。
Step2: 接口签名
实现接口签名才能正确访问 Pay 服务。
算法描述
参与签名的字段分别是:
apiPath
:URI(必须)body
:请求体(必须),JSON 字符串x-api-key
:同appId
(必须)x-api-timestamp
:当前时间戳,单位毫秒(必须)- 其他在 URI 中的参数
按照以下步骤实现:
- 将以上所有参数的名称和值放入
contentMap
,对contentMap
的key
进行升序排序 - 对
contentMap
进行 JSON 序列化 - 使用
SHA256
算法对 JSON 字符串+密钥进行加密 - 最后对加密结果进行
BASE64
编码,得到的结果就是签名字符串
如以下示例:
curl -H 'x-api-key: key' \
-H 'x-api-timestamp: 1744636844000' \
-H 'x-api-signature: 0xb7Kxxxx=' \
'https://{HOST}/path/to/pay?param1=test1¶m2=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¶m2=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

Preview

Preview
扩展
更多细节请看paydify 文档 。
Last updated on