支付宝安全支付服务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


相关文章
|
23天前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
1天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
1天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
1天前
|
Android开发 Swift iOS开发
探索iOS与安卓应用开发的差异性
探索iOS与安卓应用开发的差异性
8 2
|
7天前
|
传感器 XML IDE
探索安卓应用开发:从基础到进阶
【10月更文挑战第23天】在数字化时代的浪潮中,移动应用已成为人们日常生活的延伸。本文以安卓平台为例,深入浅出地介绍了如何从零开始构建一个安卓应用,涵盖了开发环境搭建、基本组件使用、界面设计原则以及进阶技巧等关键步骤。通过实例演示和代码片段,引导读者逐步掌握安卓应用开发的核心技能,旨在激发更多开发者对安卓平台的探索热情,并为初学者提供一条清晰的学习路径。
|
1天前
|
存储 搜索推荐 Java
打造个性化安卓应用:从设计到实现
【10月更文挑战第30天】在数字化时代,拥有一个个性化的安卓应用不仅能够提升用户体验,还能加强品牌识别度。本文将引导您了解如何从零开始设计和实现一个安卓应用,涵盖用户界面设计、功能开发和性能优化等关键环节。我们将以一个简单的记事本应用为例,展示如何通过Android Studio工具和Java语言实现基本功能,同时确保应用流畅运行。无论您是初学者还是希望提升现有技能的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧。
|
5天前
|
搜索推荐 开发工具 Android开发
打造个性化Android应用:从设计到实现的旅程
【10月更文挑战第26天】在这个数字时代,拥有一个能够脱颖而出的移动应用是成功的关键。本文将引导您了解如何从概念化阶段出发,通过设计、开发直至发布,一步步构建一个既美观又实用的Android应用。我们将探讨用户体验(UX)设计的重要性,介绍Android开发的核心组件,并通过实际案例展示如何克服开发中的挑战。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧,帮助您在竞争激烈的应用市场中脱颖而出。
|
7天前
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
18 2
|
10天前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
38 5
|
10天前
|
移动开发 Dart 搜索推荐
打造个性化安卓应用:从零开始的Flutter之旅
【10月更文挑战第20天】本文将引导你开启Flutter开发之旅,通过简单易懂的语言和步骤,让你了解如何从零开始构建一个安卓应用。我们将一起探索Flutter的魅力,实现快速开发,并见证代码示例如何生动地转化为用户界面。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。