服务地址:https://api.crossingpay.com
数据格式:JSON
无论是哪种类型的订单,当成功到账后,系统将向 callback
地址发送如下 POST 请求:
{ "Address": "Txxx", "Amount": "100.29", "OrderID": "202505140XXXXXX1259", "SystemOrderID": "20250514XXXX1015", "Txid": "txid哈希", "Status": 1, "Timestamp": "Unix时间戳", "Sign": "签名字符串"}
Address:充值或者提现目标地址;
Amount:充值或者提现金额;
OrderID:商户业务系统订单号
SystemOrderID:钱包系统订单号
Txid:合约txid地址
Status:0失败,1成功,2等待中
Sign:请求签名
1、充值(监听订单、按地址充值订单)回调地址通过相关配置中配置;或者在提交订单时候携带,以订单携带的优先;
2、提现回调地址,是提交订单时携带;
3、订单反查地址,在相关配置中配置;
若 HTTP 状态码为 200,则视为成功
其余状态视为失败,记录日志并尝试重发(由后台触发)
如需查询订单、查看回调日志,请使用管理后台页面进行操作。
为了确保接口回调数据在传输过程中未被篡改,服务端会对参数进行签名,接收方可通过以下算法进行验签。
防止回调参数被第三方篡改
确保数据来源可信、完整性可验证
字段名 | 说明 |
---|---|
address | 钱包地址 |
amount | 金额(字符串,如 "100.00") |
order_id | 商户订单号 |
system_order_id | 系统内部订单号 |
timestamp | Unix 时间戳(秒,字符串) |
tx_hash | 区块链交易哈希 |
将字段按 ASCII 字典序排序后拼接为:
key1=value1&key2=value2...&keyN=valueN
,然后在末尾追加 APIKey
作为密钥。
对拼接后的字符串执行 MD5,加密结果即为 sign
。
import hashlib def generate_sign(params, apikey): params = {k: v for k, v in params.items() if k != "Sign"} sorted_items = sorted(params.items()) query_string = "&".join(f"{k}={v}" for k, v in sorted_items) raw = query_string + apikey return hashlib.md5(raw.encode("utf-8")).hexdigest()
function generate_sign($params, $apikey) { unset($params['Sign']); ksort($params); $query = http_build_query($params, '', '&', PHP_QUERY_RFC3986); return md5($query . $apikey); }
func GenerateSign(params map[string]string, apikey string) string { keys := make([]string, 0, len(params)) for k := range params { if k != "Sign" { keys = append(keys, k) } } sort.Strings(keys) var buf strings.Builder for i, k := range keys { if i > 0 { buf.WriteString("&") } buf.WriteString(k + "=" + params[k]) } buf.WriteString(apikey) hash := md5.Sum([]byte(buf.String())) return hex.EncodeToString(hash[:]) }
const crypto = require('crypto'); function generateSign(params, apikey) { delete params.Sign; const keys = Object.keys(params).sort(); const query = keys.map(k => `${k}=${params[k]}`).join('&'); return crypto.createHash('md5').update(query + apikey).digest('hex'); }