一、申请移动支付权限

首先登录【支付宝开放平台】http://open.alipay.com/platform/home.htm,添加应用,申请移动支付权限。申请开通支付,是需要公司文件的,个人是不允许开始支付的。
具体细节就不再详聊了,下面就讲讲如何将阿里给出的demo运行起来。

二、阿里支付DEMO

1、概述

(1)支付调用页面及测试

支付宝在调用时,会首先看本地是不是存在支付宝客户端,如果有的话,就直接调用客户端进行支付,如果没有,则调用jar包中的H5页面支付。
所以在测试时,需要有测试两种情境:有支付宝客户端和没有支付宝客户端的情况。

(2)、客户端与服务器

在demo中大家可以看到,有客户端的demo也有服务端的demo,大家可能觉得需要服务端写好之后,客户端才能集成,其实并不是。整个流程是这样的:
1,APP客户端通过SDK发送支付请求 (客户端处理)
2,SDK支付成功并同步返回支付结果(客户端处理)
3,支付宝服务器向我们的服务器发送支付结果字符串(服务端处理)
客户端:从上面的流程可以看出,服务端只是用来接出异步返回的支付结果的。而支付与同步结果返回都是在客户端可以直接看得到的。所以在集成支付宝支付接口时,主要功能是在客户端,即便服务端没有做集成,也是可能付款成功的。
服务端:服务端只需要添加一个功能:接口支付结果返回

下面几张图显示了整个demo的运行过程,由于没办法在真机上录制gif,所以只能用图片来代替了。
初始化界面:

点击支付后,跳出确认付款界面:

点击确认付款后,跳出输入密码界面:

最后是支付成功界面:

在看DEMO的代码之前,我们需要先配置几个变量:

2、配置几个变量

这部分会对代码中用到的几个变量的找到方法或生成方法进行讲述,部分资料引自支付宝开放平台。

(1)PID

合作者身份ID(PID)是商户与支付宝签约后,商户获得的支付宝商户唯一识别码。当商户把支付宝功能接入商户网站时会用到PID,以便让支付宝认证商户。
查看PID步骤如下:
1、登录支付宝官方网站b.alipay.com
2、点击导航栏中“商家服务”

3、点击“查询PID、Key”

(2)、APPID、APP SECRET和支付宝公钥

在 https://openhome.alipay.com/platform/createApp.htm 页面,创建一个应用

完成之后:在我的应用中是可以看得到的:

然后转到帐户基本信息页面:https://openhome.alipay.com/platform/keyManage.htm

在开放平台密钥栏,可以找到APPID,APP SECRET,和支付宝密钥
这三个数据,都是在应用创建后,支付宝为我们生成好的,无法更改!

(3)、生成商户私钥【windows生成方法】

(有关mac的生成方法,下面会再补充)
1、下载DEMO及SDK
到文档中心,查看移动支付对应的文档,文档地址:http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1
然后,点击(SDK&DEMO下载)下载代码

2、得到原始私钥
在代码中的DEMO/openssl/bin目录下,有openssl.exe文件

打开openssl.exe
输入

[java] view plaincopy
  1. genrsa -out rsa_private_key.pem 1024

得到生成成功的结果,如下图:

此时,我们可以在bin文件夹中看到一个文件名为rsa_private_key.pem的文件

用记事本方式打开它,可以看到-----BEGIN RSA PRIVATE KEY-----开头,-----END RSA PRIVATE KEY-----结尾的没有换行的字符串,这个就是原始的私钥。

但这段原始私钥代码中是用不到的,我们需要将它转化为PKCS8格式
3、转换为PKCS8格式
在openssl.exe中输入:并回车

[java] view plaincopy
  1. pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

得到生成功的结果,这个结果就是PKCS8格式的私钥,如下图:

注意,私钥是红框包括的那部分,是不包含BEGIN PRIVATE KEY和END PRIVATE KEY这两行的。

右键点击openssl窗口上边边缘,选择编辑→标记,选中要复制的文字(如上图),
此时继续右键点击openssl窗口上边边缘,选择编辑→复制,
把复制的内容粘土进一个新的记事本中,可随便命名,只要知道这个是PKCS8格式的私钥即可。

(4)、生成商户私钥【MAC生成方法】

这里来讲一下mac端如何生成用户私钥的,由于mac系统是自带openssl的,所以只需要打开终端,利用cd 命令切到任意一个想存放生成Key的文件夹下:
比如,切到下载目录下

