Off Ramp隐藏收币地址页面
说明:
通过这个对接方式,可以隐藏打币地址页面,但是需要给ACH打币成功通知,流程参考下图:
须知:目前仅支持以下币种使用该功能。
| crypto | network |
|---|---|
| USDC | BSC |
| USDT | BSC |
| ETH | ETH |
| USDC | ETH |
| USDT | ETH |
| MATIC | MATIC |
| USDC | MATIC |
| USDT | MATIC |
| USDC | TRX |
| USDT | TRX |
请求参数
| 参数 | 描述 | 必选 |
|---|---|---|
| appId | 商户应用Id eg:ahzxh0klegv1fzol | Y |
| crypto | 加密货币名称 eg:USDT | Y |
| network | 网络 eg:ETH | Y |
| cryptoAmount | 售卖加密货币数量 | Y |
| fiat | 法币code eg:USD | Y |
| country | 国家code eg:US | Y |
| callbackUrl | 回调商户同步订单信息 | Y |
| withdrawUrl | 跳转回商户url | Y |
| source | 来源默认:3。 上传该字段会隐藏收币地址页面 | Y |
| type | 类型 eg:sell | Y |
| merchantOrderNo | 商户自定义订单号 eg:1112957819622420480 | Y |
| showAddress | 是否展示地址二维码可选:Y/N | Y |
| merchantName | 商户名称 | Y |
| urlType | 只能传入app或web,这代表用户跳转的withdrawUrl的类型 | Y |
注意:如果传入source参数, url后需拼接 #/sell-formUserInfo。这样跳转过来会直接进入银行信息填写页,没有返回按钮和菜单栏,如不传,则直接进入卖币首页。如下图:
请求示例:
https://ramp.alchemypay.org?appId=ahzxh0klegv1fzol&crypto=ELF&network=ELF&fiat=USD&country=US&cryptoAmount=100&callbackUrl=https://localhost:9090/test/test&withdrawUrl=www.baidu.com&type=sell&source=3&urlType=web&merchantName=AELF&merchantOrderNo=2134545343544334&showAddress=N#/sell-formUserInfo通知参数
ACH通知
用户提交表单后会生成订单,订单信息会通过商户请求参数中的callbackUrl推送,每次订单状态变更都会推送订单信息。推送参数:
| 参数 | 说明 | 必需 |
|---|---|---|
| orderNo | 订单号 | Y |
| merchantOrderNo | 商户订单号 | N |
| crypto | 加密货币 | Y |
| network | 网络 | Y |
| cryptoPrice | 加密货币价格 | N |
| cryptoAmount | 加密货币数量 | Y |
| fiatAmount | 法币数量 | N |
| appId | 商户appId | Y |
| fiat | 法币code | Y |
| txHash | 交易哈希 | N |
| 用户邮箱 | N | |
| status | 订单状态:1.订单创建成功,2.用户打币完成,3.开始打款,4.打款成功,5.打款失败,6.退款成功,7.订单超时 | Y |
| address | 打币地址 | Y |
| cryptoActualAmount | 实际打币数量 | N |
| rampFee | 服务费 | N |
| receiptTime | 打款完成 | N |
| paymentType | 支付方式 | Y |
| name | 用户名称 | Y |
| card | 卡号 | N |
| account | 账户 | N |
| orderAddress | 订单详情页url | Y |
| signature | 签名,参考下方 “通知签名方式” | Y |
商户通知
用户打币完成,商户需要推送信息给ACH。
请求
路径: https://api.alchemypay.org/webhooks/off/merchant
- post
- application/json
需要配置IP白名单,可以在商户后台添加。
推送参数:
| 参数 | 说明 | 必需 |
|---|---|---|
| orderNo | 订单号 | Y |
| crypto | 加密货币 | Y |
| cryptoAmount | 加密货币数量 | Y |
| network | 网络 | Y |
| txHash | 转账hash | Y |
| address | ACH通知 参数中的 address | Y |
| appId | 商户appId | Y |
| signature | 签名,参考下方 “通知签名方式” | Y |
请求示例:
{
"orderNo": "string",
"crypto": "string",
"cryptoAmount": "string",
"txHash": "string",
"network": "string",
"address": "string",
"appId": "string",
"sourceAddress": "string",
"signature": "string"
}响应
响应参数:
| 参数 | 说明 | 必须 |
|---|---|---|
| success | boolean | Y |
| returnCode | string | Y |
| returnMsg | string | Y |
| extend | string | Y |
| data | object | Y |
响应示例:
{
"success": true,
"returnCode": "string",
"returnMsg": "string",
"extend": "string",
"data": {}
}通知签名方式
拼接参数appId+appSecret+orderNo+crypto+network+address
public class MerSignCheckUtil {
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
private static String encode(String algorithm, String value) {
if (value == null) {
return null;
}
try {
MessageDigest messageDigest= MessageDigest.getInstance(algorithm);
messageDigest.update(value.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}
public static void main(String[] args) {
String appId = "";
String appSecret = "";
String crypto = "";
String orderNo = "";
String network = "";
String address = "";
String rawString = appId + appSecret + orderNo + crypto + network + address;
String sign = encode("sha1", rawString);
}
}Updated 8 months ago
