跨越支付 开发文档

回调/签名

概述

  • 服务地址:https://api.crossingpay.com

  • 数据格式:JSON

一、回调通知格式

无论是哪种类型的订单,当成功到账后,系统将向 callback 地址发送如下 POST 请求:

请求内容(JSON)

{  "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,则视为成功

  • 其余状态视为失败,记录日志并尝试重发(由后台触发)


如需查询订单、查看回调日志,请使用管理后台页面进行操作。



二、回调签名算法说明

为了确保接口回调数据在传输过程中未被篡改,服务端会对参数进行签名,接收方可通过以下算法进行验签。

2.1、签名目的

  • 防止回调参数被第三方篡改

  • 确保数据来源可信、完整性可验证

2.2、签名规则

1. 参与签名字段(示例)

字段名说明
address钱包地址
amount金额(字符串,如 "100.00")
order_id商户订单号
system_order_id系统内部订单号
timestampUnix 时间戳(秒,字符串)
tx_hash区块链交易哈希

2. 字段排序与拼接

将字段按 ASCII 字典序排序后拼接为:
 key1=value1&key2=value2...&keyN=valueN,然后在末尾追加 APIKey 作为密钥。

3. 执行 MD5 加密

对拼接后的字符串执行 MD5,加密结果即为 sign

2.3、各语言签名示例

Python

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()

PHP

function generate_sign($params, $apikey) {
    unset($params['Sign']);
    ksort($params);
    $query = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
    return md5($query . $apikey);
}

Go

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[:])
}

Node.js

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');
}