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 |
接入方式
商户通过以下请求参数拼接链接后,用户填写收款信息,ACH会推送打币地址给商户的callbackUrl
,商户打币后发送通知给ACH进行打款;此方式接入offramp不支持用户在前端发起退款。
请求参数
参数 | 描述 | 必选 |
---|---|---|
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 2 months ago