然后运行下面的命令来生成私钥原始密钥

[java] view plaincopy
  1. openssl genrsa -out rsa_private_key.pem 1024

然后运行下面的命令来生成转换的PCKS8格式的命令。

[java] view plaincopy
  1. openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

然后将生成的私钥复制保存起来。
从上面的命令可以看出,与windows相比,mac上需要在前面添加openssl指定运行的是openssl命令。其它命令是完全一致的。

(5)、生成用户公钥及网页填充

1、生成公钥
同样对于windows用户而言,直接在openssl.exe中输入下面的命令:

[java] view plaincopy
  1. rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

同样,如果是Mac的同学,输入的命令应该是如下:

[java] view plaincopy
  1. openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

得到生成成功的结果,如下图:

此时,我们可以在bin文件夹中看到一个文件名为rsa_public_key.pem的文件,用记事本方式打开它,可以看到-----BEGIN PUBLIC KEY-----开头,
-----END PUBLIC KEY-----结尾的没有换行的字符串,这个就是公钥。

在生成网页以后,复制----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----之间的部分,即那段纯代码,不要把----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----给复制进去了。中间的这部分就是公钥。
2、网页填充
然后到https://openhome.alipay.com/platform/keyManage.htm?keyType=partner(需要登录)中,左侧找到合作伙伴密钥栏,再到右侧的RSA加密中,将公钥粘贴进去。由于,我们已经粘贴进去了,所以这里显示查看开发者公钥,在没填之前写的是“添加开发者公钥”

到这里,所有的准备工作都已经结束了。下面就是配置DEMO的过程了

3、配置DEMO

在刚才下载的sdk&demo的源码中,打开DEMO/客户端demo/支付宝Android 15.0.1/alipay_demo工程
路径如下:

在PayDemoActivity中配置几个变量:

[java] view plaincopy
  1. //PID
  2. public static final String PARTNER = "";

在这里填上我们上面找到的PID;

[java] view plaincopy
  1. // 商户收款账号
  2. public static final String SELLER = "76949XXXX@qq.com";

然后在SELLER上写上我们支付宝的登录帐户,即那个你申请移动支付的支付宝账号

[java] view plaincopy
  1. // 支付宝公钥
  2. public static final String RSA_PUBLIC ="";

然后在RSA_PUBLIC这里填上支付宝公钥

[java] view plaincopy
  1. // 商户私钥,pkcs8格式
  2. public static final String RSA_PRIVATE = "";

最后是填上RSA_PRIVATE对应的商户私钥,注意是PKCS8格式的。
私钥这部分,注意是----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----之间的部分,即那段纯代码,不要把----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----给复制进去了。中间的这部分就是公钥。

现在运行demo就直接可以支付了。

本文中对应的DEMO在文章底部给出。

4、代码讲解

通过上面的配置,demo应该就直接可以运行了,但这里所涉及的代码,我们再仔细看看
主要的支付与结果返回就是pay()这个函数,这里完成了支付所需要的所有功能。代码如下:

[java] view plaincopy
  1. public void pay(View v) {
  2. …………
  3. // 订单信息
  4. String orderInfo = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01");
  5. // 对订单做RSA 签名
  6. String sign = sign(orderInfo);
  7. try {
  8. // 仅需对sign 做URL编码
  9. sign = URLEncoder.encode(sign, "UTF-8");
  10. } catch (UnsupportedEncodingException e) {
  11. e.printStackTrace();
  12. }
  13. // 完整的符合支付宝参数规范的订单信息
  14. final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
  15. + getSignType();
  16. Runnable payRunnable = new Runnable() {
  17. @Override
  18. public void run() {
  19. // 构造PayTask 对象
  20. PayTask alipay = new PayTask(PayDemoActivity.this);
  21. // 调用支付接口,获取支付结果
  22. String result = alipay.pay(payInfo);
  23. Message msg = new Message();
  24. msg.what = SDK_PAY_FLAG;
  25. msg.obj = result;
  26. mHandler.sendMessage(msg);
  27. }
  28. };
  29. // 必须异步调用
  30. Thread payThread = new Thread(payRunnable);
  31. payThread.start();
  32. }

这里总是分了四步来完成支付与结果接收。

第一步:构造定单信息:

