支付宝集成时的InvalidKeySpecException
近来在集成第三方支付---支付宝,在集成的过程中严格按照支付宝开发者平台所发布的说明文档和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的更多相关文章
- iOS支付宝集成时遇到的问题整理(2)
1.集成支付宝SDK编译报错#include<openssl/asn1.h>这一行 “openssl/asn1.h”file not found 解决方法:在BuildSetting 里 ...
- iOS支付宝集成时遇到的问题整理(1)
1.模拟器上运行正常,但是真机调试时报编译链接错误 :ld: '/Users/wangqipeng/Desktop/iOS支付宝官方文档/AlixPayDemo/libcrypto.a(bio_lib ...
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- 支付宝集成SDK 报错
1.打开Demo中的错误 这是路径错误导致 解决办法:在Build Settings 中找到 Library Search Paths ,去掉其中的 /// 2.自己集成支付宝SDK时的错误 这个也是 ...
- iOS开发之支付宝集成
项目中要用到支付功能,需要支付宝,微信,银联三大支付,所以打算总结一下,写两篇文章,方便以后的查阅, 大家在做的时候也能稍微参考下,用到的地方避免再次被坑.这是第二篇支付宝集成,第一篇银联支付在这里. ...
- iOS开发过程中 xcode文件与Finder中文件保持一致 + 支付宝集成出错
目录 环境 前言 1.使用 Gem 安装 synx 2.直接在终端 Terminal 中开始使用 3.在使用的时候还可以加参数来实现不同的功能 4.解决项目中出现的一些 error 环境 OS X 1 ...
- EhCache WebCache 与 SpringMVC集成时 CacheManager冲突的问题
转自:点击打开链接 http://www.cnblogs.com/daxin/p/3560989.html EhCache WebCache 与 SpringMVC集成时 CacheManager冲突 ...
- iOS支付宝集成详细流程
实现支付宝支付的准备工作: 1.向支付宝签约,成为支付宝的商户 签约完成后,支付宝会提供一些必要的数据给我们 商户ID:partner 账号ID:seller 即支付宝账号 签约需要营业执照 2.获取 ...
- struts2与spring集成时action的class属性值意义
struts2单独使用时action由struts2自己负责创建:与spring集成时,action实例由spring负责创建(依赖注入).这导致在两种情况下struts.xml配置文件的略微差异. ...
随机推荐
- python派QQ邮件
#encoding=utf-8 __author__ = 'ds' #文件名冲突 from email.mime.text import MIMEText import smtplib if __na ...
- JQuery插件开发初探——结构熟悉
工作之余,对Jquery插件做了一点尝试,想着之前总用别人写的插件,自己要是也写一个用岂不是很cool.于是说干就干,动手开始写. 首先是模仿,从一个简单的功能进行入手,了解一下插件开发的流程和结构. ...
- Java中间(三十五)-----Java详细设置(一个):请指定初始容量设置
集合是我们在Java编程中使用很广泛的,它就像大海,海纳百川,像万能容器,盛装万物.并且这个大海,万能容器还能够无限变大(假设条件同意). 当这个海.容器的量变得很大的时候,它的初始容量就会显得很重要 ...
- Lucene40PostingWriter
控制freq和prox这两个文件的输出,比较简单. 默认skip interval这是16,max skip level这是10. 由源或使用可见VInt编码(而不是速度的传奇PForDelta). ...
- Microservice架构模
Microservice架构模 在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices& ...
- 无效 URI: 故障分析证书颁发机构/主机
无效 URI: 分析证书颁发机构/主机 出现该错误的原因是URL中少了一个斜杠.正常的URL是"http:"后边有两个斜杠,而我在改动配置文件里的URL的IP地址部分时.不小心删掉 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2): ...
- 重写ArcGIS的TiledMapServiceLayer呼叫世界地图图块
require(["esri/layers/TiledMapServiceLayer"], function () { dojo.declare("com.Str ...
- 教你Ant安装和配置
Ant它是基于Java施工工具,它的主要作用是产生能够运行Java计划,把握Ant一些功能可以使项目更专业. 忙乱,可以在这里下载2014年8最近一个月Ant http://download.csdn ...
- Scriptcase演示程序,现在,他们使用SC多么简单的开发系统
Scriptcase它内置了一批成熟的业务系统,我们的系统的一部分已经完成和功能微调,在互联网上.检查每个人Scriptcase如何简单可以加速的功能模块的发展. 访问 http://www.phps ...