对链付的 API 接口的调用是通过向链付 API 的服务端地址发送请求,并按照接口说明在请求中加入相应的请求参数来完成的。链付 API 的请求结构由:服务地址,通信协议,请求方法,请求参数和字符编码组成。具体描述如下:

服务地址

链付 API 的服务接入地址与具体功能相关,详细请参见各接口相关描述。

通信协议

链付API接口都通过 HTTPS 进行通信。

请求方法

链付API 只支持POST请求。

网关地址

测试环境:https://customer-test.chainspay.com

生产环境:https://customer.chainspay.com

请求参数

所有的请求参数都通过post表单提交。所有参数都必须经过加密后传输,加密后的数据结构json格式如下

1
2
3
4
{
"body": "fsdafdsafasafsdfsa", //消息体
"sig": "fdasfasfasdafsafdsafd" //签名信息
}

加密方式: 每个商户都有一个自己的唯一的aeskey和sigToken,可以从商户管理系统中查看,这两个字段是商户的唯一标识。body字段生成过程:通过把需要传输的参数用aes-128-cbc方法加密后得到一个base64的字符串,加密过程中key也需要是base64格式,iv是16个字节的0。拿到加密后的base64串,在头部加上sigToken, sig字段生成过程:把上面的body字段用SHA1进行签名后转为16进制字符串。加密伪代码过程如下:

1
2
3
4
5
6
7
8
// data 是要加密的数据,
byte[] encryptData = aesEncrypt(data, aeskey); //先用aeskey对数据进行加密,获取加密后的字节码, 加密方式为aes-128-cbc, 初始化向量iv是16个字节,值全为0
String base64Body = Base64.toBase64String(encryptData); //把加密后的字节码转换成Base64字符串
String body = sigToken + base64Body; // sigToken和aes加密后的字符串拼接起来组成body字段

MessageDigest digest = MessageDigest.getInstance("SHA1");
byte[] sigBytes = digest.digest(body.getBytes()); // 用SHA1算法对body的字节码进行前面
String sig = Hex.toHexString(sigBytes); // 签名后的数据转换成16进制字符串得到sig字段

下文再讲到的请求参数都必须要经过加密后转成上面的格式进行传输。

返回结果

链付api的返回结果都如上面展示的结构:

1
2
3
4
5
6
7
8
{
"code":200, // 返回代码
"msg":"", // 错误信息
"data":{ // 返回结果
"body": "fsdafdsafasafsdfsa", //消息体
"sig": "fdasfasfasdafsafdsafd" //签名信息
}
}

若返回结果正确,code为200,data为返回的结果,返回正确时msg为空。

若返回结果不正确,code为非200的其他数字,msg是错误的信息,返回错误时data为空。

data也是加密的信息,商户需要通过上文提到的aeskey和sigToken对data进行解密。

下文再讲到的返回结果都是指data解密后的数据。

字符编码

链付API 的请求及返回结果均使用 UTF-8 字符集进行编码。