[java] view plaincopy
  1. String orderInfo = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01");

主要是这句,即在getOrderInfo()函数中完成定单信息的构造:(这里对getOrderInfo函数做的精减,更多字段及意义参考源码)

有关paymethod的方法使用,参考:https://cshall.alipay.com/support/help_detail.htm?help_id=476935
各个字段的意义及取值参考:http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103663&docType=1

[java] view plaincopy
  1. public String getOrderInfo(String subject, String body, String price) {
  2. // 签约合作者身份ID
  3. String orderInfo = "partner=" + "\"" + PARTNER + "\"";
  4. // 签约卖家支付宝账号
  5. orderInfo += "&seller_id=" + "\"" + SELLER + "\"";
  6. // 商户网站唯一订单号
  7. orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";
  8. // 商品名称
  9. orderInfo += "&subject=" + "\"" + subject + "\"";
  10. // 商品详情
  11. orderInfo += "&body=" + "\"" + body + "\"";
  12. // 商品金额
  13. orderInfo += "&total_fee=" + "\"" + price + "\"";
  14. // 服务器异步通知页面路径
  15. orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
  16. + "\"";
  17. …………
  18. return orderInfo;
  19. }

这里就是通过我们的提供的商家ID,产品信息,价格等信息来构造定单及回调页面,这里需要非常注意的一个地方:

[java] view plaincopy
  1. // 服务器异步通知页面路径
  2. orderInfo += "&noify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
  3. + "\"";

服务器异步通知页面路径,首先我们用支付宝支付之后,支付宝会返回给我们两个通知,一个是同步的,就是我们点击支付后支付宝直接反馈给我们客户端的信息,我们可以直接拿到,根据反馈的结果可以初步判定该次交易是否成功,第二个就是服务器异步的通知,这个异步的通知是支付宝的服务器端发给我们服务器端的信息,我们在客户端是直接获取不了的,那支付宝的服务器怎么知道我们服务器的路径呢,那就是这参数的作用了,我们给支付宝服务器一个路径,它就会在订单状态改变的时候给我们服务器端一个反馈,告诉服务器这次交易的状态,如果服务器结果判定该次交易成功了,就必须返给支付宝服务器一个success,要不服务器会一直给我们异步通知,因为它不知道该次交易是否完成了(一般情况下25小时内8次通知,频率一般是2m 10m 10m 1h 2h 6h 15h),我们一般会在收到异步通知时,对订单的状态进行更新。
其它的就不讲了,通过看源码都能看得懂,比如构造订单号啥的。

第二步:对订单字符串做RSA签名

为什么要签名呢?当然是防止传输出错了,这可是跟钱相关的,如果orderInfo传输过程中出错了,那怎么样来校验它是不是出错了呢,只有通过签名算法来了。所以这里就需要对订单字符串做签名。
具体签名算法就不讲了,直接应用到项目中就行,不需要理解,如果想看看怎么实现的,里面有对应的源码,可以去研究一下。

[java] view plaincopy
  1. // 对订单做RSA 签名
  2. String sign = sign(orderInfo);
  3. try {
  4. // 仅需对sign 做URL编码
  5. sign = URLEncoder.encode(sign, "UTF-8");
  6. } catch (UnsupportedEncodingException e) {
  7. e.printStackTrace();
  8. }

第三步:构造完成的请求字符串

在订单字符串和签名做完以后,就可以用他们来构造完整的请求字符串了:

[java] view plaincopy
  1. // 完整的符合支付宝参数规范的订单信息
  2. final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
  3. + getSignType();

第四步:请求与结果返回

最后是发送请求,代码如下:

[java] view plaincopy
  1. Runnable payRunnable = new Runnable() {
  2. @Override
  3. public void run() {
  4. // 构造PayTask 对象
  5. PayTask alipay = new PayTask(PayDemoActivity.this);
  6. // 调用支付接口,获取支付结果
  7. String result = alipay.pay(payInfo);
  8. Message msg = new Message();
  9. msg.what = SDK_PAY_FLAG;
  10. msg.obj = result;
  11. mHandler.sendMessage(msg);
  12. }
  13. };
  14. // 必须异步调用
  15. Thread payThread = new Thread(payRunnable);
  16. payThread.start();

最关键的部分在这里:

