转-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 两个参数构造进去,再进行支付。

[java] view plaincopy

  1. import java.io.UnsupportedEncodingException;
  2. import java.net.URLEncoder;
  3. import android.os.Handler;
  4. import android.os.Message;
  5. import com.alipay.android.app.sdk.AliPay;
  6. import com.common.ui.BaseActivity;
  7. import com.common.utils.CLog;
  8. import com.onecity.cs.bo.AliPayParamsBO;
  9. import com.onecity.cs.bo.OrderBO;
  10. /**
  11. * @author 林楷鹏
  12. * @description 支付宝相关操作
  13. * @create 2014-11-1下午12:11:20
  14. *
  15. */
  16. public class AlipayUtil {
  17. private static final String TAG = "PayActivity";
  18. public static final int RQF_PAY = 1;
  19. public static final int RQF_LOGIN = 2;
  20. public static void pay(final BaseActivity activity, AliPayParamsBO aliPayBO, OrderBO orderBO, final Handler handler){
  21. try {
  22. String info = createOrderInfo(orderBO, aliPayBO);
  23. String sign = Rsa.sign(info, aliPayBO.getPrivate_key_pkcs8());
  24. sign = URLEncoder.encode(sign, "utf-8");
  25. info += "&sign=\"" + sign + "\"&" + getSignType();
  26. CLog.log("ExternalPartner", "start pay");
  27. // start the pay.
  28. CLog.log(TAG, "info = " + info);
  29. final String orderInfo = info;
  30. new Thread() {
  31. public void run() {
  32. AliPay alipay = new AliPay(activity, handler);
  33. //设置为沙箱模式,不设置默认为线上环境
  34. //alipay.setSandBox(true);
  35. String result = alipay.pay(orderInfo);
  36. CLog.log(TAG, "result = " + result);
  37. Message msg = handler.obtainMessage();
  38. msg.what = RQF_PAY;
  39. msg.obj = result;
  40. handler.sendMessage(msg);
  41. }
  42. }.start();
  43. } catch (Exception ex) {
  44. ex.printStackTrace();
  45. }
  46. }
  47. /**
  48. * 封装订单信息
  49. * @param orderBO
  50. * @return
  51. * @throws UnsupportedEncodingException
  52. */
  53. private static String createOrderInfo(OrderBO orderBO, AliPayParamsBO aliPayBO)
  54. throws UnsupportedEncodingException {
  55. StringBuilder sb = new StringBuilder();
  56. sb.append("partner=\"");
  57. sb.append(aliPayBO.getPid());
  58. sb.append("\"&out_trade_no=\"");
  59. sb.append(orderBO.getOrder_sn());
  60. sb.append("\"&subject=\"");
  61. sb.append(orderBO.getSubject());
  62. sb.append("\"&body=\"");
  63. sb.append(orderBO.getBody());
  64. sb.append("\"&total_fee=\"");
  65. sb.append(/*orderBO.getAmount()*/"0.01");
  66. sb.append("\"¬ify_url=\"");
  67. // 网址需要做URL编码
  68. sb.append(URLEncoder.encode(aliPayBO.getNotify_url(), "utf-8"));
  69. sb.append("\"&service=\"mobile.securitypay.pay");
  70. sb.append("\"&_input_charset=\"UTF-8");
  71. sb.append("\"&return_url=\"");
  72. sb.append(URLEncoder.encode("http://m.alipay.com", "utf-8"));
  73. sb.append("\"&payment_type=\"1");
  74. sb.append("\"&seller_id=\"");
  75. sb.append(aliPayBO.getAccount());
  76. // 如果show_url值为空,可不传
  77. // sb.append("\"&show_url=\"");
  78. sb.append("\"&it_b_pay=\"1m");
  79. sb.append("\"");
  80. return new String(sb);
  81. }
  82. /**
  83. * 获取sign_type参数信息,因为该参数不需要参加签名
  84. * @return
  85. */
  86. private static String getSignType() {
  87. return "sign_type=\"RSA\"";
  88. }
  89. }

遇到的问题:整个过程还是比较顺利的,一开始我是使用了4.0系统的手机进行测试,也能够正常使用。但是跑给同事手机之后,问题出现了,居然出现了。。点击支付的时候始终唤不起支付页面,还报了 failure calling remote service 异常,然后就挺纳闷,查了代码发现好像没啥问题。

马上去打印log,看到了如下问题:

看了以上异常信息之后我的第一反应就是难道我的私钥弄错了,但想想4.0还是没问题的啊。后来就追查到了代码中,就在Rsa类中的sign方法,这是支付宝给出的类,我就在异常中将异常信息打印出来,果真

还是编码问题。

[java] view plaincopy

  1. public static String sign(String content, String privateKey) {
  2. String charset = "UTF-8";
  3. try {
  4. PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
  5. Base64.decode(privateKey));
  6. KeyFactory keyf = KeyFactory.getInstance("RSA");
  7. PrivateKey priKey = keyf.generatePrivate(priPKCS8);
  8. java.security.Signature signature = java.security.Signature
  9. .getInstance(SIGN_ALGORITHMS);
  10. signature.initSign(priKey);
  11. signature.update(content.getBytes(charset));
  12. byte[] signed = signature.sign();
  13. return Base64.encode(signed);
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. System.out.println("Exception="+e.getMessage());
  17. }
  18. return null;
  19. }

然后我就突然想到了上面生成的  “PKCS8编码的私钥”,然后将刚刚上面那个AlipayUtil类的pay方法里面的

