2026/03/17
| Release Date | Description of Product | Version |
|---|---|---|
| 2026/03/17 | Version V1.0 has been released, supporting automatic aggregation, displaying payment addresses via QR codes, and automated strategies for dynamic payment addresses. | V1.0.0 |
Integration process
Environment Setup
- Activate Merchant Account and Obtain API Keys
- Complete merchant account setup and configuration in the operations/management backend.
- Generate the following authentication information in the backend:
AppId: Merchant Application IDAppSecret: Merchant Application Secret (Server-side only, must not be disclosed)ApiKey: Used for basic authentication and access control
- Configure IP whitelist (Recommended to only allow merchant server egress IP).
- Select Environment and Complete Connectivity Test
- Use the development environment for integration testing and verification.
- After successful testing, switch to the production environment.
- Integrate Core APIs
- Order Management: Create Order, Query Order, Query Reconciliation Statement.
- Refund Management: Create Refund, Query Refund.
- Integrate Callback Notifications (Webhook)
- Configure Order/Refund Status Notification URL in the merchant backend.
- Implement the notification processing interface, supporting:
- Verify Signature (Required)
- Idempotent Processing (Required)
- Retry Reception
- Integration Testing and Go-Live
- Perform integration testing according to business scenarios (e.g., placing an order, successful payment, timeout cancellation, successful/failed refund).
- After small-scale verification in the production environment, gradually increase traffic.
Basic Environment
- Base URL
- Development environment:
https://acquiring.dev.rdezlink.tech - Production environment: Use the address provided by operations before go-live (example:
https://acquiring.xxx.com)
- Development environment:
- Protocol and format
- Protocol: HTTPS
- Data format: JSON
- Character encoding: UTF-8
- API version: v1 (reflected in the URL as
/api/v1/...)
- Standard for amount fields (important)
- All fields related to amounts, fees, balances, etc. must be transmitted as strings in JSON to avoid precision loss.
- For example:
"amount": "100.00" - Do not use
"amount": 100.00
Authentication Security
Authentication Method and Signature Mechanism (Mandatory): All API requests must be made via HTTPS and include the following fields in the header for authentication and tamper-proof verification: Request Header Fields:| Field Name | Type | Required | Description |
|---|---|---|---|
X-Api-Key | String | yes | Merchant API Key (Platform Assignment) |
X-App-Id | String | yes | Merchant Application Identifier |
X-Timestamp | String | yes | Timestamp (milliseconds, 13 digits), used to prevent replay attacks. |
X-Nonce | String | yes | Random string, recommended length ≥ 16 |
X-Signature | String | yes | Request Signature (HMAC-SHA256) |
- Concatenate the following items in order into a string
signPayload:- HTTP method (uppercase, e.g.,
POST) - Request path (without domain, e.g.,
/api/v1/order/create) X-App-IdX-TimestampX-Nonce- Request body raw JSON string (remove extra spaces, keep it exactly as actually sent)
- HTTP method (uppercase, e.g.,
- Use
AppSecretas the key to perform HMAC-SHA256 onsignPayload; output the result as hexadecimal or Base64, which becomesX-Signature. - The platform server will verify the signature using the same rules:
X-Timestamp is within the allowed time window (for example ±5 minutes).
Verify X-Nonce has not been reused (platform stores nonces for deduplication to prevent replay attacks).
Verify X-Signature is correct.
Example pseudocode (for illustration only):
IP Whitelist
Supports IP whitelist configuration in the following formats (set in the merchant management backend):- Single IP:
192.168.1.100 - Multiple IPs:
192.168.1.100,192.168.1.110,192.168.1.120
- Only allow access from the merchant server’s egress IP to prevent exposing the API Key to the frontend or uncontrolled environments.
- Avoid directly calling interfaces in environments such as browsers and mobile devices.
code:response code, 0000 indicates success, non-0000 indicates failure.msg: Response message with a brief error reason.data: The content of the business data.traceId: Request a trace ID for easy troubleshooting (please provide this when troubleshooting with the platform).
| code | Description |
|---|---|
| 0000 | Success |
| 1000 | The user does not exist |
| 1010 | Authentication failed |
| 1015 | The order does not exist |
| 1020 | Risk control refuses |
| 3001 | Invalid wallet address format |
| 3002 | This blockchain network is not supported at this time |
| 3003 | The balance is not enough to cover on-chain gas fees |
| 3004 | Create orders repeatedly |
| 3005 | The refund amount exceeds the refundable amount of the order |
| 3006 | The order has expired and cannot be paid |
Order Management
Create Order
Create a new billing order and generate a payment address and checkout URL.- URL:
POST /api/v1/order/create - Content-Type:
application/json
| Field Name | Type | Maximum Length | Required | Description |
|---|---|---|---|---|
bizNo | String | 128 | yes | Merchant business order number, used for idempotency control, unique within the same merchant. |
amount | String | 64 | yes | Order amount, must be greater than 0, minimum “0.01”. |
currency | String | 8 | yes | Order currency, please use USD currently. |
expireSeconds | Integer | 4 | no | Order expiration time (seconds). If not provided, the system default value will be used (e.g., 600 seconds). |
userInfo | Object | - | Conditional | User information; required when the order amount is ≥ 1000 USD. |
productInfo | Object | - | yes | Product information |
returnUrl | String | 256 | yes | Front-end notification URL for order status (used when the front-end needs to be aware of status changes). |
userInfo Field Description:
| Field Name | Type | Maximum Length | Required | Description |
|---|---|---|---|---|
clientId | String | 64 | yes | Merchant-side user identification |
name | String | 128 | yes | User name |
address | String | 512 | yes | User address information |
certType | String | 32 | no | Document type |
certNo | String | 32 | no | ID number |
email | String | 128 | no | User email |
phone | String | 32 | no | User mobile phone number |
productInfo Field Description:
| Field Name | Type | Maximum Length | Required | Description |
|---|---|---|---|---|
productName | String | 128 | yes | Product Name |
productLink | String | 512 | no | product Link |
quantity | Integer | 11 | no | Purchase Quantity |
description | String | 1024 | yes | Product Description |
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
orderId | String | 64 | System Order ID |
bizNo | String | 128 | Merchant Business Order Number |
amount | String | 64 | Order Amount (in string format) |
status | String | 16 | Order Status, see “Order Status Description” |
expireTime | Date | - | Expiration Time (in ISO8601 format) |
receiveAddress | List | - | Receiving Address List (multiple records will be returned for multi-chain and multi-currency scenarios) |
cashierUrl | String | 256 | Cashier URL (can be redirected to this page to complete payment) |
receiveAddress Field Description:
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
address | String | 64 | Wallet Address |
chain | String | 16 | Chain Type (e.g., ETH / TRX / SOL / POLYGON) |
tokenCurrency | List<String> | - | Supported Token Currencies (e.g., [“USDT”]) |
Multi-chain Payment Instructions:Response Example
- The system supports returning multiple receiving addresses (for different chains/currencies).
- It is recommended that the merchant’s front end, when displaying at the checkout, guide users to select only one chain to complete the payment, avoiding splitting it into multiple transactions.
- By default, the system accumulates the received amounts on an order basis. When the cumulative amount of multiple valid receipts under the same order reaches or exceeds the expected amount, the payment can be considered successful. For other strategies, please confirm with the platform.
Query Order
Query order details based on the system order ID.- URL:
POST /api/v1/order/query - Content-Type:
application/json
| Field Name | Type | Maximum Length | Required | Description |
|---|---|---|---|---|
orderId | String | 64 | yes | System Order ID |
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
orderId | String | 64 | System Order ID |
bizNo | String | 128 | Merchant Business Order Number |
orderAmount | String | 64 | Order Amount (String) |
actualAmount | String | 64 | Actual Received Amount (String) |
currency | String | 8 | Order Currency |
chain | String | 16 | Chain Type |
receiveCurrency | String | 16 | Receiving Currency |
receiveAddress | String | 64 | Receiving Address |
txHash | String | 64 | Blockchain Transaction Hash |
status | String | 16 | Order Status |
orderTime | Date | - | Order Time |
finishTime | Date | - | Completion Time |
| Status | Description |
|---|---|
PENDING | Pending Payment |
AMOUNT_MISMATCH | Amount Mismatch |
PAY_SUCCESS | Payment Successful |
PAY_FAILED | Payment Failed |
TIMEOUT | Timed Out |
COMPLETED | Settled |
REFUNDED | Refunded |
Query Statement
Query order reconciliation information by paging according to the order placement time range.- URL:
POST /api/v1/order/queryRecon - Content-Type:
application/json
| Field Name | Type | Maximum Length | Required | Description |
|---|---|---|---|---|
startTime | Date | - | yes | Query start time (inclusive), based on the order placement time. |
endTime | Date | - | yes | Query end time (exclusive), based on order placement time. |
pageId | Int | 11 | yes | Page number, starting from 1. |
pageSize | Int | 11 | yes | Page size, maximum 1000 entries. |
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
total | Int | 11 | Total number of orders |
orderList | List\<Object> | - | Statement List |
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
orderId | String | 64 | System Order ID |
bizNo | String | 128 | Merchant Business Order Number |
orderAmount | String | 64 | Order Amount |
actualAmount | String | 64 | Actual Received Amount |
currency | String | 8 | Order Currency |
chain | String | 16 | Chain Type |
receiveCurrency | String | 16 | Receiving Currency |
receiveAddress | String | 64 | Receiving Address |
txHash | String | 64 | Blockchain Transaction Hash |
status | String | 16 | Order Status |
orderTime | Date | - | Order Placement Time |
finishTime | Date | - | Payment Completion Time |
settleTime | Date | - | Settlement Time |
settleAmount | String | 64 | Settlement Amount |
feeList | List | - | Fee Details List |
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
feeAmount | String | 64 | Fee Amount |
feeCurrency | String | 16 | Fee Currency |
feeType | String | 16 | Fee Type: WITHDRAW_FEE |
Refund Management
Create Refund
Create a refund request for a specified order, supporting full or partial refunds (actual capabilities are subject to platform configuration). To prevent fund theft, refunds will be returned to the original payment method.
- URL:
POST /api/v1/refund/create - Content-Type:
application/json
| Field Name | Type | Maximum Length | Required | Description |
|---|---|---|---|---|
orderId | String | 64 | yes | Original Order ID |
reason | String | 512 | yes | Refund Reason |
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
refundId | String | 64 | Refund ID |
orderId | String | 64 | Original Order ID |
refundAmount | String | 64 | Refund Amount |
feeAmount | String | 64 | Refund Fee Amount |
currency | String | 8 | Currency Type |
status | String | 16 | Refund Status, find more |
Query Refund
Query refund information by Refund ID or Order ID.- URL:
POST /api/v1/refund/query - Content-Type:
application/json
refundId or orderId must be provided, and only one can be provided.
| Field Name | Type | Maximum Length | Required | Description |
|---|---|---|---|---|
refundId | String | 64 | no\* | Refund ID (choose either this or orderId) |
orderId | String | 64 | no\* | Original order ID (choose either this or refundId) |
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
refundId | String | 64 | Refund ID |
orderId | String | 64 | Original Order ID |
refundAmount | String | 64 | Refund Amount |
feeAmount | String | 64 | Refund Fee Amount |
currency | String | 8 | Currency |
chain | String | 16 | Chain Type |
toAddress | String | 64 | Refund Target Address |
txHash | String | 64 | Blockchain Transaction Hash |
status | String | 16 | Refund Status |
reason | String | 512 | Refund Reason |
| Status | Description |
|---|---|
PROCESSING | Processing |
SUCCESS | Success |
FAILED | Failed |
| Field Name | Type | Required | Description |
|---|---|---|---|
X-App-Id | String | yes | Merchant Application Identifier |
X-Timestamp | String | yes | Timestamp, used to prevent replay attacks |
X-Nonce | String | yes | Random string |
X-Signature | String | yes | Callback signature (HMAC-SHA256) |
Note: The difference here is that the full callback URL path is used, i.e., the complete URL for receiving notifications.Trigger Scenarios
| Trigger Scenario | Description |
|---|---|
| Order Payment Successful | User completes payment, order status changes to PAY_SUCCESS |
| Order Payment Failed | Order is actively canceled, status changes to PAY_FAILED |
| Order Expired | Order not paid within timeout period, system automatically cancels, status is TIMEOUT |
| Refund Successful | Refund processing completed, status changes to SUCCESS |
| Refund Failed | Refund processing failed, status changes to FAILED |
- Request Method:
- URL: Notification URL configured by the merchant
- Method:
POST - Content-Type:
application/json
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
orderId | String | 64 | System Order ID |
bizNo | String | 128 | Merchant Business Order Number |
orderAmount | String | 64 | Order Amount |
actualAmount | String | 64 | Actual Received Amount |
currency | String | 8 | Currency Type |
receiveCurrency | String | 16 | Currency Received on the Chain |
receiveAddress | String | 64 | Address Where Money is Received on the Chain |
chain | String | 16 | Chain Type |
status | String | 16 | Order Status (Consistent with other) |
blockHeight | Long | - | Block Height for On-Chain Verification |
| Field Name | Type | Maximum Length | Description |
|---|---|---|---|
refundId | String | 64 | Refund ID |
orderId | String | 64 | Original Order ID |
refundAmount | String | 64 | Refund Amount |
currency | String | 16 | Currency |
txHash | String | 64 | Blockchain Transaction Hash (using camelCase) |
status | String | 16 | Refund Status (consistent with other) |
blockHeight | Long | - | Block Height |
- The merchant service must return an HTTP
200status code to indicate successful receipt and processing of the notification. - A non-
200status code or timeout will be considered a failure, and the system will retry a certain number of times (the specific strategy is subject to the platform’s actual configuration). - It is recommended to return a unified response format:
Important Requirements:
- The notification processing logic on the merchant side must implement idempotency (for example, deduplication through
orderId/refundId+ status) to avoid duplicate processing of business operations caused by repeated notifications.- Before business processing, signature verification and parameter verification must be performed first, and all requests that fail verification should be rejected.
Best Practice Recommendations
- Idempotency Control
- Use
bizNoto ensure idempotency for order creation: Requests with the samebizNowill return the same order information. - It is recommended to use UUID or a business-unique identifier as
bizNo.
- Use
- Order Status Polling
- The “Query Order” interface can be polled from the frontend or merchant system based on business needs. Set reasonable polling intervals and maximum polling durations to avoid overly frequent requests.
- Callback Notification Handling
- Upon receiving order/refund status notifications, first perform signature verification and parameter validation before proceeding with business processing.
- Implement idempotent logic to ensure that multiple notifications do not result in duplicate deductions or duplicate shipments.
- Error Handling and Troubleshooting
- Determine request success based on the
codefield. In case of failure, troubleshoot usingmsgprompts and business logs. - When troubleshooting with the platform, provide the corresponding
traceId, request time range, and key business information (e.g.,orderId/bizNo).
- Determine request success based on the
- Security Recommendations
ApiKey/AppSecretshould only be used on the server side and not exposed in frontend, mobile, or browser environments.- Configure IP whitelists to restrict access to trusted servers only.
- Use HTTPS throughout to avoid plaintext transmission.
- Regularly rotate keys and promptly update them in server configurations.
Frequently Asked Questions (FAQ) Examples
Q: What should I do if I receive a1010 authentication failure message when creating an order?
Please check:
- Whether the request carries the correct
X-Api-KeyandX-App-Idin the Header; - Whether
X-Timestampis within the allowed time window (not expired); - Whether
X-Nonceis different for each request; - Whether the signature
X-Signatureis generated according to the documentation requirements; - Whether the API Key has been enabled in the backend and is not expired;
- Whether the current request IP is within the configured whitelist range.
- Confirm that the notification URL has been correctly configured in the merchant backend;
- Check whether the merchant service can be accessed from the public network and is not blocked by a firewall;
- Review server logs to confirm whether any requests arrived but returned non-200 status codes or timed out;
- Confirm whether signature verification has been correctly handled (platforms that fail verification will log failures, which can be cross-checked with the platform using
traceId); - Compare status updates using the order/refund query interface.
- Before processing, first check based on
orderId/refundId+ status whether this status has already been processed; if so, return success directly to maintain idempotency.
- It is recommended that the frontend only display and guide users to select one chain to complete payment. If supporting multiple cumulative payments is necessary:
- Confirm with the platform whether amount accumulation across multiple chains/transactions on an order basis is allowed;
- If allowed, establish business rules to consider the order successful once the cumulative amount reaches the expected total, and include transaction details in statements.

