NAV
go php js java

H5充值

创建订单

$url = "/h5_order/create";
$header = [
  'Content-Type:application/json',
];
$params = [
    "version": "1.0",
    "app_id": "hxgmamt86qk",
    "time": "1663741239",
    "sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
    "amount": "0.0013",
    "currency": "usd",
    "merchant_order_id" :"8MrxIV1lJd",
    "return_url" :"http://xxxx.com",
    "lang" :"en",
    "success_url" :"https://xxx.com/success.html",
    "fail_url" :"https://xxx.com/fail.html",
    "hide_back" : 1,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);

print_r($return);

var url = "/h5_order/create"
data := map[string]any{
    "version": "1.0",
    "app_id": "hxgmamt86qk",
    "time": "1663741239",
    "sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
    "amount": "0.0013",
    "currency": "usd",
    "merchant_order_id" :"8MrxIV1lJd",
    "return_url" :"http://xxxx.com",
    "lang" :"en",
    "success_url" :"https://xxx.com/success.html",
    "fail_url" :"https://xxx.com/fail.html",
    "hide_back" : 1,
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
  fmt.Println(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) }

fmt.Println(string(body))

let HTTP = require('http')
let postData = {
  "version": "1.0",
  "app_id": "hxgmamt86qk",
  "time": "1663741239",
  "sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
  "amount": "0.0013",
  "currency": "usd",
  "merchant_order_id" :"8MrxIV1lJd",
  "return_url" :"http://xxxx.com",
  "lang" :"en",
  "success_url" :"https://xxx.com/success.html",
  "fail_url" :"https://xxx.com/fail.html",
  "hide_back" : 1,
};
let POST_OPTIONS = {
  port: 80,
  host: "api.xxxx.com",
  path: "/shopapi/h5_order/create",
  method: 'POST',
  headers: {
    "Content-Type": "application/json; charset=utf-8"
  }
};

const REQUEST = HTTP.request(POST_OPTIONS,function (res) { let data = [] res.on('data', chunk => { data.push(...chunk) }) res.on('end', () => { let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data))) console.log(_date) }) });

REQUEST.setTimeout(6000) REQUEST.write(JSON.stringify(postData), 'utf8') REQUEST.end()

public static void main(String[] args) {

// 完整实例请查看"签名规则"中的Java示例代码

String baseUrl = "http://api.xxxx.com/shopapi"; String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9"; String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";

rsaSigner signer = new rsaSigner();

Map<String, Object> params = new HashMap<>(); params.put("app_id", "hxgmau9imt86qky9"); params.put("version", "1.0"); params.put("key_version", "admin"); params.put("time", Long.toString(System.currentTimeMillis() / 1000)); params.put("amount","0.0013"); params.put("currency","usd"); params.put("merchant_order_id","8MrxIV1lJd"); params.put("return_url","http://xxxx.com"); params.put("lang","en"); params.put("success_url","https://xxx.com/success.html"); params.put("fail_url","https://xxx.com/fail.html"); params.put("hide_back", 1);

try {

params.put("sign", signer.genSign(params, priKey));

Gson gson = new GsonBuilder().create(); System.out.println("params = " + gson.toJson(params));

String res = doPost(baseUrl + "/h5_order/create", gson.toJson(params)); if (null == res) { throw new RuntimeException("http error"); }

System.out.println("response = " + res);

JsonParser jp = new JsonParser(); JsonObject resEle = jp.parse(res).getAsJsonObject(); boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey); if (!retSignOK) { throw new RuntimeException("verify response sign fail"); }

} catch (Exception e) { e.printStackTrace(); }

System.out.println("OK"); }

返回结果示例:

{
  "status":200,
  "msg":"success",
  "data":{
    "order_no":"BCTOTNI57P",
    "merchant_order_id":"8MrxIV1lJd",
    "amount":"0.0013",
    "currency":"usd",
    "status":0,
    "created_at":1665659047,
    "expires_at":1665660847,
    "addresses":[
      {
        "coin":"usdt_erc20",
        "address":"0x1708F6b16D5437730D410D983B8D0235c345433c",
        "amount":"0.0013"
      },
      {
        "coin":"usdt_trc20",
        "address":"TKzqd9hTDgeeQcHf1RXiCuG6vPPFJK8BDP",
        "amount":"0.0013"
      }
    ],
    "return_url":"https://xxx.com/pay",
    "checkout_url":"http://api.xxxx.com/order/BCTOTNI57P?lang=en"
  },
  "date_time":"2022-10-13 19:04:07",
  "time_stamp":1665659047,
  "sign":"C4XPA9jK32xYngKAEsb1KEQDyOFBD29H1MqfQNSl4jnxvT2RQHdiUtf2TMX96O2Pv0AGHv3EJU89l6k1hHa5arQ6LQUIbD8c/WbpXvhaoWYbhnrPhrVXcHMFlP714W6hmURWXkauySq5VzB8iS+Bb2HAv"
}

