近来在集成第三方支付---支付宝,在集成的过程中严格按照支付宝开发者平台所发布的说明文档和Demo,在我的测试机上可以完美的运行,但是在别人的手机无论怎么就是调用不起来,总是弹出"remote call failed". 翻来复去,代码检查了好几遍,总是找不到错误在哪。

然后,仔细地查看了一下LogCat,发现一条Warning,显示是InvalidKeySpecException异常,显示如下:

09-23 20:03:34.735: W/System.err(24906): java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
09-23 20:03:34.740: W/System.err(24906): at org.apache.harmony.xnet.provider.jsse.OpenSSLKey.getPrivateKey(OpenSSLKey.java:124)
09-23 20:03:34.740: W/System.err(24906): at org.apache.harmony.xnet.provider.jsse.OpenSSLRSAKeyFactory.engineGeneratePrivate(OpenSSLRSAKeyFactory.java:64)
09-23 20:03:34.740: W/System.err(24906): at java.security.KeyFactory.generatePrivate(KeyFactory.java:186)
09-23 20:03:34.740: W/System.err(24906): at com.slanissue.apps.mobile.bevarhymes.util.Rsa.sign(Rsa.java:68)
09-23 20:03:34.740: W/System.err(24906): at com.slanissue.apps.mobile.bevarhymes.PayActivity.executeAliPay(PayActivity.java:1055)
09-23 20:03:34.740: W/System.err(24906): at com.slanissue.apps.mobile.bevarhymes.PayActivity.access$9(PayActivity.java:1050)
09-23 20:03:34.740: W/System.err(24906): at com.slanissue.apps.mobile.bevarhymes.PayActivity$5.onSuccess(PayActivity.java:443)
09-23 20:03:34.740: W/System.err(24906): at com.loopj.android.http.JsonHttpResponseHandler$1$1.run(JsonHttpResponseHandler.java:125)
09-23 20:03:34.740: W/System.err(24906): at android.os.Handler.handleCallback(Handler.java:730)
09-23 20:03:34.740: W/System.err(24906): at android.os.Handler.dispatchMessage(Handler.java:92)
09-23 20:03:34.740: W/System.err(24906): at android.os.Looper.loop(Looper.java:176)
09-23 20:03:34.740: W/System.err(24906): at android.app.ActivityThread.main(ActivityThread.java:5454)
09-23 20:03:34.740: W/System.err(24906): at java.lang.reflect.Method.invokeNative(Native Method)
09-23 20:03:34.740: W/System.err(24906): at java.lang.reflect.Method.invoke(Method.java:525)
09-23 20:03:34.740: W/System.err(24906): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
09-23 20:03:34.740: W/System.err(24906): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
09-23 20:03:34.740: W/System.err(24906): at dalvik.system.NativeStart.main(Native Method)
09-23 20:03:34.745: W/System.err(24906): Caused by: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
09-23 20:03:34.745: W/System.err(24906): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.d2i_PKCS8_PRIV_KEY_INFO(Native Method)
09-23 20:03:34.745: W/System.err(24906): at org.apache.harmony.xnet.provider.jsse.OpenSSLKey.getPrivateKey(OpenSSLKey.java:122)
09-23 20:03:34.745: W/System.err(24906): ... 16 more

  点击第8行进去,发现错误在这儿:

             PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
Base64.decode(privateKey));
KeyFactory keyf = KeyFactory.getInstance("RSA");
PrivateKey priKey = keyf.generatePrivate(priPKCS8);

但是这里显然没有错啊?这到底是怎么回事呢??

经过在博客和StackOverFlow上查询,发现原来是这样的:(我的测试机比较早了,Android版本是4.0.3的,但是用的其它人的手机版本基本上都在4.3.x)

在Android4.1.0之前的版本,代码行

 KeyFactory keyf = KeyFactory.getInstance("RSA");

是工作正常的。但是在4.1.0之后,这个就不能正常工作了,需要将该代码改变成:

 KeyFactory keyf = KeyFactory.getInstance("RSA", "BC");

然后就研究了一下这个方法的作用,API上面说的是:“为指定提供程序中的指定算法生成 KeyFactory 对象”;

即:KeyFactory.getInstance(String algorithm, String provider);中的algorithm为“指定算法”,provider为“指定提供程序”。

或许是因为Android虚拟机Dalvik对KeyFactory的实现中,默认的provider在4.1.0之后由"BC"改为了其它的了。当然,仅是猜测。

