跳到主要内容

创建订单

创建支付订单,为您的客户生成唯一的支付链接。

概述

支付订单定义支付金额、货币和区块链网络。每个订单生成一个唯一的支付链接,客户可以使用该链接完成支付。

快速开始

const order = await client.orders.create({
merchantOrderId: `order-${Date.now()}`,
chainCode: 'erc20',
coinCode: 'usdt',
amount: 0.01,
callBackUrl: 'https://your-site.com/api/webhook',
frontendCallbackUrl: 'https://your-site.com/payment/success',
});

console.log('Payment URL:', order.paymentUrl);

订单创建流程

必需参数

参数类型描述示例
merchantOrderIdstring您系统中的唯一订单 ID"order-123"
chainCodestring区块链网络代码"erc20""polygon-erc20"
coinCodestring货币代码(区分大小写)"usdt""usdc"
amountdecimal支付金额(最小值 0.01)0.011.5

可选参数

参数类型描述何时使用
callBackUrlstring支付通知的 Webhook URL始终推荐
frontendCallbackUrlstring支付后的重定向 URL用于客户重定向
receiptAddressstring自定义接收地址如果不使用默认地址
splitterAddressstring自定义智能合约地址高级用例

分步指南

步骤 1:选择链和货币

首先,查询可用选项:

// 获取支持的链
const chains = await client.config.getChains();

// 获取链的支持代币
const tokens = await client.config.getTokens('erc20');

常见组合

  • Ethereum + USDT:chainCode: "erc20"coinCode: "usdt"
  • Polygon + USDC:chainCode: "polygon-erc20"coinCode: "usdc"
  • TRON + USDT:chainCode: "tron-trc20"coinCode: "usdt"

步骤 2:设置支付金额

重要

  • 最小值:0.01
  • 格式:基础单位(例如,0.01 表示 0.01 USDT,不是 10000
  • 精度:四舍五入到 2 位小数
// ✅ 正确
amount: 0.01 // 0.01 USDT

// ❌ 错误
amount: 10000 // 这将是 10,000 USDT!

步骤 3:生成商户订单 ID

要求

  • 每个商户必须唯一
  • 最多 255 个字符
  • 使用描述性格式

好的示例

`order-${Date.now()}`
`payment-${userId}-${timestamp}`
`${productId}-${orderNumber}`

不好的示例

`order-1`  // 不唯一
`test` // 不描述性

步骤 4:配置回调

后端 WebhookcallBackUrl):

  • 接收支付状态更新
  • 必须使用 HTTPS
  • 应验证签名

前端重定向frontendCallbackUrl):

  • 客户支付后重定向到这里
  • 可以包含订单参数
  • 应显示成功/失败页面

步骤 5:创建订单

try {
const order = await client.orders.create({
merchantOrderId: `order-${Date.now()}`,
chainCode: 'erc20',
coinCode: 'usdt',
amount: 0.01,
callBackUrl: 'https://your-site.com/api/webhook',
frontendCallbackUrl: 'https://your-site.com/payment/success',
});

// 在数据库中存储 order.payOrderId
// 将客户重定向到 order.paymentUrl
window.location.href = order.paymentUrl;
} catch (error) {
console.error('Order creation failed:', error);
}

订单响应

响应字段

{
"code": 0,
"msg": "success",
"data": {
"payOrderId": "01KBZ292SK2GKFK97916F5EC3B",
"accessSign": "D3DE7E4002057C0EAED1BE2268DA53CC9058DCFC9DCAF50D999AF270A7B033C5",
"merchantOrderId": "order-123"
}
}

支付 URL 构造

构造支付 URL:

https://testnet.hashnut.io/pay?accessSign={accessSign}&merchantOrderId={merchantOrderId}&payOrderId={payOrderId}&chainCode={chainCode}

SDK 方法

const paymentUrl = order.paymentUrl; // SDK 处理构造

订单类型

DeFi 订单

智能合约模式

  • 使用智能合约的地址池
  • 资金保存在合约中直到提取
  • 支持多方费用分配

何时使用

  • 您需要最大安全性
  • 您想要地址池管理
  • 您需要链上验证

CeFi 订单

直接钱包模式

  • 使用您的直接钱包地址
  • 资金直接发送到钱包
  • 简化的资金管理

何时使用

  • 您想要立即访问资金
  • 您更喜欢简单的操作
  • 您不需要地址池

最佳实践

订单 ID 管理

  1. 使用 UUID 或时间戳:确保唯一性
  2. 存储在数据库中:保存 payOrderIdmerchantOrderId 映射
  3. 幂等性:创建前检查现有订单
  4. 格式:使用一致的命名约定

金额处理

  1. 验证最小值:确保金额 >= 0.01
  2. 四舍五入到 2 位小数:避免浮点数问题
  3. 货币精度:考虑代币小数位数(USDT = 6,ETH = 18)
  4. 显示格式:显示用户友好的金额

错误处理

try {
const order = await client.orders.create({...});
} catch (error) {
if (error.code === -2) {
// 认证或参数错误
console.error('Invalid request:', error.msg);
} else {
// 其他错误
console.error('Order creation failed:', error);
}
}

常见用例

电商结账

// 在结账流程中
const order = await client.orders.create({
merchantOrderId: `checkout-${cartId}-${Date.now()}`,
chainCode: 'erc20',
coinCode: 'usdt',
amount: cartTotal,
callBackUrl: `${API_URL}/webhook`,
frontendCallbackUrl: `${FRONTEND_URL}/checkout/success`,
});

// 重定向到支付
router.redirect(order.paymentUrl);

订阅支付

//  recurring payment
const order = await client.orders.create({
merchantOrderId: `subscription-${userId}-${subscriptionId}-${billingCycle}`,
chainCode: 'polygon-erc20',
coinCode: 'usdc',
amount: subscriptionAmount,
callBackUrl: `${API_URL}/webhook/subscription`,
frontendCallbackUrl: `${FRONTEND_URL}/subscription/payment-success`,
});

捐赠/一次性支付

// 简单捐赠
const order = await client.orders.create({
merchantOrderId: `donation-${Date.now()}`,
chainCode: 'erc20',
coinCode: 'usdt',
amount: donationAmount,
callBackUrl: `${API_URL}/webhook`,
frontendCallbackUrl: `${FRONTEND_URL}/thank-you`,
});

订单过期

订单可能会在一段时间后过期。如果支付延迟,请定期检查订单状态。

下一步


订单已创建? 了解订单管理 →