当前位置:   article > 正文

Android对接支付宝移动支付始终无法成功调用H5PayActivity

h5payactivity

帮了我大忙了,感谢博主。

原文地址: http://blog.csdn.net/u010705554/article/details/71170905

最近公司项目需要对接支付宝移动支付,按照支付宝开发文档一步步往项目中集成,一开始还是比较顺利的,因为测试手机上安装了支付宝客户端,当我把支付宝卸载后,问题出现了,因为支付宝sdk本身就进行了客户端是否安装的判断,安装了会呼起支付宝客户端,未安装会调用内置的H5支付界面。现在H5界面无法呼起了!!!

然后一步步核对开发文档,是否有遗漏或者没有配置的,发现并没有,这就尴尬了,然后就各种百度搜索,网上的原因大多是在AndroidManifest中配置H5PayActivity,我配置了,混淆规则也按照要求配置了,然而就是不行啊。始终报错

{memo=系统繁忙,请稍后再试, result=, resultStatus=4000}
 
 
  • 1
  • 1

这各种尝试,上班一天的时间就这么过去了,问题却没有解决。没办法,第二天咨询支付宝技术客服吧。然后把问题描述了一下,配合他们找原因,秘钥,更新sdk包也都试了,还是不行。客服人员让我用官方demo测试一下能否正常呼起H5PayActivity,我测试了一下,可以,这就不是sdk包的问题了。

更奇葩的是,后来发现,我打包不进行代码混淆竟然可以了,这怎么可以,为了代码安全,混淆是不可避免的。那么问题肯定出现在混淆规则上了。于是客服人员说让我再检查一下代码。好吧,只能靠自己了。

既然是混淆规则出现问题,我把项目中的混淆规则全部拷贝到官方demo中进行混淆打包,结果,demo可以!!!我去,这是神马,WHAY!!!不开心了!有小情绪了!!

然后我把项目中的一些依赖一个个向demo中添加,最终,找到了原因!!!哈哈哈,让我兴奋一会。。。。我项目中用到了xutils,我没有全部使用xutils的功能,只是把数据库部分提取出来了,然后一些工具类需要添加一个依赖才能正常使用

compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
 
 
  • 1
  • 1

是的,就是它!!!让我花费了将近两天的时间,来排查原因。。。。

org.apache.http.client

如果观察支付宝sdk的结构就会发现,在com.alipay.phone.mrpc.core下有个AndroidHttpClient,点击进入就能看到它继承HttpClient,然后看它的import部分就能看到引用了大量的org.apache.http相关功能。

既然找到原因了,我总不能把这个依赖去掉吧,去掉xutils就不能使用了, 
我一开始在使用xutils的时候,就在混淆规则中添加了

  1. -keep class 包名.xutils.**{*;}//这是xutils在我自己的项目的路径
  2. -keep class com.google.common.**{*;}
  3. -dontwarn org.apache.http.**
  4. -dontwarn com.google.common.**
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

我发现对于org.apache.http相关,我仅仅是忽略了警告,这也不影响使用,就因为使用了支付宝sdk问题才出现了。所以修改了一下,添加了一句 
-keep class org.apache.http.{*;}

  1. -keep class 包名.xutils.**{*;}//这是xutils在我自己的项目的路径
  2. -keep class com.google.common.**{*;}
  3. -keep class org.apache.http.**{*;}
  4. -dontwarn org.apache.http.**
  5. -dontwarn com.google.common.**
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

然后再次打包,运行,OK了,问题解决!!

哈哈哈!!!

对接过支付宝的朋友们在打包的时候,可能也会遇到其他问题。比如这个

Warning:com.alipay.android.phone.mrpc.core.AndroidHttpClient: can't find referenced method 'org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int,android.NET.SSLSessionCache)' in library class android.Net.SSLCertificateSocketFactory
 
 
  • 1
  • 1

百度搜索一下就能找到解决方法,就是在混淆规则中加上下面两句就行了 
-dontwarn Android.net.** 
-keep class Android.net.SSLCertificateSocketFactory{*;}

于是总结了一下,我的项目中支付宝相关的混淆规则如下

  1. -keep class com.alipay.android.app.IAlixPay{*;}
  2. -keep class com.alipay.android.app.IAlixPay$Stub{*;}
  3. -keep class com.alipay.android.app.IRemoteServiceCallback{*;}
  4. -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
  5. -keep class com.alipay.sdk.app.PayTask{ public *;}
  6. -keep class com.alipay.sdk.app.AuthTask{ public *;}
  7. -dontwarn android.net.**
  8. -keep class android.net.SSLCertificateSocketFactory{*;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果有朋友遇到和我相似的问题,再加上-keep class org.apache.http.{*;} 试试吧。说不定就可以解决。

遇到问题,一步步找原因,逐个击破!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/122871
推荐阅读
相关标签
  

闽ICP备14008679号