支付宝安全支付服务Android应用开发指南(摘取官方文档)

简介: <div> <div><strong><span style="font-family:Microsoft YaHei; font-size:18px">一,安全支付服务简介:</span></strong></div> </div> <div><span style="font-family:Microsoft YaHei; font-size:18px"><span style=
一,安全支付服务简介:
1.1,安全支付服务介绍。
安全支付服务是安装在本地Android操作系统上的一个组件,主要用来向其它的应用程序提供便捷、安全以及可靠的支付服务。正如平常系统上所提供的其它服务,如电子邮件和电话服务一样。本文主要描述安全支付服务应用开发接口的使用方法,供合作伙伴以及其它第三方应用开发者参考。
1.2,安全支付服务业务流程。

1.3,调用安全支付数据流程图

二,安全支付接入流程
2.1,接入前期准备
接入前期准备工作包括商户签约和密钥配置,已完成商户可略过。
2.1.1,商户签约
首先,商户需要在https://ms.alipay.com进行注册,并签约安全支付服务。签约成功后可获取支付宝分配的合作商户ID(PartnerID),账户ID(SellerID),如图:

签约过程中需要任何帮助请致电:0571-88158090(支付宝商户服务专线)
2.1.2,密钥配置
签约成功后,商户可登陆https://ms.alipay.com获取商户账号对应的支付宝公钥,具体获取步骤请见3.2 RSA密钥详解
接着,商户生成商户公钥和商户私钥(具体生成步骤请见3.2 RSA密钥详解),并登陆https://ms.alipay.com,上传商户公钥(具体上传步骤请见3.2 RSA密钥详解)。
至此,接入前期准备工作完成,下一节将使用demo测试准备工作是否正确。
2.2,Demo
为了便于商户的接入,我们提供了安全支付demo。通过本demo,商户可测试2.1节的前期准备工作是否正确完成,同时还可参考demo的代码完成接入。(注意:请勿在模拟器下测试demo,否则可能导致付款账户被锁定!)
2.2.1,Demo 配置运行
步骤 1:
解压下载的安全支付开发资料压缩包WS_SECURE_PAY,进入目录“WS_SECURE_PAY\Android”,其中“AppDemo4_0413”即demo的项目文件,将其导入eclipse,步骤如图:







项目结构如图:



步骤 2:
打开“PartnerConfig.java”文件,按照注释添加商户账号信息,具体包括:合作商户ID、账户ID、支付宝公钥(即服务器公钥)、商户公钥、商户私钥。如下图:


步骤 3
在真机或者模拟器上运行项目(下图以模拟器为例),首次启动时,由于系统未安装安全支付服务,将出现以下提示:


此时,可以选择“确定”进行安装,安装后该提示不会再出现。此时点击任意商品进行购买,即启动安全支付:


首次运行安全支付服务,会进行安全认证,此时选择“支付宝账户”付款(注意:付款用的账户应为某一真实账户,交易金额也是真实的!),输入账户信息,按照提示一步步进行:


完成安全认证后,若出现如下提示,说明密钥配置有误,请仔细阅读3.2 RSA密钥详解


若出现“确认支付”页面,说明密钥配置无误,接入前期准备工作全部正确完成。接下来将正式进行安全支付的接入集成。

2.2.2,Demo结构说明


2.3 安全支付集成
本章指导在商户项目中集成安全支付,关键代码以Demo为例。
步骤 1:添加jar文件
添加demo中的alipay_msp.jar包添加工程中。
步骤 2:初始化安全支付服务
在调用安全支付进行支付前,需要先初始化安全支付服务,主要代码如下:
private ServiceConnection mAlixPayConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// Wake up the binder to continue.
synchronized (lock) {
mAlixPay = IAlixPay.Stub.asInterface(service);
lock.notify();
}
}
public void onServiceDisconnected(ComponentName className) {
mAlixPay = null;
}
};
...
// Bind the service, then can call the service.
mActivity.bindService(new Intent(IAlixPay.class.getName()),
mAlixPayConnection, Context.BIND_AUTO_CREATE);

