您的位置:首页 > 移动开发 > Android开发

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

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

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

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


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

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

既然是混淆规则出现问题,我把项目中的混淆规则全部拷贝到官方demo中进行混淆打包,结果,demo可以!!!我去,这是神马鬼!!

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

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


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

org.apache.http.client

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

既然找到原因了,我总不能把这个依赖去掉吧,去掉xutils就不能使用了,

我一开始在使用xutils的时候,就在混淆规则中添加了

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


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

-keep class org.apache.http.{*;}

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


然后再次打包,运行,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


百度搜索一下就能找到解决方法,就是在混淆规则中加上下面两句就行了

-dontwarn android.net.**

-keep class android.net.SSLCertificateSocketFactory{*;}

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

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-dontwarn android.net.**
-keep class android.net.SSLCertificateSocketFactory{*;}


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

遇到问题,一步步找原因,逐个击破!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