因为国家政策原因, 电商平台对用户信息进行保密处理, 所有会返回有用户敏感信息的接口都会发现变成了密文,所有只有调用开发平台API 对密文进行解密操作。
官方文档 : 抖店开放平台
请求入参
JsonArray [{"auth_id" :“商品id”,"cipher_text":“密文” },{"auth_id" :“商品id” ,,"cipher_text":“密文” },{"auth_id":""}]
参数名称 | 参数类型 | 是否必须 | 示例值 | 参数描述 |
---|---|---|---|---|
cipher_infos | JsonArray | 是 | 待解密的密文列表,每次调用不超过50条 | |
auth_id | String | 是 | 123 | 业务标识,value为抖音订单号 |
cipher_text | String | 是 | 待解密密文,具体内容参考[数据安全加密对接文档](https://op.jinritemai.com/docs/guide-docs/56/589) | 密文 |
当开始写批量解密的测试Demo的时候, 发现数据格式无论怎么样都是错的, 一直返回签名失败等....... 然后突然想起来之前看到的一个简单介绍,好像解密的时候需要对特殊字符进行一个转义的说明 , 然后我就翻到了那篇说明:
如果param_json字段过长,或者param_json内有‘#‘等特殊符号(需要转译),可以使用http post请求方式,并将param_json的值(比如 {"cid":"12","page":"1"})放在请求body里面,原有的url paramter中的param_json不传或者传空即可(其他字段比如timestamp,app_key,method,v,sign,accesstoken等还是按照原有方式传,body中的param_json仍然参与签名计算
当时看见这个说明的时候一头雾水,不知道该转义成什么格式 。完全不知道怎么处理,只好下了一个工单,请教专业人员。
结果这个工作人员的回答非常的敷衍, 不知道在哪复制出的答案,还有遗漏的字 ,完全无语了,但是看了后还是发现了华生 。
请求参数param_json中有"#"等需要urlencode
直接使用 URLEncoder.encode(param_json.toString())
然后就可以正常获取到解密数据了,真的是无语。
下面是测试Demo:
/*************************************** 接口批量解密 **********************************/
public static String batchDecrypt(JSONArray jsonArray){
//请求示例 : https://openapi-fxg.jinritemai.com/order/batchDecrypt?app_key=your_appkey_here&method=order.batchDecrypt&access_token=your_accesstoken_here¶m_json={}×tamp=2018-06-19%2016:06:59&v=2&sign=your_sign_here
String order_id = "订单编号";
String cipherText = "加密字符串----#U/kHlfAE#g/aF1KRQSM6kIPSf1+ScpQU/CXXQ+z1ZLpiQbpjDYpfdQwBLaaOpzP35bhIaMOIFA/DLnU0wYUwD9IbytCYDIS+N14jJiKIV9mAK*CgkIARCtHCAB##";
//字符串转义
String method = "order.batchDecrypt";
String methodStrUrl = "/order/batchDecrypt";
JSONObject json = new JSONObject(true);
json.put("auth_id",order_id);
json.put("cipher_text",cipherText);
jsonArray.add(json);
//之前获取到的token
String accessToken = "本地accessToken";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = simpleDateFormat.format(new Date());
//参数加密
JSONObject param_json = new JSONObject(true);
param_json.put("cipher_infos",jsonArray);
//获取签名
String sign = fetchSign(method, param_json.toString(), time);
//地址后的参数
StringBuffer param = new StringBuffer();
param.append("app_key").append("=").append(APP_KEY).append("&");
param.append("method").append("=").append(method).append("&");
param.append("access_token").append("=").append(accessToken).append("&");
param.append("param_json").append("=").append( URLEncoder.encode(param_json.toString())).append("&");
param.append("timestamp").append("=").append(time).append("&");
param.append("v").append("=").append("2").append("&");
param.append("sign").append("=").append(sign);
// 发送请求
String response = HttpUtils.sendPost(DOUDIAN_URL + methodStrUrl, param.toString());
JSONObject jsonObject = JSONObject.parseObject(response);
if (jsonObject.getIntValue("err_no") == 0) {
JSONObject data = jsonObject.getJSONObject("data");
System.out.println(data);
if (null != data || data.size()!=0){
// return data.getJSONObject("decrypt_text").toString();
}
}
return null;
}