[java] view plaincopy
  1. PayTask alipay = new PayTask(PayDemoActivity.this);
  2. // 调用支付接口,获取支付结果
  3. String result = alipay.pay(payInfo);
  4. Message msg = new Message();
  5. msg.what = SDK_PAY_FLAG;
  6. msg.obj = result;
  7. mHandler.sendMessage(msg);

在String result = alipay.pay(payInfo);中,就直接获得了支付结果;
然后通过handler将结果发送出去。
这就是同步的方式获取支付结果的方式。

好了,有关支付宝对接的方法全部都在这了。至于getOrderInfo函数里,使用的调用银行卡支付,我觉得也没啥用,在我们程序里也没接上。

转自:http://blog.csdn.net/harvic880925/article/details/49779061

支付宝集成过程详解-android相关推荐

  1. 简诉android源代码编译过程,详解Android源码的编译

    在这里我们将介绍的是Android源码的编译,主要基于Android 1.0环境下.希望对大家有所帮助. 本文将为大家介绍的是如何设置Android源码的编译环境,包括Linux下的配置.主要基于An ...

  2. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  3. Android签名机制之---签名验证过程详解

    一.前言 今天是元旦,也是Single Dog的嚎叫之日,只能写博客来祛除寂寞了,今天我们继续来看一下Android中的签名机制的姊妹篇:Android中是如何验证一个Apk的签名.在前一篇文章中我们 ...

  4. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

  5. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  6. Android init.rc文件解析过程详解(一)

        Android init.rc文件解析过程详解(一) 一.init.rc文件结构介绍 init.rc文件基本组成单位是section, section分为三种类型,分别由三个关键字(所谓关键字 ...

  7. android 实现定时任务,Android 实现定时任务的过程详解

    在Android开发中,通过以下三种方法定时执行任务: 一.采用Handler与线程的sleep(long)方法(不建议使用,java的实现方式) 二.采用Handler的postDelayed(Ru ...

  8. php android 图片上传,android上传图片到PHP的过程详解

    这篇文章主要介绍了android上传图片到PHP的过程详解,需要的朋友可以参考下 今天在做上传头像的时候,总是提交连接超时错误,报错信息如下:XXXXXXSokcetTimeOutXXXXXXXX 然 ...

  9. Android编译过程详解(三)

    Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359.html Android编译过程详解(二):h ...

最新文章

  1. OSD的主要实现方法和类型(转)
  2. 火热物联网下,中国传感器的冷思考
  3. html 服务器运行exe,html运行exe文件,兼容浏览器
  4. python numpy ones.like()(返回形状与类型与给定数组相同的数组)
  5. hdu 3047 Zjnu Stadium(并查集)
  6. 数据库-第三范式及BCN
  7. C++ class实现顺序栈(完整代码)
  8. matlabif语句怎么用_公益心 码客行(2)—— 简单语句
  9. Python企业微信机器人
  10. 洛谷——P2433 【深基1-2】小学数学 N 合一
  11. C++ STL 字符串转其他类型 其他类型转字符串
  12. AXI总线 详细整理
  13. 采用commons-emai发送电子邮件
  14. RK3399 修改android桌面图标默认大小
  15. RepeatMasker使用
  16. SeedLab6: TCP/IP Attack Lab
  17. java 点名器_java随机点名器 课程设计.docx
  18. mysql5.7源码安装 简书_在CentOS7上编译安装MySQL 5.7.13步骤详解
  19. 派克比例方向控制阀放大器
  20. HTML网页设计基础笔记 • 【第1章 HTML5基础】

热门文章

  1. Microsoft Ignite China, Shenyang After Party - Power Pages Web 开发介绍 直播预告
  2. 当数字遇上奇思妙想:探究力扣“最小偶倍数”解题思路
  3. 最近做项目的总结与收获(2021年8月)
  4. matlab求示功图面积,基于MATLAB的示功图模拟研究.pdf
  5. TensorFlow CNN卷积神经网络实现工况图分类识别(一)
  6. JDK动态代理的底层实现原理
  7. Vue项目本地运行环境下设置既能localhost访问又能IP访问,并且可以外网环境下通过域名访问
  8. 喜讯|慧灵科技 荣获维科杯·OFweek2022中国机器人行业年度市场突破奖
  9. 高级计算机职称论文自述,晋高级职称申报人任现职以来主要工作业绩自述
  10. 《Linux那些事儿之我是USB》我是U盘(34)迷雾重重的批量传输(三)