HTTP Request

POST : /h5_order/create

请求参数

参数名 必选 类型 说明
公共参数 是 string 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time)
merchant_order_id 是 string 商家⾃定义订单号
amount 是 string 订单⾦额
currency 否 string 法币币种,默认usd,支持:usd, cny, hkd, rub, thb 等,更多请咨询客服
return_url 否 string 返回按钮默认的跳转链接,优先级低于success_url / fail_url
success_url 否 string 支付成功时,返回按钮的跳转链接,优先级高于return_url
fail_url 否 string 支付异常时,返回按钮的跳转链接,优先级高于return_url
hide_back 否 int 隐藏返回按钮:传1隐藏,默认0显示
lang 否 string 语⾔ “en”, “ko”, “zh”

返回参数说明

参数名 类型 说明
status int 状态码
msg string 状态描述
data jsonObject 具体见下面 “data细节说明”。
data.order_no string 订单号
data.merchant_order_id string 商家⾃定义订单号
data.amount string 订单⾦额
data.currency string 法币币种
data.status int 0待⽀付 1已完成 2异常支付 10已取消
data.return_url string 返回地址
data.checkout_url string 收银台地址
data.expires_time int 订单过期时间
data.create_time int 创建时间
data.addresses jsonArray 地址信息
data.addresses.coin string 币名
data.addresses.address string 地址
data.addresses.amount string 应支付币种数额
date_time string 响应时间
time_stamp int 响应时间单位秒
sign string 签名

订单取消

$url = "/h5_order/cancel";
$header = [
  'Content-Type:application/json',
];
$params = [
    "version": "1.0",
    "app_id": "hxgmamt86qk",
    "time": "1663741239",
    "sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
    "order_no": "test123",
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);

print_r($return);

var url = "/h5_order/cancel"
data := map[string]string{
    "version": "1.0",
    "app_id": "hxgmamt86qk",
    "time": "1663741239",
    "sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
    "order_no": "test123",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
  fmt.Println(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) }

fmt.Println(string(body))

let HTTP = require('http')
let postData = {
  "version": "1.0",
  "app_id": "hxgmamt86qk",
  "time": "1663741239",
  "sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
  "order_no": "test123",
};
let POST_OPTIONS = {
  port: 80,
  host: "api.xxxx.com",
  path: "/shopapi/h5_order/cancel",
  method: 'POST',
  headers: {
    "Content-Type": "application/json; charset=utf-8"
  }
};

const REQUEST = HTTP.request(POST_OPTIONS,function (res) { let data = [] res.on('data', chunk => { data.push(...chunk) }) res.on('end', () => { let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data))) console.log(_date) }) });

REQUEST.setTimeout(6000) REQUEST.write(JSON.stringify(postData), 'utf8') REQUEST.end()

public static void main(String[] args) {

// 完整实例请查看"签名规则"中的Java示例代码

String baseUrl = "http://api.xxxx.com/shopapi"; String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9"; String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";

rsaSigner signer = new rsaSigner();

Map<String, Object> params = new HashMap<>(); params.put("app_id", "hxgmau9imt86qky9"); params.put("version", "1.0"); params.put("key_version", "admin"); params.put("time", Long.toString(System.currentTimeMillis() / 1000)); params.put("order_no","test123");

try {

params.put("sign", signer.genSign(params, priKey));

Gson gson = new GsonBuilder().create(); System.out.println("params = " + gson.toJson(params));

String res = doPost(baseUrl + "/h5_order/cancel", gson.toJson(params)); if (null == res) { throw new RuntimeException("http error"); }

System.out.println("response = " + res);

JsonParser jp = new JsonParser(); JsonObject resEle = jp.parse(res).getAsJsonObject(); boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey); if (!retSignOK) { throw new RuntimeException("verify response sign fail"); }

} catch (Exception e) { e.printStackTrace(); }

System.out.println("OK"); }

