记录一下我司项目中接入支付宝RiskGo,奇葩异常竟然是支付宝乌龙
1.关于RiskGo
我司接入支付宝RiskGo,主要是用来监控与收集用户对我司支付宝账号主体投诉信息,便于运营在第一时间知道与处理用户投诉等。具体关于支付宝RiskGo,可以查看官方文档。
RiskGo接入文档
2.接入RiskGo通知回调
项目中接收回调通知伪代码,具体实现参考官方文档
@ApiOperationSupport(order = 4) @ApiOperation(value = "接收支付宝RiskGo回调推送") @RequestMapping(value = "/data", method = RequestMethod.POST, produces = "application/x-www-form-urlencoded; charset=GBK") public String alipayRiskGoByCallBack(AliPayRiskGoDataRequestDTO request) { log.info("riskGo,投诉类型:{},投诉等级:{},投诉内容:{}", request.getRisktype(), request.getRisklevel(), request.getComplainText()); return alipayComplainService.alipayRiskGoByCallBack(request); }
支付宝开放平台配置
3.RiskGo 编码转换异常
编码异常现象
GBK强转成UTF-8
出现乱码现象,对已经出现乱码的中文进行编码还原,都无法进行还原。对接收回调接口(上述接口)进行验证,均正常。对中文字符串(尚未强转前),GBK编码转换UTF-8,是正常的。下图是支付宝技术客服中获取的推送记录的数据,这个去RiskGo后台也可以看到对应的数据。手动触发推送,正常接收,无乱码现象。
1).正常接收时:
2)被强转后接收:
反馈至支付宝技术
如何GBK正确转码到UTF-8
上述乱码,是支付宝RiskGo内部推送过来,涉及面较多,实际推送过来的数据,中文字符有GBK被强转成UTF-8,而在支付宝RiskGo官方后台推送列表是正常。GBK强转成UTF-8会丢失其中字节,再次转回成GBK,依旧乱码。GBK转UTF-8会通过ISO-8859-1进行过度,伪代码如下
public static void test() throws UnsupportedEncodingException {
// String chinese = "����ͨappΥ����ȡ��Ա���ṩ���\uE8EC������ȡ���ã�������Ա�ͽ�\uECBB��������Ҫ����Ա�����á�Υ����ȡ����";
//java内部编码
String chinese = "投诉";
//转换成gbk编码
String gbkChinese = new String(chinese.getBytes("GBK"), "ISO-8859-1");
System.out.println("gbk:" + gbkChinese);
//java内部编码
String unicodeChinese = new String(gbkChinese.getBytes("ISO-8859-1"), "GBK");
//中文
System.out.println(unicodeChinese);
//utf--8编码
String utf8Chinese = new String(unicodeChinese.getBytes("UTF-8"), "ISO-8859-1");
//乱码
System.out.println(utf8Chinese);
//java内部编码
unicodeChinese = new String(utf8Chinese.getBytes("ISO-8859-1"), "UTF-8");
//中文
System.out.println(unicodeChinese);
}
运行结果:
4.归纳
出现中文字符串编码,一直在排查项目中的转码是否正常,转码工具类,过滤器等。当从支付宝技术拿到推送记录数据(无任何转码),才发现被支付宝坑惨了,是支付宝内部问题。已经被强转的中文字符串也还原成正常中文,支付宝到现在也没有给出统一的转码方式与解决方案