步骤 3:订单数据生成
在调用安全支付时,需要提交订单信息orderInfo其中参数以“key=value”形式呈现,参数之间以“&”分割,所有参数不可缺。示例如下:(红色参数表示该参数值需与示例一致,不可自定义;蓝色参数表示值可自定义。具体参数说明请见订单信息描述)
partner="2088002007260245"&seller="2088002007260245"&out_trade_no="500000000006548"&subject="商品名称"&body="这是商品描述"&total_fee="30"¬ify_url="http://notify.java.jpxx.org/index.jsp"&sign="kU2Fa3x6V985g8ayTozI1eJ5fHtm8%2FJGeJQf9in%2BcVmRJjHaExbirnGGKJ%2F7B63drqc4Kjlk%2FSg6vtSIkOtdvVBrRDpYaKxXVqkJTzRYgUwrrpMudbIj9aMS2O3dHG0GPyL4Zb6jKDYXHabGG0aBJY3QA7JuTJ23t6SqV%2B5f1xg%3D"&sign_type="RSA"

            其中sign值的生成,请见商品信息签名。需要特别注意的是:对数据签名后得到的sign值必须进行URLEncode,之后才可作为参数。
步骤 4:调用安全支付
           准备好参数后,即可调用安全支付进入支付流程并获得调用结果,代码如下:
           result = mAlixPay.Pay(orderInfo);
           AliXPay函数具体说明请见AlixPay方法描述。
步骤 5:支付结果获取和处理
           调用安全支付后,将通过两种途径获得支付结果:
           1、 AliXpay.pay()方法的返回
           该方法将返回表示支付结果的字符串,详细信息详见
           2、支付宝服务器通知
           商户需要提供一个http协议的接口,包含在参数里传递给安全支付,即notify_url。支付宝服务器在支付完成后,会用POST方法调用notufy_url,以xml为数据格式传输支付结果,详见
          接下来以Demo代码为例,介绍整个流程:
/*
* Initialize serviceConnection to get the stub
* Referrence class: MobileSecurePayer
*/
private ServiceConnection mAlixPayConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// wake up the binder to continue.
synchronized (lock) {
mAlixPay = IAlixPay.Stub.asInterface(service);
lock.notify();
}
}
/*
* Prepare the Info which will be used to call SecurePayment service
* Referrence class: AlixDemo
* Referrence method: onItemClick
*/
String orderInfo = getOrderInfo(arg2);
String signType = getSignType();
String strsign = sign(signType, orderInfo); //
strsign = URLEncoder.encode(strsign);
String info = orderInfo + "&sign=" + "\"" + strsign + "\"" + "&"
+ getSignType();
class: MobileSecurePayer
*/
public boolean pay(final String orderInfo, final Handler callback,
final int myWhat, final Activity activity) {
// Return false if it’s paying.
if (mIsPaying)
return false;
// Return true if it’s not paying.
mIsPaying = true;
mActivity = activity;
// bind the service.
if (mAlixPay == null) {
mActivity.bindService(new Intent(IAlixPay.class.getName()),
mAlixPayConnection, Context.BIND_AUTO_CREATE);
}
new Thread(new Runnable() {
public void run() {
try {
/**
* wait for the service bind operation to completely
* finished. Note: this is important, otherwise the next
* mAlixPay.Pay() will fail.
*/
synchronized (lock) {
if (mAlixPay == null)
lock.wait();
}
// register a Callback for the service.
mAlixPay.registerCallback(mCallback);
// call the MobileSecurePay service.
result = mAlixPay.Pay(orderinfo);
/**
* set the flag to indicate that we have finished.
* unregister the Callback, and unbind the service.
*/
mIsPaying = false;
mAlixPay.unregisterCallback(mCallback);
mActivity.unbindService(mAlixPayConnection);
// send the result back to caller.
Message msg = new Message();
msg.what = myWhat;
msg.obj = result;
callback.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
// send the result back to caller.
Message msg = new Message();
msg.what = myWhat;
msg.obj = e.toString();
// msg.obj = strRet;
callback.sendMessage(msg);
}
}
}).start();
return true;
}
}

