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 | 签名 |