[java] view plaincopy

  1. String sign = Rsa.sign(info, aliPayBO.getPrivate_key_pkcs8());

签名时用的就是 “PKCS8编码的私钥”(原本出问题是用到RSA私钥),代码中改过来了。这次就行了啦,无论4.0以下还是以上通杀。界面如下:

好啦,客户端的集成大概就是这样,其他相关的类是按照支付宝demo里面的,就不要展示出来了,需要的到代码下载里面去下载就ok啦~

时间: 2024-10-11 11:24:11

转-android 支付宝SDK集成的相关文章

android 支付宝SDK集成

一.前言 最近做的项目刚好要集成支付宝,上网找了很多资料,介绍得感觉不是很全面,所以我经过这两天的集成,顺便记录下来,学习交流.需要的朋友也可以看看.主要集成还是参照了官方给出的demo,再参照demo进行封装,现在使用起来变得方便好多.而且文章里面还提到了集成过程中遇到的一些问题,当然最后也都解决了. 二.准备工作 支付宝开放平台上面也明确了,目前仅仅支持企业用户申请,所以个人开发者就没法使用到.希望支付宝早日可以开放给个人开发者. 支付宝的集成是相对比较麻烦,其中涉及到了很多东西要弄,要生成

支付宝sdk集成问题汇总解决

集成支付宝SDK 第一步:按照支付宝集成流程操作. 第二步: 但是按照官方文档还是有问题  :  找不到<openssl/asn1.h>文件 自己集成支付宝SDK时的错误 2.缺少 #include <openssl/asn1.h> 这个是路径错误, 解决方法如下:在你的Xcode里的header search paths 里添加支付宝SDK(openssl的路径):格式如下  $(PROJECT_DIR)/文件夹名         (这里说一下,直接点击openssl,然后sho

Android支付宝SDK开发笔记

一.准备工作 〉1.下载开发包 https://b.alipay.com/order/productDetail.htm?productId=2014110308141993&tabId=4#ps-tabinfo-hash 压缩包下的"支付宝钱包支付接口开发包"中即有Andoid使用支付宝的JAR和Demo 〉2.创建支付宝应用 在支付宝开放平台申请创建应用 https://open.alipay.com/index.htm 支付宝平台的应用创建仅限于公司实名认证用户,个人帐号

支付宝sdk集成

支付宝开放平台 http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1 集成步骤: 1.把所需动动拖到项目中(有两个 .a文件别忘了哈,第一次我就忘了,愣是调试半个下午,眼睛不聚光也是硬伤啊) 2.添加类库(最好参照官方demo,14个) 3.在pch中添加下面两个库并添加路径 #import <UIKit/UIKit.h> #import <Foundation/Founda

大叔也说Xamarin~Android篇~支付宝SDK的集成

首先做为支付宝SDK它提供了多种平台,网页版,wap版,IOS版,android版等等,今天主要说一下在xamarin里使用android平台的sdk的方法,在网上介绍这块的文章不多,大叔本着贡献的精神继续撰写程序人生!希望各位继续支持大叔! 一 首先下面支付宝android的sdk,也就是手机端的sdk,一般也叫快捷支付 https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1 里面有各种平台

android 支付宝集成 使用常见错误

1:自己最近在做了支付,遇到了一下问题先总结如下 第一条: Android快捷支付SDK Demo resultStatus={4001};memo={参数错误};result={}问题 分析:填写的支付宝pkcs8编码的私钥 有问题,或者对应的公钥没有上传至支付宝造成的. 后台处理的必须有这个步骤.上传公钥到支付宝 第二条: java.lang.NoClassDefFoundError: com.alipay.android.app.lib.ResourceMap 分析:没有加入android

Android移动开发-集成调用支付宝支付开发的实现

如今移动支付比较火,尤其是在中国的市场.移动支付也称为手机支付,就是允许用户使用其移动终端(通常是手机)对所消费的商品或服务进行账务支付的一种服务方式.单位或个人通过移动设备.互联网或者近距离传感直接或间接向银行金融机构发送支付指令产生货币支付与资金转移行为,从而实现移动支付功能.移动支付将终端设备.互联网.应用提供商以及金融机构相融合,为用户提供货币支付.缴费等金融业务. 谈到移动支付,不得不说阿里旗下的蚂蚁金融的支付以及腾讯旗下的微信支付.那么现在在就谈谈如何Android项目里集成调用支付

集成支付宝SDK流程

5.2 SDK集成流程 5.2.1 iOS 解压接口压缩文件(文件名是 WS_MOBILE_PAY_SDK_BASE.zip),找到iOS的压缩文件(文件名是支付宝移动支付SDK 标准版(iOS).zip). 1. 导入代码 步骤1:  启动IDE(如Xcode),把iOS包中的压缩文件中以下文件拷贝到项目文件夹下, 并导入到项目工程中. AlipaySDK.bundle AlipaySDK.framework 步骤2:  在需要调用AlipaySDK的文件中,增加头文件引用. #import

Kotlin与Android SDK 集成(KAD 05)

作者:Antonio Leiva 时间:Dec 19, 2016 原文链接:https://antonioleiva.com/kotlin-integrations-android-sdk/ 使用Kotlin语言不仅仅简化你的代码,而且也可以简化从Kotlin调用Java代码. 这是怎样工作的?简单地使用一些通用结构就可以得到Kotlin的感觉. 在这篇文章中,你将看到一些例子,它是怎样提升相同代码.它也预防Java代码包含模板部分. Kotlin与Android SDK 集成 如Android