2.4 应用发布
目前,我们为第三方应用客户端提供了两种集成安全支付服务的方式。第一种是运行时安装,即将安全支付服务安装包apk与第三方应用客户端整合在一起,在恰当的时机,由第三方应用客户端释放并安装安全支付服务安装包apk。另一种则称为动态下载安装,在此种情况下,安全支付服务安装包apk是预先存放在约定的远程服务器中,第三方应用客户端可以从此处下载apk并进行安装。
为了提升用户体验,避免捆绑安装旧版本的安全支付服务之后,接着又需要重新升级并安装成最新版本,我们目前推荐结合使用以上两种集成方式。在最新的demo中,会首先连接支付宝服务器,检测并判断捆绑在第三方客户端中的alipay_plugin.apk是否为最新版本,如果是,则直接安装。如果捆绑在第三方客户端中的alipay_plugin.apk不是最新版本,则从服务器中下载最新版本的安装包,然后进行安装。
2.4.1运行时安装
运行时安装的具体步骤如下所示:
1) 将alipay_plugin.apk作为资源复制到第三方应用工程中的assets目录。
2) 第三方应用在需要付款时(或者其它恰当时机),先检测安全支付服务是否已经安装。如果尚未安装,则从assets目录中提取alipay_plugin.apk到手机存储。
3) 安装手机存储中的安全支付服务apk
以下是一个代码片段,演示上述过程。
// Install the APK of SecurePayment which is included in the merchant’s App.
public boolean retrieveApkFromAssets(Context context, String fileName,
String path) {
boolean isRetrieve = false;
InputStream input = null;
FileOutputStream output = null;
try {
input = context.getAssets().open(fileName);
File file = new File(path);
file.createNewFile();
output = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = input.read(temp)) > 0) {
output.write(temp, 0, i);
}
isRetrieve = true
!= null){
try {
output.close();
} catch (IOException e) {
}
}
if(input != null){
try {
input.close();
} catch (IOException e) {
}
}
}
return isRetrieve;
}

2.4.2 动态下载安装
动态下载安装的具体步骤如下所示:
1) 由支付宝预先将安全支付服务apk放置到约定的远程下载服务器。
2) 第三方应用在需要付款时(或者其它恰当时机),先检测安全支付服务是否已经安装。如果尚未安装,则从约定的远程下载服务器提取alipay_plugin.apk到手机存储。
3) 安装手机存储中的安全支付服务apk
以下是一个代码片段,演示上述过程。
// Download the APK of SecurePayment
public boolean retrieveApkFromNet(Context context, String strurl,
String filename) {
boolean isRetrieve = false;
try {
NetworkManager networkManager = new NetworkManager(this.mContext);
isRetrieve = networkManager.downloadToFile(context, strurl,
filename);
} catch (Exception e) {
e.printStackTrace();
}
return isRetrieve;
}
} catch (IOException e) {
e.printStackTrace ();
}finally{
if(output != null){
try {
output.close();
} catch (IOException e) {
}
}
if(input != null){
try {
input.close();
} catch (IOException e) {
}
}
}
return isRetrieve;
}

第三章 RSA详解
以下内容加*号为重点
3.1 RSAOpenSSL介绍
3.1.1什么是RSA
RSA是一种非对称的签名算法,即签名密钥(私钥)与验签密钥(公钥)是不一样的,私钥用于签名,公钥用于验签。
在与支付宝交易中,会有2对公私钥,即商户公私钥,支付宝公钥。
商户公私钥:由商户生成,商户私钥用于对商户发往支付宝的数据签名;商户公钥需要上传至支付宝,当支付宝收到商户发来的数据时用该公钥验证签名。
支付宝公钥:支付宝提供给商户,当商户收到支付宝发来的数据时,用该公钥验签。
3.1.2为什么要用RSA
使用这种算法可以起到防止数据被篡改的功能,保证支付订单和支付结果不可抵赖(商户私钥只有商户知道)
3.1.3什么是OpenSSL
一句话概括:OpenSSL是基于众多的密码算法、公钥基础设施标准以及SSL协议安全开发包。
3.1.4为什么要用OpenSSL
通过OpenSSL生成的签名和内置的算法可以做到跨平台,这样在不同的开发语言中均可以签名和验签。

