如何对接
1. 申请接入
联系我们的商务团队,获取商户账号和密钥。
2. 商户后台
- 测试环境:
https://test-manage.magiccompasspay.com
- 生产环境:
https://manage.magiccompasspay.com
3. 接口地址
- 测试环境:
https://test-gateway.mcconnects.com/mc-payment/
- 生产环境:
https://gateway.mcconnects.com/mc-payment/
4. 约定&规范
-
请求方式: POST
-
请求参数: JSON格式
-
编码格式: UTF-8
-
请求报文结构: 接口会处理请求了两种内容:Header(公有参数,存在在HTTP headers属性中)、Body(私有参数,存放在HTTP Body属性中)
-
元素出现要求:
符号 说明 R 报文中该元素必须出现(Required) O 报文中该元素可选出现(Optional) C 报文中该元素在一定条件下出现(Conditional) -
公共参数:
公共参数(Header)是用于标识产品及接口鉴权的参数,每次请求的headers属性中均需要携带这些参数:
参数名称 | 类型 | 出现要求 | 描述 |
---|---|---|---|
X-Timestamp | long | R | 当前UNIX时间戳(毫秒级) |
X-Access-Key | string | R | 在平台创建完商户后生成的Access-Key |
X-Signature | string | R | 签名 |
X-RequestURI | string | O | 请求接口的requestURI (和参与签名计算的要保持一致) |
// 设置请求头参数
connection.setRequestProperty("X-Signature","adfasdfasdfasdfasdfasdf");
connection.setRequestProperty("X-Access-Key","12345");
connection.setRequestProperty("X-Timestamp","1649247752");
connection.setRequestProperty("Content-Type","application/json");
- 响应报文结构:
所有接口响应均采用JSON格式,如无特殊说明,每次请求的返回值中,都包含下列字段:
参数名称 | 类型 | 出现要求 | 描述 |
---|---|---|---|
code | int | R | 响应码,代码定义请见“附录A 响应码说明” |
msg | string | R | 响应描述 |
data | object | R | 每个接口特有的参数,详见每个接口定义 |
示例
{
"code":200,
"msg":"调用成功",
"data":{
"Channel":"A10086",
"Type":7004
}
}
5. 签名算法及验签
本服务接口验证使用的是AK/SK(Access Key/Secret Key)机制,具体流程如下:
- 获取请求的HTTP headers属性中的X-Timestamp、X-Access-Key、X-Signature参数值;
- 三个参数如果未传值,则校验不通过;
- X-Timestamp 与当前事件比较,如果时间差大于5分钟,则校验不通过;
- 将X-Timestamp、X-Access-Key、请求requestURI 拼接成字符串,并使用secretKey作为密钥进行HMAC-SHA512签名,将结果与X-Signature比较相等则校验通过;
签名算法Java版本:
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class AKSKUtil {
public static final String HMAC_SHA_512 = "HmacSHA512";
public static String calculateHMAC(String data, String secretKey) {
try {
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), HMAC_SHA_512);
Mac mac = Mac.getInstance(HMAC_SHA_512);
mac.init(secretKeySpec);
byte[] rawHmac = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(rawHmac);
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
throw new RuntimeException("Failed to calculate HMAC: " + e.getMessage(), e);
}
}
}
例子: 请求资产列表查询接口
String requestURI = "/external/api/v1/deposit/request";
String accessKey = "123456"; // 获取请求的HTTP headers属性中的X-Access-Key参数值 申请商户后会生成,测试对接时可用由MCPayment给出
String timestamp = "1649247752"; // 当前毫秒时间戳
String secretKey = "abc";// 申请商户后会生成,请妥善保存不要泄露,泄露有伪造请求风险,测试对接时可用由MCPayment给出
String signature = AKSKUtil.calculateHMAC(accessKey+timestamp+requestURI, secretKey);
// 设置请求头参数
connection.setRequestProperty("X-Signature",signature);
connection.setRequestProperty("X-Access-Key",accessKey);
connection.setRequestProperty("X-Timestamp",timestamp);
connection.setRequestProperty("X-RequestURI",requestURI);
附 录A 响应码说明
响应码 | 描述 |
---|---|
200 | 调用成功 |
303 | 参数错误 |
500 | 错误 |