android支付宝接入流程

接入前准备

接入APP支付能力前,开发者需要完成以下前置步骤。

本文档展示了如何从零开始,使用支付宝开放平台服务端 SDK 快速接入App支付产品,完成与支付宝对接的部分。

第一步:创建应用并获取APPID

要在您的应用中接入支付宝 App 支付能力,您需要登录支付宝开放平台open.alipay.com),在开发者中心中创建您的应用,应用审核通过后会生成应用唯一标识(APPID),并且可以申请开通开放产品使用权限。通过 APPID 您的应用才能调用开放产品的接口能力。需要详细了解开放平台创建应用步骤请参考《开放平台应用创建指南》

第二步:配置应用

添加功能并签约

应用创建完成后,系统会自动跳转到应用详情页面。开发者可以点击 添加功能 来 添加 App支付 功能。添加功能后开发者需要在开放平台里进行签约,第三方应用开发者可以代替商户签约。

配置密钥

为了保证交易双方(商户和支付宝)的身份和数据安全,开发者在调用接口前,需要配置双方密钥,对交易数据进行双方校验。RSA 密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后,开发者需要在开放平台开发者中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY),配置的详细步骤请参考《配置应用环境》。您还可以通过观看快速签名教程学习密钥的配置。

说明:

支付宝开放平台 SDK 封装了签名和验签过程,只需配置账号及密钥参数,建议开发者使用。开发者还可以通过 自助排查流程验签教程 自助排查配置应用过程中遇到的问题。

第三步:集成和开发

接入移动支付需要集成两个 SDK:客户端 SDK 需要集成在商户自己的 APP 中,用于唤起支付宝 APP 并发送交易数据,并在支付宝APP返回商户APP时获得支付结果;服务端SDK需要商户集成在自己的服务端系统中,用于协助解析并验证客户端同步返回的支付结果和异步通知。

集成前提

开发者在集成和开发前需要了解一下常用的接入方式和架构建议,如下图所示:

集成客户端 SDK

在集成 App 支付能力时,支付宝提供主流移动平台的 App 提供集成方式。点击下载客户端SDK

更多集成说明参见 客户端 Android 集成说明客户端 iOS 集成说明

原文链接🔗小程序文档 - 支付宝文档中心

导入支付宝 SDK

以下内容可参考 alipay_demo 的实现。

1.将 alipaySdk-15.5.7-20181023110917.aar 包放在您的应用工程的 libs 目录下(图片中文件名仅做示例,请以实际 SDK 文件名为准):

2.在主项目的 build.gradle 中,添加下面的内容,将 libs 目录作为依赖仓库:

java 复制代码
allprojects {
    repositories {
 
        // 添加下面的内容
        flatDir {
            dirs 'libs'
        }
 
        // ... jcenter() 等其他仓库
    }

3.在您 App Module 的 build.gradle 中,添加下面的内容,将支付宝 SDK 作为项目依赖:

java 复制代码
dependencies {
 
    // 添加下面的内容
    compile (name: 'alipaySdk-15.5.7-20181023110917', ext: 'aar')
 
    // ... 其他依赖项
}

至此,支付宝 SDK 开发资源导入完成。

运行权限

为正常完成良好的支付流程体验,支付宝 SDK 需要使用下面这些权限:

java 复制代码
android.permission.INTERNET

android.permission.ACCESS_NETWORK_STATE

android.permission.ACCESS_WIFI_STATE

您需要在 AndroidManifest 里配置以上 3 个权限,支付宝 SDK 在运行时需要进行网络连接,并在必要的时候判断网络连接的状态(4G/Wi-Fi)等来进行支付体验的优化。

支付接口调用

需要在新线程中调用支付接口(可参考 alipay_demo 实现)。

PayTask 对象主要为商户提供订单支付、查询功能,及获取当前开发包版本号。

获取 PayTask 支付对象调用支付(支付行为需要在独立的非ui线程中执行),代码示例:

html 复制代码
final String orderInfo = info;   // 订单信息
 
		Runnable payRunnable = new Runnable() {
 
			@Override
			public void run() {
				PayTask alipay = new PayTask(DemoActivity.this);
               Map <String,String> result = alipay.payV2(orderInfo,true);
 
				Message msg = new Message();
				msg.what = SDK_PAY_FLAG;
				msg.obj = result;
				mHandler.sendMessage(msg);
			}
		};
	     // 必须异步调用
		Thread payThread = new Thread(payRunnable);
		payThread.start();

|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数名称 | 参数说明 |
| String orderInfo | app支付请求参数字符串,主要包含商户的订单信息,key=value形式,以&连接。 |
| boolean isShowPayLoading | 用户在商户app内部点击付款,是否需要一个 loading 做为在钱包唤起之前的过渡,这个值设置为 true,将会在调用 pay 接口的时候直接唤起一个 loading,直到唤起H5支付页面或者唤起外部的钱包付款页面 loading 才消失。(建议将该值设置为 true,优化点击付款到支付唤起支付页面的过渡过程。) |

orderInfo 示例如下,参数说明见"请求参数说明",orderInfo 的获取必须来源于服务端:

html 复制代码
app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.02%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22314VYGIAGG7ZOYY%22%7D&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA2&timestamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJdhIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D

返回值: 本方法调用的返回结果,参数说明见"客户端同步返回参数说明"。

支付结果获取和处理

调用 pay 方法支付后,将通过2种途径获得支付结果:

同步返回

商户应用客户端通过当前调用支付的Activity的Handler对象,通过它的回调函数获取支付结果。(可参考 alipay_demo 实现)

代码示例:

java 复制代码
private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			Result result = new Result((String) msg.obj);
			Toast.makeText(DemoActivity.this, result.getResult(),
						Toast.LENGTH_LONG).show();
		};
	};

异步通知

商户需要提供一个 http 协议的接口,包含在请求支付的入参中,其 key 对应 notify_url。支付宝服务器在支付完成后,会以 POST 方式调用 notify_url 传输数据。

获取当前开发包版本号

调用 PayTask 对象的 getVersion() 方法查询。

代码示例:

html 复制代码
PayTask payTask = new PayTask(activity);
String version = payTask.getVersion();
相关推荐
HerayChen20 分钟前
HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac
android·macos·智能手机
顾北川_野21 分钟前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
hairenjing112323 分钟前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小黄人软件1 小时前
android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址
android·ide·android studio
dj15402252031 小时前
group_concat配置影响程序出bug
android·bug
周全全2 小时前
MySQL报错解决:The user specified as a definer (‘root‘@‘%‘) does not exist
android·数据库·mysql
- 羊羊不超越 -2 小时前
App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)
android·ios·harmonyos
wk灬丨3 小时前
Android Kotlin Flow 冷流 热流
android·kotlin·flow
千雅爸爸3 小时前
Android MVVM demo(使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成)
android