1. 区分支付宝公钥和应用公钥的区别, 所有的验签都是使用支付宝公钥完成
2. 支付宝扫码支付是个同步请求, 直接得到支付结果, 使用execute(request)方法, 这里创建的alipayclient中的公钥可以设置为null, 即对同步请求结果不做验签处理
3. app支付生成统一下单使用的是sdkexecute(request)方法
4. app支付回调是否验签, 由商户自行决定, 验签时注意汉字和特殊字符的编码.
(1) 这里使用支付宝官方提供的方式转码无效,
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
(2) 使用如下方式转码
valueStr = URLDecoder.decode(valueStr, "UTF-8");
(3) 使用(2)转码后发现报错:Signature length not correct: got 253 but was expecting 256. 说明支付宝返回的sign在做转码后失效不再时256长, 所以对sign不做转码处理, 至此问题解决
if(!name.equals("sign")) valueStr = URLDecoder.decode(valueStr, "UTF-8");关于转码问题, 应该有更优雅的解决方案, 不做研究
5. 修改账户公钥, 有10-20分钟的延迟, 该时间内原有私钥和新私钥都可以使用