Android接入支付宝和银联
支付宝接入参考链接:https://software.intel.com/zh-cn/node/542608
银联接入参考链接:http://blog.csdn.net/gf771115/article/details/41935683

银联支付相关问题记录:
1、我们看文档知道客户端使用银联(Android、IOS)需要有一个获取TN的接口。
2、我们来看银联支付返回回来的逻辑。代码如下:
/*
* 支付控件返回字符串:success、fail、cancel 分别代表支付成功,支付失败,支付取消
*/
String str = data.getExtras().getString("pay_result");
if (str.equalsIgnoreCase("success")) {
// 支付成功后,extra中如果存在result_data,取出校验
// result_data结构见c)result_data参数说明
if (data.hasExtra("result_data")) {
String result = data.getExtras().getString("result_data");
try {
JSONObject resultJson = new JSONObject(result);
String sign = resultJson.getString("sign");
String dataOrg = resultJson.getString("data");
// 验签证书同后台验签证书
// 此处的verify,商户需送去商户后台做验签
boolean ret = RSAUtil.verify(dataOrg, sign, mMode);
if (ret) {
// 验证通过后,显示支付结果
payStatus(true);
} else {
// 验证不通过后的处理
// 建议通过商户后台查询支付结果
payStatus(false);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
// 未收到签名信息
// 建议通过商户后台查询支付结果
payStatus(true);
}
} else if (str.equalsIgnoreCase("fail")) {
payStatus(false);
} else if (str.equalsIgnoreCase("cancel")) {
payStatus(false);
}
}
我们看代码的第16行,我们看到在pay_result返回success后,还需要将证书与后台的商户进行验签。这个逻辑应该是最近版本的银联加上的。我看过老版本的没有这一步。测试的时候支付成功后,我们发现验证不通过,所以还是显示支付失败。那么显然是verify方法中的哪一步出现了问题。我们跟下去,看到了下面的代码:
public static PublicKey getPublicKeyProduct() {
// 请将此处的module换成生产环境商户验签的公钥模数
//String modulus = "24882698307025187401768229621661046262584590315978248721358993520593720674589904440569546585666019820242051570504151753011145804842286060932917913063481673780509705461614953345565639235206110825500286080970112119864280897521494849627888301696007067301658192870705725665343356870712277918685009799388229000694331337917299248049043161583425309743997726880393752539043378681782404204317246630750179082094887254614603968643698185220012572776981256942180397391050384441191238689965500817914744059136226832836964600497185974686263216711646940573711995536080829974535604890076661028920284600607547181058581575296480113060083";
String modulus="24882698307025187401768229621661046262584590315978248721358993520593720674589904440569546585666019820242051570504151753011145804842286060932917913063481673780509705461614953345565639235206110825500286080970112119864280897521494849627888301696007067301658192870705725665343356870712277918685009799388229000694331337917299248049043161583425309743997726880393752539043378681782404204317246630750179082094887254614603968643698185220012572776981256942180397391050384441191238689965500817914744059136226832836964600497185974686263216711646940573711995536080829974535604890076661028920284600607547181058581575296480113060083";
String publicExponent = "65537";
PublicKey publicKey = RSAUtil.generateRSAPublicKey(modulus,
publicExponent);
return publicKey;
}
我们看到需要将公钥模数进行替换。起初找了好久没有找到公钥模数。后来发现将生成环境下的证书的信息读取出来就可以获取公钥模数,替换即可。读取证书信息的Java代码如下:
public static void main(String[] args){
try {
CertificateFactory certificatefactory=CertificateFactory.getInstance("X.509");
FileInputStream bais=new FileInputStream("d:/aa.cer");
X509Certificate Cert = (X509Certificate)certificatefactory.generateCertificate(bais);
RSAPublicKey pk = (RSAPublicKey) Cert.getPublicKey();
sun.security.rsa.RSAPublicKeyImpl ppk = (sun.security.rsa.RSAPublicKeyImpl) pk;
System.out.println(ppk.getModulus());//获取公钥模数
System.out.println(ppk.getPublicExponent());
System.out.println(ppk.getAlgorithm());
System.out.println(ppk.getFormat());
System.out.println(ppk.getAlgorithmId());
System.out.println(ppk.getModulus().toString(16));
System.out.println(ppk.getPublicExponent().toString(16));//
System.out.println(new BigInteger(ppk.getEncoded()).toString(16));
}catch (Exception e) {
e.printStackTrace();
}
}
Android接入支付宝和银联的更多相关文章
- Android 接入支付宝支付实现
接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...
- Android接入支付宝支付实现
接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...
- Android接入支付宝和微信支付
然后把下载下来的aar包,放到项目目录下面的libs目录下,通过下面的gradle依赖进来 // 支付宝 SDK AAR 包所需的配置compile(name: 'alipaySdk-15.6.0-2 ...
- IOS开发之—— iOS 支付 [支付宝、银联、微信]
支付宝iOSsdk官方下载sdk地址:https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId ...
- 支付sdk —— 该组件为封装了 微信,支付宝,银联支付
[精品] 支付组件 简要说明该组件为封装了 微信,支付宝,银联支付, 一键快速集成,几行代码即可集成 微信,支付宝,银联支付. ## 示例: # 测试账号:1.银联支付:提供测试使用卡号.手机号信息 ...
- iOS-iOS 支付 [支付宝、银联、微信](转)
支付宝iOSsdk官方下载sdk地址:https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId ...
- cocos2dx工程中接入支付宝sdk
1. 首先去支付宝官网下载开发者文档 2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图: (1)将从支付宝官方网站获得的支付宝的sdk的jar包拷贝到工程中的lib ...
- 【PHP后台】接入支付宝
我使用PHP主要是为客户端做后台使用,并不会做前端网页. 这两天因为公司项目需要,必须接入支付功能,而支付宝当然首当其冲,考虑迭代版本的需要,首先接入支付宝功能,其他的支付功能以后迭代版本的时候 ...
- iOS 支付 [支付宝、银联、微信]
这是开头语 前不久做了一个项目,涉及到支付宝和银联支付,支付宝和银联都是业界的老大哥,文档.SDK都是很屌,屌的找不到,屌的看不懂,屌到没朋友(吐槽而已),本文将涉及到的最新可用SDK.文档,以及本人 ...
随机推荐
- 解决UDT中内存下不去的问题
使用UDT库,编写简单的网络通信程序,发现了一个问题,关闭一部分连接后,程序占用内存并没有变化. 比如先连接500个,再连接另500个,先关掉后面500个,程序占用内存降一半,再关 ...
- log4j配置详解
Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...
- Linux 负载监控脚本
#!/bin/bash Date=`echo $(date +%Y\-%m\-%d\ %H:%M:%S)`HostName=`hostname`IP=`ifconfig eth0 | grep &qu ...
- 爬虫(Java实现)
说明: 使用了htmlparser库. 运行过程: 从某个网址开始,摘取网页中的链接,并通过广度搜索,对这些链接递归执行上述操作. 在以上过程中把网址存入数据库中.以防止搜索中出现环路. 但是,程序经 ...
- Freemarker与Springmvc
1.导入springmvc和freemarker的jar包 2.web.xml中配置Spring和Springmvc <?xml version="1.0" encoding ...
- Log4j
[1]从零开始 a). 新建Java Project>>新建package>>新建java类: b). import jar包(一个就够),这里我用的是log4j-1.2.14 ...
- linux 下 sudo 指令不需要输入密码的配置
sudo的配置文件位于 /etc/sudoers 里面.具体操作如下: 打开sudoers文件. bo@engineer ~/ $ sudo nano /etc/sudoers 假定你的用户名为 m ...
- IE6\7\8下placeholder效果,支持文本框和密码框
(function($) { var placeholderfriend = { focus: function(s) { s = $(s).hide().prev().show() ...
- 【UE】关于UE的一个真实案例
看到下面这个页面,你心里是怎么想的?我看到后,我心里会有疑问:咦,是不是程序错了?如果是程序错了,我应该怎么补偿呢?怎么没有刷新按钮? 针对以前几点问题,做以下几点改进: 1.在没有数据时,增加提示, ...
- 14-前端开发之HTML
1. 什么是HTML? HTML (Hyper Text Mark-up Language) 即超文本标记语言,是用来描述网页的一种语言. 它不是一种编程语言,而是一种标记语言 (markup lan ...