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

原创 2017年01月03日 10:47:02

参考链接: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开发,所以没时间对这个问题刨根问底,希望小伙伴们尽量避免,如有了解详情者,请留言告知,不胜感激!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

微信支付不成功的几个原因

版权声明:本文著作权归TeachCourse所有,未经许可禁止转载,谢谢支持! 转载请注明出处:http://teachcourse.cn/1603.html 一、微信支付不成...
  • u014662112
  • u014662112
  • 2016年04月27日 18:01
  • 21659

微信公众号支付失败的各种原因

1、配置网页授权域名 1、get_brand_wcpay_request:fail的原因: 1) 公众号-》微信支付-》开发配置 支付授权目录设置问题,测试环境需要配置测试授权目录和添...
  • yxl_num
  • yxl_num
  • 2016年04月23日 09:33
  • 4925

关于微信支付失败,在参数正确的情况下

由于未进行类型转换而导致签名错误,艹艹艹艹艹艹艹官方demo里面屁都没说
  • u012993293
  • u012993293
  • 2015年07月10日 09:52
  • 750

Android微信支付获取二次签名Sign的方法

/** * 获取sign签名 * * @return */ private String genPayReq() { // 获取参数的值...
  • zhou114108
  • zhou114108
  • 2016年09月05日 11:36
  • 3839

微信支付签名工具类---Signature

package com.jeeplus.mobile.utils; import java.io.IOException; import java.lang.reflect.Field; ...
  • zhoujianjava
  • zhoujianjava
  • 2017年09月12日 10:40
  • 377

Android集成微信支付工具类

  • 2016年07月23日 22:44
  • 6KB
  • 下载

android 微信支付功能支付返回-1问题

在集成微信支付时,遇到第一次可以调起微信的支付页面,之后再调用支付,总是返回到支付结果页,返回的errorCode总是为 -1。   在申请微信支付接口时,需要填写app 包名称和签名。 ...
  • zjy_hll
  • zjy_hll
  • 2014年12月22日 14:16
  • 1574

Android 微信支付快速集成案例及有效解决返回值-1

商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。本文讲解Android微信支付...
  • LeoLeoHan
  • LeoLeoHan
  • 2015年09月01日 15:15
  • 12319

关于微信支付第一次成功,后面就不成功的坑。。。。

关于微信支付第一次成功,后面就不成功的坑。。。。所以在这里mark一下,,, 这是我挑起微信支付的代码 IWXAPI mWxApi= WXAPIFactory.createWXAPI(Purs...
  • jianghe_130
  • jianghe_130
  • 2017年06月16日 09:24
  • 1423

微信支付仅能成功调用一次的问题

本人使用Android开发有一段时间了,但是本身没有系统学,而且多年专注服务端开发,总觉得因为项目需要接触Android移动端开发只是暂时的,所以没有太上心,结果碰到一个大难题折腾了一天,最后被有经验...
  • xinluqishi123
  • xinluqishi123
  • 2016年08月17日 19:45
  • 3573
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微信支付 第一次成功,其他无法调起,返回-1(Android eclipse 微信支付之大坑 签名工具问题)
举报原因:
原因补充:

(最多只允许输入30个字)