文档
测试
POST
/api/v1/riskserver

签名算法

1. 请求参数(不包含签名参数sign,core_enc,core_des_key,return_url),根据字⺟ASCII码顺序对参数名称进行排序。其中core_data进行json编码,core_data作为一个整体参与排序。例如:app_id = test_app_id,sign_type = RSA,method = notify。排序后的顺序为sign = 加签后生成的值,method = notify,sign_type = RSA。 2. 排序好的参数名和参数值按照key1=value1&key2=value2的方式拼接,拼接后的字符串即为待签名字符串。拼装好的字符串需要采用utf-8编码。例如,接着上面的例子拼接 后:app_id=test_app_id&method=notify& sign_type=RSA。 3. 对待签名的字符串,根据合作机构的私钥,通过RSA签名,生成sign 4. 对生成的签名sign进行base64编码。 5. 最终将以上得到的参数(sign)拼装到请求中,发起HTTP请求。

请求参数

参数名
类型
描述
必填
app_id
string
分配给应⽤的唯⼀标识
必填
method
string
要请求的API⽅法名称
必填
sign
string
API请求的签名
必填
format
string
响应格式。仅⽀持json
必填
sign_type
string
填写 RSA
必填
version
string
API协议版本,默认值:1.0
必填
core_enc
string
data加密⽅式(0不加密,1加密:采⽤DES加密算法)默认为 不加密
可选
core_des_key
string
RSA加密后的密钥(core_enc为1时为必传)
可选
data
string (JSON转义)
请求的业务数据,此处数据格式为JSON封装。具体参数说明详见单独的接口方法文档
必填
timestamp
string
10位时间戳,精确到秒
必填
return_url
string
回调url
可选

响应参数

参数名
类型
描述
必填
error
int
操作返回码,200表示成功,⾮200为异常情况
必填
msg
string
操作信息,返回失败原因等
可选
data
JSON
返回业务数据
必填

error 响应码

|error|描述| |-|-|-| |-1|系统繁忙,请稍后重试| |200|success| |400|接口错误| |401|远程接口错误| |402|超时错误| |404|数据未命中| |500|系统错误| |3001|语言检测参数错误| |4000|错误| |4001|签名错误| |4002|签名Token 错误| |4003|POST参数不合法,缺少必须的参数| |4004|请求的业务参数不合法| |4005|业务错误| |4006|上传错误| |4006|方法不存在| |4008|获取风控分失败| |4009|数据处理中| |4010|余额不足| |4010|用户手机号为空| |4011|检验过程失败| |4012|未上报app与短信数据| |5001|接口尚未实现| |6001|银行卡认证失败| |6002|PAN卡认证失败| |7001|查询次数已超过限制| |7002|请先获取分数,再获取数据| |8001|三要素参数缺失| |9001|策略执行失败|

RSA密钥⽣成⽅法

1. 通过openssl⼯具⽣成RSA的公钥和私钥 2. ⽣成私钥 openssl genrsa -out rsa_private_key.pem 1024 3. ⽣成公钥 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

业务数据加密算法

1. ⽬前提供两种业务数据处理⽅式 2. 不加密,仅完成签名(core_enc=0) 3. 加密,同时完成签名(core_enc=1) 4. core_enc字段标识是否加密,具体是否加密可沟通。 5. 在操作签名前,合作机构需要完成的数据加密流程如下: ``` 1.合作⽅⽣成⼀个原始值key,使⽤key对原始业务参数值(即data)进⾏DES加密算法,得到最终的 data参数值。 2.随后根据以上的签名算法,根据请求参数⽣成签名sign。其中data数值为上⼀步操作后得到的结 果值。 3.将原始key,根据公钥使⽤RSA加密算法⽣成core_des_key。 4.最终将以上得到的参数(data,sign,core_des_key)拼装在请求参数中,发起HTTP请求。 ```

示例代码

``` //业务参数封装 JSONObject info = new JSONObject(); JSONObject jsonObject = new JSONObject(); info.put("borrowId", "777"); ... String app_id ="xxxxxx"; String data=jsonObject.toJSONString(); ///签名 String format = "json"; String method = "xxx"; String sign_type = "RSA"; String timestamp = "1568519916"; String version = "1.0"; String allData = new StringBuilder() .append("app_id=").append(app_id).append("&") .append("data=").append(data).append("&") .append("format=").append(format).append("&") .append("method=").append(method).append("&") .append("sign_type=").append(sign_type).append("&") .append("timestamp=").append(timestamp).append("&") .append("version=").append(version) .toString(); String privateKey = "BZg4N+W8MlcXzXYquh9iTpMt46z3gTrF8+LkS3G12+sBcHbN1fDN7PMzXX2J1ro61A="; String sign = addSign(privateKey, allData); public static String addSign(String privateKey, String context) { //加签算法:SHA1WithRSA PrivateKey privKey = getPrivateKey(privateKey); byte[] sign=null; try { Signature signature = Signature.getInstance("SHA1WithRSA"); signature.initSign(privKey); signature.update(context.getBytes("utf-8")); sign = signature.sign(); } catch (Exception e) { //e.printStackTrace(); throw new RuntimeException(e); } return org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString(sign); } public static PrivateKey getPrivateKey(String privateKey) { PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(org.apache.commons.codec.binary.Base64.decodeBase64(privateKey.getBytes())); PrivateKey privKey = null; try { privKey = keyf.generatePrivate(priPKCS8); } catch (InvalidKeySpecException e) { throw new RuntimeException(e); } return privKey; } private static KeyFactory keyf = null; static { Security.addProvider(new BouncyCastleProvider()); try { keyf = KeyFactory.getInstance("RSA", "BC"); }catch(Exception e) { throw new RuntimeException(e); } } ```