这是安卓端调用
PayTask alipay = new PayTask(activity);
Map<String, String> result = alipay.payV2(orderInfo, true);
之后返回的result
{resultStatus=9000, result={"alipay_trade_app_pay_response":{"code":"10000","msg":"Success","app_id":"9021000136675082","auth_app_id":"9021000136675082","charset":"utf-8","timestamp":"2024-05-14 23:33:56","out_trade_no":"0514233345-1536","total_amount":"0.01","trade_no":"2024051422001428990502933650","seller_id":"2088721035152978"},"sign":"lBdb16G8Lk1h9hfe1XFCnoWAcBec3x2SiUhHjzKGfH0klWOA3CTBkOIVw0Zh+nKnhHCWeAyF5UbNJiChZMd/eAU+1JiR4GBE7DD1wSkUs+sHRMQ1+svjECRaWSiAplbrmrnZlLNo3xsFfk6IVwlAxuRsQfXw8n30sv1788QFjMMiMyPvyMtJzP09j+++gMAB7us3p0hDsVsle27AbZgKr3cpXLV98zdcQh/Yuvmi0EECDsLZHzuXN+rhmwKBF+A2HAK352kEa8j4/OiduJ5qgwlHISdnysSFw22XZB55wPRxzTGdG7Ble8IAbm4Idb6eEMoek7ePXc1k+M+hnuA/aA==","sign_type":"RSA2"}, memo=, extendInfo={"doNotExit":true,"isDisplayResult":true}}
支付宝官方文档给出的是需要验签的是alipay_trade_app_pay_response对应的部分,然后怎么验证都是false,调整成字典顺序也不行。
公钥已经检查很多遍了,没有问题,支付结果也没有问题,都是直接拿的数据,提取数据也是用JSON提的,不是手提的。。。
自己写的验签函数也不行(接收服务器订单信息用这个给前端验签是通过了的)
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(
Base64.decode(alipayPublicKey));
KeyFactory keyf = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyf.generatePublic(keySpec);
java.security.Signature signature = java.security.Signature
.getInstance("SHA256WithRSA");
signature.initVerify(publicKey);
signature.update(mapData.getBytes("UTF-8"));
System.out.println(signature.verify(Base64.decode(sign)));
支付宝的验签函数也不行
AlipaySignature.verify(mapData,sign,alipayPublicKey,"UTF-8","RSA2");
变成订单信息那种用&拼接也不行。。。
今天磕一天了。。。订单信息验签过了支付结果验签又不过,,,孩子真的要崩溃了。。。
有大神懂的吗,救救菜鸟
今日解决:
还是公钥错了,但不是复制错了,是搞错了!!!支付宝公钥和应用公钥不一样!!!
验签的部分就是alipay_trade_app_pay_response对应那一部分,顺序都不用变。
{"code":"10000","msg":"Success","app_id":"9021000136675082","auth_app_id":"9021000136675082","charset":"utf-8","timestamp":"2024-05-14 23:33:56","out_trade_no":"0514233345-1536","total_amount":"0.01","trade_no":"2024051422001428990502933650","seller_id":"2088721035152978"}
支付宝有 支付宝公钥 和 应用公钥 两个公钥,支付宝公钥是用来对支付结果验签的,应用公钥是用来对服务器返回的orderInfo验签的,要注意区分。
然后直接用我自己写的验签函数就验证通过了。
注意,这里的Base64是alipayDemo中自带的Base64类
私钥和公钥以及签名信息都是用阿里自己的这个Base64这个类解密的,标准库utf-8解压出来有时候行但不是标准方法,订单信息就直接UTF-8转字符数组就行了signature.update(mapData.getBytes("UTF-8"));
alipayDemo在这下载SDK & DEMO 获取 - 支付宝文档中心 (alipay.com)