赞
踩
帮了我大忙了,感谢博主。
原文地址: http://blog.csdn.net/u010705554/article/details/71170905
最近公司项目需要对接支付宝移动支付,按照支付宝开发文档一步步往项目中集成,一开始还是比较顺利的,因为测试手机上安装了支付宝客户端,当我把支付宝卸载后,问题出现了,因为支付宝sdk本身就进行了客户端是否安装的判断,安装了会呼起支付宝客户端,未安装会调用内置的H5支付界面。现在H5界面无法呼起了!!!
然后一步步核对开发文档,是否有遗漏或者没有配置的,发现并没有,这就尴尬了,然后就各种百度搜索,网上的原因大多是在AndroidManifest中配置H5PayActivity,我配置了,混淆规则也按照要求配置了,然而就是不行啊。始终报错
{memo=系统繁忙,请稍后再试, result=, resultStatus=4000}
这各种尝试,上班一天的时间就这么过去了,问题却没有解决。没办法,第二天咨询支付宝技术客服吧。然后把问题描述了一下,配合他们找原因,秘钥,更新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'
是的,就是它!!!让我花费了将近两天的时间,来排查原因。。。。
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.{*;} 试试吧。说不定就可以解决。
遇到问题,一步步找原因,逐个击破!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。