安卓接入支付宝沙箱验签不通过

这是安卓端调用

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)

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将React应用程序接入支付宝沙箱,您需要完成以下步骤: 1. 首先,按照支付宝提供的文档完成支付宝的申请。您可以参考支付宝官方文档:https://opendocs.alipay.com/support/01razc。 2. 在您的React Native项目的`android/app/build.gradle`文件中添加以下代码: ```groovy dependencies { // 其他依赖项... compile fileTree(dir: "libs", include: ["*.aar"]) compile files('libs/alipaysdk-15.8.06.211122170115.aar') } ``` 3. 创建一个名为`ZhifubaoPackage`的类,该类实现了`ReactPackage`接口,***```java import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ZhifubaoPackage implements ReactPackage { @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new AlipayModule(reactContext)); return modules; } } ``` 4. 在您的React Native应用的主`MainApplication.java`文件中注册`ZhifubaoPackage`。您可以在`getPackages()`方法中添加以下代码: ```java @Override protected List<ReactPackage> getPackages() { @SuppressWarnings("UnnecessaryLocalVariable") List<ReactPackage> packages = new PackageList(this).getPackages(); packages.add(new ZhifubaoPackage()); // 添加这一行 return packages; } ``` 5. 接下来,您需要创建一个名为`AlipayModule`的模块类,该类继承自`ReactContextBaseJavaModule`。您可以在这个模块类中实现与支付宝相关的功能。根据您的需求,您可以添加支付、查询订单等相关方法。 完成以上步骤后,您的React Native应用就已成功接入支付宝沙箱。请根据您的具体需求进一步实现相关功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值