最近公司项目需要对接支付宝移动支付,按照支付宝开发文档一步步往项目中集成,一开始还是比较顺利的,因为测试手机上安装了支付宝客户端,当我把支付宝卸载后,问题出现了,因为支付宝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.{*;} 试试吧。说不定就可以解决。
遇到问题,一步步找原因,逐个击破!