还好最终解决了问题。

支付宝集成时的InvalidKeySpecException的更多相关文章

  1. iOS支付宝集成时遇到的问题整理(2)

    1.集成支付宝SDK编译报错#include<openssl/asn1.h>这一行  “openssl/asn1.h”file not found 解决方法:在BuildSetting 里 ...

  2. iOS支付宝集成时遇到的问题整理(1)

    1.模拟器上运行正常,但是真机调试时报编译链接错误 :ld: '/Users/wangqipeng/Desktop/iOS支付宝官方文档/AlixPayDemo/libcrypto.a(bio_lib ...

  3. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  4. 支付宝集成SDK 报错

    1.打开Demo中的错误 这是路径错误导致 解决办法:在Build Settings 中找到 Library Search Paths ,去掉其中的 /// 2.自己集成支付宝SDK时的错误 这个也是 ...

  5. iOS开发之支付宝集成

    项目中要用到支付功能,需要支付宝,微信,银联三大支付,所以打算总结一下,写两篇文章,方便以后的查阅, 大家在做的时候也能稍微参考下,用到的地方避免再次被坑.这是第二篇支付宝集成,第一篇银联支付在这里. ...

  6. iOS开发过程中 xcode文件与Finder中文件保持一致 + 支付宝集成出错

    目录 环境 前言 1.使用 Gem 安装 synx 2.直接在终端 Terminal 中开始使用 3.在使用的时候还可以加参数来实现不同的功能 4.解决项目中出现的一些 error 环境 OS X 1 ...

  7. EhCache WebCache 与 SpringMVC集成时 CacheManager冲突的问题

    转自:点击打开链接 http://www.cnblogs.com/daxin/p/3560989.html EhCache WebCache 与 SpringMVC集成时 CacheManager冲突 ...

  8. iOS支付宝集成详细流程

    实现支付宝支付的准备工作: 1.向支付宝签约,成为支付宝的商户 签约完成后,支付宝会提供一些必要的数据给我们 商户ID:partner 账号ID:seller 即支付宝账号 签约需要营业执照 2.获取 ...

  9. struts2与spring集成时action的class属性值意义

    struts2单独使用时action由struts2自己负责创建:与spring集成时,action实例由spring负责创建(依赖注入).这导致在两种情况下struts.xml配置文件的略微差异. ...

随机推荐

  1. STM32电源管理

     (1)3时钟模式 ①睡眠模式②停止模式③待机模式 1.睡眠模式:Cortex-M3内核(理解为CPU)停止工作,CPU供电1.8V有着,周边任何执行.执行 2.停机模式:全部时钟都停止,CPU电 ...

  2. Oracle按不同时间分组统计

    Oracle按不同时间分组统计 Oracle按不同时间分组统计的sql 如下表table1: 日期(exportDate) 数量(amount) -------------- ----------- ...

  3. Java 反射 想

    所谓反射.是指在执行时状态中,获取类中的属性和方法.以及调用当中的方法的一种机制. 这样的机制的作用在于获取执行时才知道的类(Class)及当中的属性(Field).方法(Method)以及调用当中的 ...

  4. GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图)[转]

    WGS-84:是国际标准,GPS坐标(Google Earth使用.或者GPS模块)GCJ-02:中国坐标偏移标准,Google Map.高德.腾讯使用BD-09:百度坐标偏移标准,Baidu Map ...

  5. spring中<tx:advice></tx:advice>是什么意思

    <tx:advice id="tv" transaction-manager="transactionManager"> <tx:attrib ...

  6. 移植X264成功

    http://blog.csdn.net/mashang123456789/article/details/8673426 http://blog.csdn.net/b5w2p0/article/de ...

  7. C#操作Excel初探

        近期一段时间正好在做winform导出Excel报表的问题,学习了一下C#操作Excel的一些方法(如:向Excel中插入图片:删除Excel指定sheet中的某行或某列,在Excel指定的单 ...

  8. 浅谈 js 语句块与标签

    原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象 ...

  9. monoTouch for android visual studio c#开发

    本人  c# 程序员,第一次配置环境 按照此流程安装   http://www.wuleba.com/18892.html 本次下载的 8 个安装程序,我是安装以上顺序安装的,分别标志为1至8,暂时不 ...

  10. Web API 2:Action的返回类型

    Web API 2:Action的返回类型 Web API控制器中的Action方法有如下几种返回类型: void HttpResponseMessage IHttpActionResult 其它类型 ...