返回结果示例:

  {
  "status": 200,
  "msg": "success",
  "data": [],
  "date_time": "2020-11-23 16:51:51",
  "time_stamp": 1606121511,
  "sign": "OotOCtyUPfYQFjE+FEPMQQK5PQ2eGJtcvwNBCI0ilTpNn/B9gBtzR+ibmyK00kW/bg=="
}

HTTP Request

POST : /h5_order/cancel

请求参数

参数名 必选 类型 说明
公共参数 是 string 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time)
order_no 是 string 平台订单号

返回参数说明

参数名 类型 说明
status int 状态码
msg string 状态描述
data array 为空
date_time string 响应时间
time_stamp int 响应时间单位秒
sign string 签名

订单详情

$url = "/h5_order/detail";
$header = [
  'Content-Type:application/json',
];
$params = [
    "version": "1.0",
    "app_id": "hxgmamt86qk",
    "time": "1663741239",
    "sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
    "order_no": "JDYFJEEA7T",
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);

print_r($return);

var url = "/h5_order/detail"
data := map[string]string{
    "version": "1.0",
    "app_id": "hxgmamt86qk",
    "time": "1663741239",
    "sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
    "order_no": "JDYFJEEA7T",
}
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
  fmt.Println(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) }

fmt.Println(string(body))

let HTTP = require('http')
let postData = {
  "version": "1.0",
  "app_id": "hxgmamt86qk",
  "time": "1663741239",
  "sign": "nR+UEj2oCup5bhcxrQlJ24+jeq3AMHdnC5BfOxaqCKwE6EcPc1020ogHHcZ0sLeqAg==",
  "order_no": "JDYFJEEA7T",
};
let POST_OPTIONS = {
  port: 80,
  host: "api.xxxx.com",
  path: "/shopapi/h5_order/detail",
  method: 'POST',
  headers: {
    "Content-Type": "application/json; charset=utf-8"
  }
};

const REQUEST = HTTP.request(POST_OPTIONS,function (res) { let data = [] res.on('data', chunk => { data.push(...chunk) }) res.on('end', () => { let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data))) console.log(_date) }) });

REQUEST.setTimeout(6000) REQUEST.write(JSON.stringify(postData), 'utf8') REQUEST.end()

public static void main(String[] args) {

// 完整实例请查看"签名规则"中的Java示例代码

String baseUrl = "http://api.xxxx.com/shopapi"; String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9"; String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2RZZISModRzproL3eTxRtvVK/nToDbeLmAVdmaVtHgNCwjXMeNCZvHySZKO7+t7XySzBd2PhhQjvAkDd8HRKB5Y0uvP6TFwvhxOMkMydTeBFcUobQWNeAI7ttRms1txSNrmyrZr0WpWfk79VIsO+yI/jFN/Pj2gxD+vh5UUKU1LD2IQq/VxgtEpf8Vs6w7SvafPwYkpdPGCKUFkRvN1FrY2+tq0j1MRVJbB2rIunWDnT8cDUh2sWLXf4yNaJVOaaTFB0zbAk/qcoicGQyW7bVG7dVW8WywKmOAPeQCCQa+SJ4BhfI1k8eEAwFVRuxz/f9Ecfog9hZJ+RgELkpS8qhQIDAQAB";

rsaSigner signer = new rsaSigner();

Map<String, Object> params = new HashMap<>(); params.put("app_id", "hxgmau9imt86qky9"); params.put("version", "1.0"); params.put("key_version", "admin"); params.put("time", Long.toString(System.currentTimeMillis() / 1000)); params.put("order_no","JDYFJEEA7T");

try {

params.put("sign", signer.genSign(params, priKey));

Gson gson = new GsonBuilder().create(); System.out.println("params = " + gson.toJson(params));

String res = doPost(baseUrl + "/h5_order/detail", gson.toJson(params)); if (null == res) { throw new RuntimeException("http error"); }

System.out.println("response = " + res);

JsonParser jp = new JsonParser(); JsonObject resEle = jp.parse(res).getAsJsonObject(); boolean retSignOK = signer.verifySign(resEle, resEle.get("sign").getAsString(), pubKey); if (!retSignOK) { throw new RuntimeException("verify response sign fail"); }

} catch (Exception e) { e.printStackTrace(); }

System.out.println("OK"); }

返回结果示例:

