转-android 支付宝SDK集成
http://blog.csdn.net/kroclin/article/details/40746779
一、前言
最近做的项目刚好要集成支付宝,上网找了很多资料,介绍得感觉不是很全面,所以我经过这两天的集成,顺便记录下来,学习交流。需要的朋友也可以看看。主要集成还是参照了官方给出的demo,再参照demo进行封装,现在使用起来变得方便好多。而且文章里面还提到了集成过程中遇到的一些问题,当然最后也都解决了。
二、准备工作
支付宝开放平台上面也明确了,目前仅仅支持企业用户申请,所以个人开发者就没法使用到。希望支付宝早日可以开放给个人开发者。
支付宝的集成是相对比较麻烦,其中涉及到了很多东西要弄,要生成私钥公钥等等。文档里面也有详细说到如何如何生成那些东西,不过就是文档的内容量有点多了,看起来总抓不住前后,这里我稍作整理,把android需要用到的提取出来了。
1、PID
首先说一下就是支付宝的支付是这样的,企业用户申请了支付宝之后,支付宝就会提供一个合作者id,就是所谓的pid,是2088开头的16位纯数字;
2、支付宝账户
这个就是你用于收款用的支付宝账号,要跟申请时候同一个。
以下几个要运行我附件中的“移动支付接口智能SDK版"中,\openssl\bin文件夹下面的openssl.exe生成,这个是由支付宝提供的
3、RSA私钥:genrsa -out rsa_private_key.pem 1024
运行完命令行可以看到bin文件夹下面会生成私钥
4、RSA公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
运行完命令行后可以看到生成了公钥
5、PKCS8编码的私钥:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
运行完后,将生成的东西拷贝下来放到文本文件里面就行。这后面要用到的!!包括begin跟end那两句一起存起来
三、支付过程
需要进行再封装的主要有下面这个类,做几点说明,AliPayParamsBO是我封装的一个实体类,因为我把刚刚上面讲到的那些PID、私钥啊等等都放在服务端了,这样会比较安全,就算别人反编译了你的项目,那也看不到什么东西,支付宝官方也是这样建议的。测试的时候,可以把这个AliPayParamsBO类,装进你生成的那些参数去测试就好啦,至于OrderBO类,也是我封装的一个类,里面主要包含的是这个订单相关的一些东西,比如商品名称、商品介绍,价格等等,这些在支付过程中都是必要的。
而需要强调一点就是,产生这个支付过程中,我先是构造好需要请求的参数,注意一点就是我在createOrderInfo()方法中对参数进行构造,但是 sign、sign_type 两个参数先不要参与,因为这两个参数不需要参与签名,等前面那些参数构造好了之后,签完名再将sign、sign_type 两个参数构造进去,再进行支付。
- import java.io.UnsupportedEncodingException;
- import java.net.URLEncoder;
- import android.os.Handler;
- import android.os.Message;
- import com.alipay.android.app.sdk.AliPay;
- import com.common.ui.BaseActivity;
- import com.common.utils.CLog;
- import com.onecity.cs.bo.AliPayParamsBO;
- import com.onecity.cs.bo.OrderBO;
- /**
- * @author 林楷鹏
- * @description 支付宝相关操作
- * @create 2014-11-1下午12:11:20
- *
- */
- public class AlipayUtil {
- private static final String TAG = "PayActivity";
- public static final int RQF_PAY = 1;
- public static final int RQF_LOGIN = 2;
- public static void pay(final BaseActivity activity, AliPayParamsBO aliPayBO, OrderBO orderBO, final Handler handler){
- try {
- String info = createOrderInfo(orderBO, aliPayBO);
- String sign = Rsa.sign(info, aliPayBO.getPrivate_key_pkcs8());
- sign = URLEncoder.encode(sign, "utf-8");
- info += "&sign=\"" + sign + "\"&" + getSignType();
- CLog.log("ExternalPartner", "start pay");
- // start the pay.
- CLog.log(TAG, "info = " + info);
- final String orderInfo = info;
- new Thread() {
- public void run() {
- AliPay alipay = new AliPay(activity, handler);
- //设置为沙箱模式,不设置默认为线上环境
- //alipay.setSandBox(true);
- String result = alipay.pay(orderInfo);
- CLog.log(TAG, "result = " + result);
- Message msg = handler.obtainMessage();
- msg.what = RQF_PAY;
- msg.obj = result;
- handler.sendMessage(msg);
- }
- }.start();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- /**
- * 封装订单信息
- * @param orderBO
- * @return
- * @throws UnsupportedEncodingException
- */
- private static String createOrderInfo(OrderBO orderBO, AliPayParamsBO aliPayBO)
- throws UnsupportedEncodingException {
- StringBuilder sb = new StringBuilder();
- sb.append("partner=\"");
- sb.append(aliPayBO.getPid());
- sb.append("\"&out_trade_no=\"");
- sb.append(orderBO.getOrder_sn());
- sb.append("\"&subject=\"");
- sb.append(orderBO.getSubject());
- sb.append("\"&body=\"");
- sb.append(orderBO.getBody());
- sb.append("\"&total_fee=\"");
- sb.append(/*orderBO.getAmount()*/"0.01");
- sb.append("\"¬ify_url=\"");
- // 网址需要做URL编码
- sb.append(URLEncoder.encode(aliPayBO.getNotify_url(), "utf-8"));
- sb.append("\"&service=\"mobile.securitypay.pay");
- sb.append("\"&_input_charset=\"UTF-8");
- sb.append("\"&return_url=\"");
- sb.append(URLEncoder.encode("http://m.alipay.com", "utf-8"));
- sb.append("\"&payment_type=\"1");
- sb.append("\"&seller_id=\"");
- sb.append(aliPayBO.getAccount());
- // 如果show_url值为空,可不传
- // sb.append("\"&show_url=\"");
- sb.append("\"&it_b_pay=\"1m");
- sb.append("\"");
- return new String(sb);
- }
- /**
- * 获取sign_type参数信息,因为该参数不需要参加签名
- * @return
- */
- private static String getSignType() {
- return "sign_type=\"RSA\"";
- }
- }
遇到的问题:整个过程还是比较顺利的,一开始我是使用了4.0系统的手机进行测试,也能够正常使用。但是跑给同事手机之后,问题出现了,居然出现了。。点击支付的时候始终唤不起支付页面,还报了 failure calling remote service 异常,然后就挺纳闷,查了代码发现好像没啥问题。
马上去打印log,看到了如下问题:
看了以上异常信息之后我的第一反应就是难道我的私钥弄错了,但想想4.0还是没问题的啊。后来就追查到了代码中,就在Rsa类中的sign方法,这是支付宝给出的类,我就在异常中将异常信息打印出来,果真
还是编码问题。
- public static String sign(String content, String privateKey) {
- String charset = "UTF-8";
- try {
- PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
- Base64.decode(privateKey));
- KeyFactory keyf = KeyFactory.getInstance("RSA");
- PrivateKey priKey = keyf.generatePrivate(priPKCS8);
- java.security.Signature signature = java.security.Signature
- .getInstance(SIGN_ALGORITHMS);
- signature.initSign(priKey);
- signature.update(content.getBytes(charset));
- byte[] signed = signature.sign();
- return Base64.encode(signed);
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("Exception="+e.getMessage());
- }
- return null;
- }
然后我就突然想到了上面生成的 “PKCS8编码的私钥”,然后将刚刚上面那个AlipayUtil类的pay方法里面的
- String sign = Rsa.sign(info, aliPayBO.getPrivate_key_pkcs8());
签名时用的就是 “PKCS8编码的私钥”(原本出问题是用到RSA私钥),代码中改过来了。这次就行了啦,无论4.0以下还是以上通杀。界面如下:
好啦,客户端的集成大概就是这样,其他相关的类是按照支付宝demo里面的,就不要展示出来了,需要的到代码下载里面去下载就ok啦~
转-android 支付宝SDK集成的更多相关文章
- Android支付宝SDK开发笔记
一.准备工作 〉1.下载开发包 https://b.alipay.com/order/productDetail.htm?productId=2014110308141993&tabId=4# ...
- 支付宝sdk集成,报系统繁忙 请稍后再试(ALI64)
移动快捷支付,往往需要集成支付宝的sdk,集成的过程相对简单,只要按照支付宝的文档,进行操作一般不会出问题. 下面主要说明一下,集成sdk后报"系统繁忙 请稍后再试(A ...
- 支付宝SDK集成加密库迁移错误问题
最近项目中集成了第三方支付,主要有微信支付和支付宝支付,当然这里我主要想说一下关于集成支付宝支付. 首先从支付宝开发者网站上下载下来了SDK以及DEMO,我们就可以根据DEMO进行分析以及集成.支付宝 ...
- 支付宝sdk集成过程中报 openssl/asn1.h file not found错误的解决办法
当你把文件导入到了这个工程目录下 :项目名称/library/Alipay/openssl ,中间是隔了几个文件夹 的 那么在Header Search Paths 的设置就得改为 $(SRC ...
- 支付宝sdk集成
支付宝开放平台 http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1 集成步骤: 1. ...
- 海豚星空扫码投屏 Android 接收端 SDK 集成 六步骤
一 跟目录的build.gradle添加私有mevan仓库 maven {url 'http://nexus.dolphinstar.cn/repo/openmavenx'} 二 app/build. ...
- 大叔也说Xamarin~Android篇~支付宝SDK的集成
回到目录 首先做为支付宝SDK它提供了多种平台,网页版,wap版,IOS版,android版等等,今天主要说一下在xamarin里使用android平台的sdk的方法,在网上介绍这块的文章不多,大叔本 ...
- Kotlin与Android SDK 集成(KAD 05)
作者:Antonio Leiva 时间:Dec 19, 2016 原文链接:https://antonioleiva.com/kotlin-integrations-android-sdk/ 使用Ko ...
- 【笔记】android sdk集成的eclipse中导入项目
android sdk集成的eclipse中导入项目 想要把旧的ADT项目,一模一样的导入进来,需要: 1.把项目放到,非当前ADT的workspace目录下: 2.从Project中Import,选 ...
随机推荐
- glsl计算sprite的亮度饱和度对比度
//glsl计算sprite的亮度饱和度对比度 #ifdef GL_ES precision mediump float; #endif uniform sampler2D u_texture; va ...
- objective-c new关键字
xxx *a = [xxx new] 等价于 xxx *a = [[xxx alloc]init] ,但如果类的构造函数带参数就不能使用new了. 练习了下<Objective-C 基础教程&g ...
- HTML 5 canvas —— 基本语法
目录 简述 canvas 基础 2D context API 基本线条 路径 插入图像 像素级操作 文字 阴影 颜色渐变 小节 简述 HTML 5 规范引进了很多新特性,其中最令人期待的之一就是 ca ...
- rsyslog日志服务的配置文件分析
基于rsyslog日志服务的日志 在不同的LINUX系统,实现的软件略有不同. syslog,rsyslog,syslog-ng,用于实现系统日志的管理. [root@asianux4 ~]# rpm ...
- 【转】关于B/S架构应用程序的权限设置分析和总结
来自:http://www.cnblogs.com/zhouxunyu/p/3790122.html 分析:不同的用户登录到系统后赋予不同的操作权限,而用户存在于数据库中,标识用户权限的字段也保存在数 ...
- StringBuilder与StringBuffer的区别(转)
相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...
- 利用Java Service Wrapper将java项目添加到windows服务中
1.web项目,即tomcat/resin添加至window系统服务,步骤如下:第一步:找到tomcat的bin目录,如:D:\apache-tomcat-8.0.26\bin第二步:打开cmd,cd ...
- tomcat内存修改 解决内存溢出异常
有时候tomcat刚解压完,部署项目后运行会报内存溢出的错误. 原因:项目过大,tomcat内存小. 解决:找到[tomcat]/bin/catlina.bat文件,打开: 在@echo off上面( ...
- HDP2.4安装(二):Centos7配置
Centos7 Minimal Install 安装完成后是不支持上网的,并且大部分常用的软件也未安装,首先要解决的问题就是网络配置.当网络配通后,即可通过Xshell或其它工具来远程进行操作与管理, ...
- centos curl版本nss改成openssl
在centos 6.2的系统里面的curl支持的https是nss版本的,而不是openssl的,所以在php使用curl访问https的时候会报Unable to load client key - ...