微信支付 第一次成功,其他无法调起,返回-1(Android eclipse 微信支付之大坑 签名工具问题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ws1836300/article/details/53893102

参考链接:http://blog.csdn.net/xinluqishi123/article/details/52234002

微信支付第一次成功,其它支付不成功,可能的原因有:

1:订单号重复,这个重新生成一个订单号就可以了。

2:项目包名不对(包名必须与微信开发者平台上的一致,详情见参考链接)。

3:APP的应用签名不对,这个着重讲一下哈(在这里我被坑了一个大跟头,请大家尽量避免)。

 事情原委:

         我的Android APP有两个版本:第一版,第二版(第二版在第一版的基础上改了一些功能和配置)。

        开始做第一版的时候出于懒惰,就直接把以前的APP包的签名填写在了微信开放平台-- 对应的应用下面,也就是应用的包名是正确的,而签名不正确,如下图


(为了个人隐私,涂掉了一些字母)

这样的做的结果就是:你的APP调用微信支付,第一次是可以支付成功的(参考帖子里说可能支付不成功,实际上第一次支付是成功的),然后再调用微信支付就不行了。删除原来的微信,重新下载一个微信,然后调起支付,也是第一次成功,然后再也无法调起了(如果你的微信预付单是OK的,而且返回的预付单结果也是SUCCESSS。但是就是无法调起微信,那原因就是这个该死的签名有问题)。后来看了这个参考帖子,恍然间大了个悟,修改了微信开放平台Android端应用签名。这下第一版就OK了,支付成功,万事大吉。

       后来,悲剧开始了,我修改了eclipse的Android SDK 配置,修改了项目 .project文件里的 项目名(<projectDescription> <name>项目名***</name>),还修改了Androidmainfest.xm里mainActivity的启动方式。理论上都不影响微信支付功能,但是第二版运行后却无法调起微信支付了!我了个去!百思不得其解的我把代码恢复到了以前的版本,可还是无法调用成功。我删除了微信,然后重新下载了一下,然后支付,发现还是只有第一次可以调用。

那么是不是签名不对哪?我手机下载并运行了一下第一版的apk文件,发现第一版的apk支付完全没问题,只有第二版的apk支付不成功。

是不是签名生成的不对?可是第一版调用支付是没问题的,第二版app的包名和第一版是一样的。死马当活马医,我重新用微信的签名生成工具生成了一下app的签名,戏剧性的一幕出现了,第二版的签名和第一版是不一样的!这也太TM操蛋了!

如图:

安装了第一版APK后,用微信签名生成工具生成的签名是:cbf******028(这是一个MD5加密的字符串):



安装了第二版APK后,用微信签名生成工具生成的签名是938******b22:


(吐槽一下,微信早期的签名生成工具就是一坨shit,这一长串字符无法复制,需要手敲)

那么,是不是签名生成工具版本太老了呢?

 好吧,我下载了最新版的签名工具重新操作了一遍

 安装了第一版APK后,用微信签名生成工具生成的签名还是:cbf******028:


安装了第二版APK后,用微信签名生成工具生成的签名还是938******b22:


(最新版的终于有拷贝字符串的功能了)

   通过上图,大家可以发现,一样的APP包名 的确会生成不同的 应用签名。也就是讲,如果要生成唯一的签名,微信除了判断包名(一般应用的包名是唯一的)之外,还对应用的其它设置进行了判断。

  那么到底还判断了什么呢?

看其官网的提示:


很显然,除了应用的包名之外,微信还通过编译的keystore生成该MD5签名字符串。

但是,我的APP在生成APK文件时并没有设置keystore,也就是讲,第一版第二版的.apk文件都是使用相同的默认设置,无论默认设置有木有使用keystore,由于配置的环境相同,APP应用包名也相同,所以其签名也应该是一致的。(关于keystore的生成和支付的关系,可以参考:http://www.xadamai.com/APPzixun/211.html)

Android 手机目录里面的文件或者文件名是唯一的,那么第一版第二版app的包名真的是一致的吗?

我们看一下这个应用包名:

第一版APP 输出的的包名为:com.example.hpappchange-1

on path: DexPathList[[zip file "/mnt/asec/com.example.hpappchange-1/pkg.apk"],nativeLibraryDirectories=[/mnt/asec/com.example.hpappchange-2/lib, /vendor/lib, /system/lib, /data/datalib]]

第二版APP 输出的的包名为:com.example.hpappchange-2

on path: DexPathList[[zip file "/mnt/asec/com.example.hpappchange-2/pkg.apk"],nativeLibraryDirectories=[/mnt/asec/com.example.hpappchange-2/lib, /vendor/lib, /system/lib, /data/datalib]]

*显然包名不一致,为什么呢?

      一般这种问题可能是资源路径不对,或者R文件没有更新。总之就是一些不容易发现的各种小问题。与其去找这些无聊 的问题,不如重新做一个,或者点击Eclipse最上方菜单的 project > clean试一下。我们先不纠结这个。
*由上边截图可以看到,微信的签名生成工具对同一包名的应用生成的签名是不一致的,造成不一致的原因可能就是

引起第一版文件包名(com.example.hpappchange-1)和第二版的文件包名(com.example.hpappchange-2)不一致的原因。为什么会签名不一致呢?

还有一个可能原因就是打包的apk的签名是由jarsigner和keytool生成的,然而通过adb install安装的apk文件则会自动签上debug权限,两种的RSA散列不同所以会出现这样的问题。之所以说可能是因为我的第一版第二版APP都是安装的apk包,不存在安装途径不同导致加密不同的问题。当然我希望是我的设置有问题,不然的话,使用微信的签名工具造成的困扰就太大了。

(注:APK签名步骤分为两步,首先通过keytool生成用来签名的 xxx.keystore,再用jarsigner签名apk文件)

(RSA散列是一种加密方式,或称为RSA公钥加密算法,与DES(被AES取代了) ,AES等   都是一些主流的加密方式)

(参考链接:

http://www.tttabc.com/android/keytool-keystore-jarsigner-apk.htm

http://hhuleaves.iteye.com/blog/1387721

http://www.cnblogs.com/linn/p/3784363.html)

4:eclipse 缺少对应的  Android SDK版本(这个原因很小)

例如: <uses-sdk
        android:minSdkVersion="8"              这是支持的最小版本

        android:targetSdkVersion="16" />    需要修改targetSdkVersion 为支持的版本


由于本人同时在搞ios开发,所以没时间对这个问题刨根问底,希望小伙伴们尽量避免,如有了解详情者,请留言告知,不胜感激!!!

猜你喜欢

转载自blog.csdn.net/ws1836300/article/details/53893102
今日推荐