{
  "status":200,
  "msg":"success",
  "data":{
    "order_no":"JDYFJEEA7T",
    "merchant_order_id":"8MrxIV1lJd",
    "amount":"0.0013",
    "currency":"usd",
    "status":1,
    "created_at":1664360232,
    "expires_at":1664362032,
    "addresses":[
      {
        "coin":"usdt_erc20",
        "address":"0x1708F6b16D5437730D410D983B8D0235c345433c",
        "amount":"0.0013"
      },
      {
        "coin":"usdt_trc20",
        "address":"TKzqd9hTDgeeQcHf1RXiCuG6vPPFJK8BDP",
        "amount":"0.0013"
      }
    ],
    "payments":[
      {
        "coin":"usdt_trc20",
        "address":"TKzqd9hTDgeeQcHf1RXiCuG6vPPFJK8BDP",
        "txid":"422a7eef6af75960efa3e204fee1e642caf0b7d25dccd2678d6ae4e086733096",
        "amount":"0.0013",
        "confirm_time":1664360357,
        "status":1,
        "check_status":0
      }
    ],
    "return_url":"https://xxx.com/pay"
  },
  "date_time":"2022-10-13 19:24:26",
  "time_stamp":1665660266,
  "sign":"ERROp+Kr46ZjjGlIVcNXT0iEpvh8KCyfJNGax3gA5qdfa4Gw+k8qdKoJl+FYBHQsarlsaush8b5uhjFbbJQc7BxvEi+CvbAVm1CkqBITPZHNNr4B3dDBWkn3Fk0m+OLGvW+JB7ueDKy+rzwaFsHw46CIcFBRAdasfieQRqu9TuO+Y4IpFaROxDoicXQLMN28PReVLxAqwAxkZW16ujnviSOHlHlbO+CIxCrKRqZISnUKY8q9Ej649BtE1s0mFwCd9HJ0Ti5oawHAGvwhcw++aEh2cCKMNJ1ICZVqcqf5B6Xt+K2a/M7ifqHORRKjO4GkEWyPVLY27aA/v9329tAeFw=="
}

HTTP Request

POST : /h5_order/detail

请求参数

参数名 必选 类型 说明
公共参数 是 string 公参指:签名(sign)、版本(version)、商户ID(app_id)、时间(time)
order_no 是 string 平台订单号

返回参数说明

参数名 类型 说明
status int 状态码
msg string 状态描述
data jsonObject 具体见下面 “data细节说明”。
data.order_no string 平台订单号
data.merchant_order_id string 商家⾃定义订单号
data.amount string 订单⾦额
data.currency string 法币币种
data.status int 0待⽀付 1已完成 2异常支付 10已取消
data.return_url string 返回地址
data.expires_time int 订单过期时间
data.create_time int 创建时间
data.addresses jsonObject 具体见下面 “addresses细节说明”。
data.addresses.coin string 币名
data.addresses.address string 地址
data.addresses.amount string 应支付币种数额
data.payments jsonObject 具体见下面 “payments细节说明”。
data.payments.coin string 支付币种
data.payments.address string 支付地址
data.payments.txid string txid
data.payments.amount string 支付金额
data.payments.confirm_time int 确认时间
data.payments.status int 状态: 0 待支付 1 正常支付 2 异常支付
data.payments.check_status int 异常原因: 1001⽀付⾦额不匹配 1002已完成订单重复⽀付
date_time string 响应时间
time_stamp int 响应时间单位秒
sign string 签名

订单回调通知

