支付宝集成时的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配置文件的略微差异. ...
随机推荐
- kendo ui 单击取消编辑数据grid减少的原因和治疗方法的数据
kendo ui单击取消编辑数据buttongrid数据缩减.原因grid编辑数据追打datasorce于data寻找阵列数据的存在.假定有不会加入,加入缺席. 首先一个样本: html代码: < ...
- Android相框 与 源代码结构
一. Android 相框 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android执行环境层; -- 应用框架层; -- 应 ...
- 【转】细说 Form (表单)
阅读目录 开始 简单的表单,简单的处理方式 表单提交,成功控件 多提交按钮的表单 上传文件的表单 MVC Controller中多个自定义类型的传入参数 F5刷新问题并不是WebForms的错 以Aj ...
- 2014鞍山直播比赛H称号HDU5077(DFS修剪+通过计)
NAND Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Sub ...
- java 字符串反转
描述:给我一个字符串,例如I love java,输出: java love I 方法一 public class StringReverse { public void swap(char[] ...
- STL慎重选择删除元素的
一.要删除容器中有特定值的全部对象 1.假设容器是vector.string或deque.则使用erase-remove习惯使用方法.比如: vector<int> c; c.era ...
- MVC EF 修改 封装类 通用泛型方法(一)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- Linux 经常使用 性能 检测 命令 说明
1.uptime [root@smgsim02 ~]# uptime 15:08:15 up 98 days, 4:19, 2 users, load average: 0.07, 0.29, ...
- linux 安装httpd(验证通过)
一.安装apache(http服务) 1. 从apache.org下载源码安装包 2. 解压缩 # tar zxf httpd-2.2.4.tar.gz # cd httpd-2.2.4 3. 安装a ...
- Windows下一个ROracle安装与使用
ROracle一个简短的引论: ROracle这是R连接到接入Oracle数据库DBI(Oracledatabase interface)介面.这是基于OCI一个DBI兼容Oracle司机. 具体见说 ...