协议规则
传输方式:采用HTTP传输(生产环境建议HTTPS)
提交方式:采用POST/GET方式提交
字符编码:UTF-8
签名算法:MD5
签名算法
第一步:
设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 参数名区分大小写;
◆ 验证调用返回或支付中心主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
第二步: 在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
待签名值
:pid=1001&money=2.0&out_trade_no=P12312321123&type=TRC20&name=test&returnUrl=同步地址¬ifyUrl=异步地址&isHtml=1&key=EWEFD123RGSR
签名结果
:5E0AA05DD4BB4FE5AB65608123EBA591
最终请求支付系统参数
:pid=1001&money=2.0&out_trade_no=P12312321123&type=TRC20&name=test&returnUrl=同步地址¬ifyUrl=异步地址&isHtml=1&sign=5E0AA05DD4BB4FE5AB65608123EBA591
发起订单
接口地址:https://token123.cc/pay/create_order
请求参数:
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
商户ID | pid | 是 | int | 1001 | 系统分配的商户ID |
订单号 | out_trade_no | 是 | String(80) | USDT202309081750 | 商户生成的订单号 |
金额 | money | 是 | String | 1001 | 支付金额 |
商品名称 | name | 否 | String | 测试订单 | 商品名称 |
类型 | type | 是 | String | TRC20 | 订单类型(目前只支持TRC20) |
异步通知地址 | notifyUrl | 是 | String | https://自己网站/notify_url.php | 服务器异步通知地址 |
同步跳转地址 | returnUrl | 是 | String | https://自己网站/return_url.php | 页面跳转地址 |
isHtml | isHtml | 否 | int | 1 | 1跳转支付页面2返回订单信息(json) |
签名 | sign | 是 | String | 32位MD5签名值 | 签名值,详见签名算法 |
PHP示例:
$data = array(
//商户ID
'pid' => $pid,
//商户订单号
"out_trade_no" => rand(111111111,999999999).time(),
//自定义参数
"name" => '租号陪玩',
//订单金额
"money" => rand(11,99),
//通道类型
'type' => 'TRC20',
//同步跳转地址
"returnUrl" => $_SERVER['REQUEST_SCHEME']."://". $_SERVER['HTTP_HOST'] . '/user',
//异步通知地址
"notifyUrl" => $_SERVER['REQUEST_SCHEME']."://". $_SERVER['HTTP_HOST'] . '/pay/Notify.php',
//1=跳转支付页面 2=返回订单信息
'isHtml' => 1
);
//参数名ASCII码从小到大排序(字典序)
ksort($data);
//构建URL查询字符串
$http = http_build_query($data);
//生成签名
$data['sign'] = md5($http.'&key=商户秘钥');
//发起订单
header("location:网关地址?".http_build_query($data));
exit;
查询订单
接口地址:https://token123.cc/pay/check_order
请求参数:
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
商户ID | pid | 是 | int | 1001 | 系统分配的商户ID |
订单号 | out_trade_no | 是 | String(80) | USDT202309081750 | 商户生成的订单号 |
回调通知
通知参数:
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
商户ID | pid | 是 | int | 1001 | 系统分配的商户ID |
系统订单号 | trade_no | 是 | String | 1 | 系统生成的订单号 |
商户订单号 | out_trade_no | 是 | String | USDT202309081750 | 商户提交的订单号 |
金额 | money | 是 | String | 1001 | 支付金额 |
商品名称 | name | 是 | String | 测试订单 | 商品名称 |
类型 | type | 是 | String | TRC20 | 订单类型(目前只支持TRC20) |
签名 | sign | 是 | String | 32位MD5签名值 | 签名值,详见签名算法 |
PHP示例:
$data = array(
'pid' => $_GET['pid'],
'trade_no'=>$_GET['trade_no'],
'out_trade_no'=>$_GET['out_trade_no'],
'name'=>$_GET['name'],
'type'=>$_GET['type'],
'money'=>$_GET['money']
);
//参数名ASCII码从小到大排序(字典序)
ksort($data);
//构建URL查询字符串
$http = http_build_query($data);
//生成签名
$_sign = md5($http.'&key=商户秘钥');
//验证签名
if($_GET['sign'] == $_sign){
echo "success";
}else{
echo "签名验证失败";
}
返回结果
商户收到通知请求后,需返回字符串success给系统,系统收到success表示通知成功,商户返回非success则表示通知失败