$url = "具体回调地址,由商户提供给平台方";
$header = [
  'Content-Type:application/json',
];
$params = [
    "data":[
        "order_no":"2020010211153423123456",
        "merchant_order_id":"ESIOqIfhKnY",
        "status":1,
        "payments":[
            [
              "address":"0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
              "coin":"eth",
              "txid":"0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
              "amount":"0.1"
              "confirm_time":"15612312112"
              "check_code":"0",
            ],
        ]
    ],
   "sign": "ywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$return = curl_exec($ch);

print_r($return);

var url = "具体回调地址,由商户提供给平台方"
    data := map[string]interface{}{
        "data": map[string]interface{}{
            "order_no":          "IGQUNC2WHT",
            "merchant_order_id": "ESIOqIfhKnY",
            "status":            1,
            "payments": []interface{}{
                map[string]interface{}{
                    "address":      "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
                    "coin":         "eth",
                    "txid":         "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
                    "amount":       "1",
                    "confirm_time": 15612312112,
                    "check_code":   1001,
                },
            },
        },
        "sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
    }
dataType, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", strings.NewReader(string(dataType)))
if err != nil {
  fmt.Println(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) }

fmt.Println(string(body))

let HTTP = require('http')
let postData = {
  "data": {
  "order_no":          "IGQUNC2WHT",
    "merchant_order_id": "ESIOqIfhKnY",
    "status":            1,
    "payments": [
    {
      "address":      "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
        "coin":         "eth",
        "txid":         "0x038B8E7406dED2Be112B6c7E4681Df5316957cad",
        "amount":       "1",
        "confirm_time": 15612312112,
        "check_code":   1001,
    },
  ],
},
"sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
};
let POST_OPTIONS = {
  port: 80,
  host: "具体回调地址,由商户提供给平台方",
  path: "",
  method: 'POST',
  headers: {
    "Content-Type": "application/json; charset=utf-8"
  }
};

const REQUEST = HTTP.request(POST_OPTIONS,function (res) { let data = [] res.on('data', chunk => { data.push(...chunk) }) res.on('end', () => { let _date = JSON.parse( new TextDecoder().decode(new Uint8Array(data))) console.log(_date) }) });

REQUEST.setTimeout(6000) REQUEST.write(JSON.stringify(postData), 'utf8') REQUEST.end()

public static void main() {
    String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtdgvcfozY7fe/x6UlXR/Fff8+wX++CiG05YVRafDe90O8y5KJAMZ156TgajEUXSRyKZqASz7iVoMAcu5FqfK1KuOOdjTAg0LFe/twIZvKmAqHcCSS2pjUXk0fTpZEgQ5lmDCK12Mg07YXvr+BeHjF+kBpwRJMPMG/+DGBDYNFNeRSJqWyopt6yyF528soAykHIUQ7TTultJV5IPCrvjRQQrGdJ/QtCdE0vZg+tA09nFN7AqgraU99kIvzyS0sqysj+pP1SJRmTRSGtlVAO3mILfkXOekZl1KD60G7CF+7BIaaW83FPD55tZhAGhnbLMYyiq7OiIyU61LTRcNSaJ0tAgMBAAECggEBAIGgGKcSzxCBbMYdXLV6TPbZ/HeaRGrwyVWUu7cmc0E8CJu6iWvmb2jGzbiCwuCT5luF6ZZ8JKchvU4FlTfsE5r9TQY2IZ/Ht4s65qBaDUEts5iY3kv8HX9+ZSXDJZpV0ztqqsPmx4ZNj+NYwWXwcFiKdb5R8OmV8bgSsnPddD6wFhwewglUOBPRAjropHE4sqk1Vam6q1MlFq5kiekMn/CItyFYFFzST/ruqAtVTp7YIvazAMrfCKH+pvXWk6pYNHZmL/JZey0GglRyJ1nItiqL33X8Lji056FcbAclidq022h/KPLEJpZk6irWqYdqYZeF6YMLHtdZFDkTZ/hXY+UCgYEA5i794UTQ1Kd6K+iui/S8K5H8nGdiXb3+uZ5j5VKYfbRmzXhAdVYisYe8czeTECxhH+MeHgM4tLR4ifx9q60ylvZxl9Fav1p6EaE36YcvGVmpm7Gm3q6QDDBa4gB+X9u7CxCS4LpotV917YS1QvOIF9lnRonSj1zNzFtbXkywrN8CgYEAwOpx/mR40ZvgZxNCq9DsIdrSZYAFFKpw0xy0OtF1PpuwMaREoRabnlVw6Bb3Hofg50XA3JxemzAX6fB92ee+NfXfeL4UtC4vG1K9JyiXHtHq8p9Uw2W03ehIEeNa3xdoRRnLmD4VUpyfL19ViE2+7TM1Gd3TogjDT+AMOCSuq3MCgYBsurPH7gaq/LVT+mRAzgj4l8v4YUlwuGeTbIMJdvt7HXUWB4CDLH3U2CYnUpAQKrZyJok6ahEmIr1xiKggKP7lmmHL8eNo0icpHrtXfzi7Q8Q/PCpzs4dtioXTjaIkS5nNvzVyG/uL+RyuZmpsxrZ5dYM4KbAhchfwORMutxEZhwKBgQC5zpVw4jCEItBmNuTWO+nTScGvxTgfiXIVw+XLaQa2AJoZlhAL34yPWdffko79tv3lgweY9HsimZXO2rU8dbp8mo5c6ydhy8HPXUeWOcAkDSdv/ApWENW9jgYsRIC3swHY3Fl+Dv3Wjce8huQI3mjwaYvRmBhIToxfmHnscVhTBQKBgB9uciEHfz8hMI7ePrPo2PkyK/RbJDm3HnuWE2lFBp7MOUMlh53MXwv4dIRaYMbRrFuN1UIKEFxuKhWwTHSzZJufk/UENrha/81fpj2BoFsAKkEunKeETvaIh6fZSjec16h2+zxbzwkdS6b+yIYkSlaoAxmDYrMtae0C8G4e0YS9";
    String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArXYL3H6M2O33v8elJV0fxX3/PsF/vgohtOWFUWnw3vdDvMuSiQDGdeek4GoxFF0kcimagEs+4laDAHLuRanytSrjjnY0wINCxXv7cCGbypgKh3AkktqY1F5NH06WRIEOZZgwitdjINO2F76/gXh4xfpAacESTDzBv/gxgQ2DRTXkUialsqKbesshedvLKAMpByFEO007pbSVeSDwq740UEKxnSf0LQnRNL2YPrQNPZxTewKoK2lPfZCL88ktLKsrI/qT9UiUZk0UhrZVQDt5iC35FznpGZdSg+tBuwhfuwSGmlvNxTw+ebWYQBoZ2yzGMoquzoiMlOtS00XDUmidLQIDAQAB";
    rsaSigner signer = new rsaSigner();

Map<String, Object> data = new HashMap<>(); data.put("order_no", "IGQUNC2WHT"); data.put("merchant_order_id", "ESIOqIfhKnY"); data.put("status", 1); List<Object> payments = new ArrayList<>(); payments.add(new HashMap<String, Object>() {{ put("address", "0x038B8E7406dED2Be112B6c7E4681Df5316957cad"); put("coin", "eth"); put("txid", "0xttt"); put("amount", "1"); put("confirm_time", 15612312112L); put("check_code", 1001); }}); data.put("payments", payments);

try { Map<String, Object> params = new HashMap<>(); params.put("data", data); params.put("sign", signer.genSign(data, priKey));

Gson gson = new GsonBuilder().create(); System.out.println("params = " + gson.toJson(params));

String res; // platform request shop callback API // res = doPost("http://api.shophost.com/h5order/callback", gson.toJson(params)); // if (null == res) { // throw new RuntimeException("http error"); // }

// mock response from shop callback API { res = """ { "status":200, "sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==", "data":{ "success_data":"success" } } """; }

System.out.println("response = " + res);

JsonParser jp = new JsonParser(); JsonObject resEle = jp.parse(res).getAsJsonObject(); boolean retSignOK = signer.verifySign(resEle.get("data"), resEle.get("sign").getAsString(), pubKey); if (!retSignOK) { throw new RuntimeException("verify response sign fail"); }

} catch (Exception e) { e.printStackTrace(); }

System.out.println("OK"); }

返回结果示例:

{
  "status":200,
  "sign": "OTA8utI8y8G93p7RPCyb4qIilFQ0B4Aq4iUjhaXWK9m2kgektqlHOASDKXT2VE7NPNysrGycYlVfjDR2WGZn1G66phHo3qa9CcCNpG9klOBEuBEMjiVbb/d8AXcxEzvQr9OCwNsikyxonyzLiY/lsNHeGm9cC5eRvlNLdUSVBipH+ajPd0lDHCayZPs1eCMfbm/xnf8e2lfy6z0UPOpHGfyX/0+hz99Ir5Xnx+0sBBzyZZJxKm4ROid5aDv/9m9guILpURae+Yw/IrkYF4uAKGX+/44cBvtTRQSdX76CAOBSiywZa6BAgDYBLRtkAPM+i+vwNzFBovqHUvI+4Ponaw==",
  "data":{
    "success_data":"success"
  }
}

用户充值到账通知回调,有平台发起请求,商户响应

HTTP Request

POST: 具体回调地址,由商户提供给平台方

请求参数

参数名 必选 类型 说明
data 否 string 回调通知携带数据结构
data.order_no 是 string 订单号
data.merchant_order_id 是 string 商户订单号
data.status 是 int 0待支付 1正常支付 2异常支付 10已取消
data.payments 是 jsonArray 支付信息
data.payments.coin 是 string 支付币种
data.payments.address 是 string 支付地址
data.payments.txid 是 string txid
data.payments.amount 是 string 支付金额
data.payments.confirm_time 是 int 确认时间
data.payments.check_code 是 int 0正常 1001⽀付⾦额不匹配 1002已完成订单重复⽀付
sign 是 string 对data内数据签名

返回参数说明

参数名 必选 类型 说明
status 是 int 状态码
data 是 jsonObject 返回数据对象
data.success_data 是 sring success 接收成功
sign 是 string 签名