3.2 RSA密钥详解*
3.2.1找到生成 RSA密钥工具
(1)下载开发指南和集成资料,如下图,您能看到此文档说明指南和集成包已经下载了。

(2)解压下载的压缩包 (WS_SECURE_PAY),找到并解压 openssl-0.9.8k_WIN32(RSA密钥生成工具 ).zip工具包


3.2.2生成商户密钥并获取支付宝公钥
(1) 生成原始 RSA商户私钥文件
假设解压后的目录为 c:\alipay,命令行进入目录 C:\alipay\bin,执行 opensslgenrsa-out rsa_private_key.pem 1024在C:\alipay\bin下会生成文件rsa_private_key.pem,
其内容为 原始的商户私钥(请妥善保存该文件),以下为命令正确执行截图:


(2) 将原始 RSA商户私钥转换为 pkcs8格式
命令行执行 openssl pkcs8 -topk8 -inform PEM -inrsa_private_key.pem -outform PEM-nocrypt”得到转换为pkcs8格式的私钥。复制下图红框内的内容至新建txt文档,去掉换行,最后另存为“private_key.txt”(请妥善保存,签名时使用)。


(3)生成RSA商户公钥
命令行执行“ openssl rsa -in rsa_private_key.pem -pubout -outrsa_public_key.pem”,在C:\alipay\bin文件夹下生成文件rsa_public_key.pem。接着用记事本打开rsa_public_key.pem,复制全部内容至新建的txt文档,删除文件头“-----BEGIN PUBLICKEY-----”与文件尾“-----ENDPUBLIC KEY-----”及空格、换行,如下图。最后得到一行字符串并保存该txt文件为“public_key.txt”。


(4)上传商户公钥至支付宝
浏览器访问https://ms.alipay.com/index.htm并用签约帐号登录,点击菜单栏我的产品,右侧点击密钥管理,见下图红色框内

点击上传,选择步骤(3)生成的“public_key.txt”并完成上传。
(5)获取RSA支付宝公钥
成功上传公钥至支付宝后,页面显示如下:


其中红色框内部分即支付宝公钥,请复制至新建txt文档,去掉换行和空格,妥善保存(用于验签收到的支付宝通知)。
3.3  RSA签名和验签*
建议:签名和验签尽量在商户服务器端进行,同时一些敏感数据(如公私钥等)也应存储在服务器端,避免可能的安全隐患。
3.3.1 RSA签名
(1)在项目中添加下面的类:

对不起各位,最近比较忙,一直没时间编辑,下面放出官方源文件,大家可以直接下载查看!

http://download.csdn.net/detail/gulaer/5017686


相关文章
|
21天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
22天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
22天前
|
开发框架 安全 Android开发
探索安卓系统的新趋势:智能家居应用的蓬勃发展
随着智能家居概念的兴起,安卓系统在智能家居应用领域的应用日益广泛。本文将探讨安卓系统在智能家居应用开发方面的最新趋势和创新,以及其对用户生活的影响。
14 2
|
25天前
|
缓存 监控 Java
构建高效Android应用:从优化用户体验到提升性能
在竞争激烈的移动应用市场中,为用户提供流畅和高效的体验是至关重要的。本文深入探讨了如何通过多种技术手段来优化Android应用的性能,包括UI响应性、内存管理和多线程处理。同时,我们还将讨论如何利用最新的Android框架和工具来诊断和解决性能瓶颈。通过实例分析和最佳实践,读者将能够理解并实施必要的优化策略,以确保他们的应用在保持响应迅速的同时,还能够有效地利用系统资源。
|
26天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
30天前
|
编解码 算法 Java
构建高效的Android应用:内存优化策略详解
随着智能手机在日常生活和工作中的普及,用户对移动应用的性能要求越来越高。特别是对于Android开发者来说,理解并实践内存优化是提升应用程序性能的关键步骤。本文将深入探讨针对Android平台的内存管理机制,并提供一系列实用的内存优化技巧,以帮助开发者减少内存消耗,避免常见的内存泄漏问题,并确保应用的流畅运行。
|
23天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
28天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
1天前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
5 0
Android系统 应用存储路径与权限
|
1天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
10 0