移动支付已经成为了人们日常生活不可或缺的一部分,尤其是在COVID-19疫情期间,更是推动了无接触支付方式的普及。作为一名开发者,提供一款安全、快捷、方便的支付途径是我们应该优先考虑的问题。下面介绍我个人对于开发安卓app支付的一些原理和实践。
一、支付原理
1. 手机app支付的原理
移动支付的流程可分为四个阶段:前端、支付网关、银行系统和商户。其中前端是指消费者的手机app,用来发起支付请求;支付网关是支付机构提供的支付接口,连接前端和银行系统;银行系统作为支付清算方,完成账户的资金转移和记账功能;商户是从银行获得的结算账户,支付成功后对卖家进行结算。
2. 支付流程
支付流程分为两个阶段:预支付和确认支付。预支付主要分为以下几个步骤:
(1)用户用手机打开商户的app,选中商品进入支付页面;
(2)用户选择支付方式,例如微信支付或支付宝支付;
(3)前端app发起预支付请求到支付网关,支付网关返回prepay_id等支付资料;
(4)前端根据支付资料组装出支付请求,调起相应的支付应用;
(5)用户在支付应用中确认支付完成后,支付应用返回支付结果。
如果支付成功,支付网关会异步通知商户端支付成功,商户根据异步通知更新订单状态,并发起查询订单接口查询支付结果,扣款成功后完成订单;如果支付失败,商户端同样可以收到支付网关的通知,商户可以根据通知信息返回错误信息给用户,并撤销订单。
二、支付开发实践
1. 组织开发架构
我们首先需要创建一个android studio项目,添加支付宝SDK和微信SDK的库文件,依赖管理工具可选择Gradle(推荐)或Maven;其次,在项目的manifest文件中添加支付请求需要的权限,例如网络连接、读取手机存储等等;接着,我们需要从支付宝或微信开放平台获取应用ID和应用密钥,并在代码中对其进行配置。
2. 搭建支付模块
(1)支付宝支付
引入支付宝SDK 的实现流程如下:
(a) 添加依赖:
```
implementation 'com.alipay.sdk:alipay-sdk-java:4.8.75.ALL'
```
(b)配置AndroidMainfest.xml 权限,并在application 标签下添加AlipayPayActivity(用来接收支付结果回调)
```
// 添加AlipayPayActivity
android:name="com.alipay.sdk.app.AlipayResultActivity" android:configChanges="orientation|keyboardHidden|navigation" android:screenOrientation="behind" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> ``` (c)实现支付逻辑,处理支付结果回调 ``` public class AliPay { /** *支付宝支付业务 * * @param orderStr * 订单信息 * @param activity * 拉起支付的Activity * @param handler * 处理支付结果的Handler */ public static void payV2(final Activity activity, final Handler handler, String orderStr) { final Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(activity); Map Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; handler.sendMessage(msg); } }; Thread payThread = new Thread(payRunnable); payThread.start(); } // 处理支付结果回调 public static void AliPayResultHandler(final AppCompatActivity activity, Map PayResult payResult = new PayResult(result); // 判断支付状态 String resultStatus = payResult.getResultStatus(); if (TextUtils.equals(resultStatus, "9000")) { Toast.makeText(activity, "支付成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(activity, "支付失败", Toast.LENGTH_SHORT).show(); } } } ``` (2)微信支付 引入微信SDK 的实现流程如下: (a)添加依赖 ``` compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' ``` (b)配置AndroidMainfest.xml 权限,并在WXPayEntryActivity(用来接收支付结果回调) ``` // 添加WXPayEntryActivity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop" android:screenOrientation="portrait" /> ``` (c)实现支付逻辑,处理支付结果回调 ``` public class WXPay { // 发起支付 public static boolean pay(Context context, PayReq request) { IWXAPI api = WXAPIFactory.createWXAPI(context, request.appId); api.registerApp(request.appId); return api.sendReq(request); } // 处理支付回调 public static void WXPayResultHandler(final AppCompatActivity context, BaseResp resp) { if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { switch (resp.errCode) { // 支付成功 case 0: Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show(); break; // 失败 case -1: Toast.makeText(context, "支付失败", Toast.LENGTH_SHORT).show(); break; // 取消 case -2: Toast.makeText(context, "支付已取消", Toast.LENGTH_SHORT).show(); break; default: break; } } } } ``` 三、总结 开发手机app支付相对较为复杂,但是通过以上步骤,细致的代码实现和对接口的理解,我们就能开发出对用户友好、实用、安全的支付功能。支付功能成功实现后,须保障卖家和服务商的业务流程一致,完成支付交易。在进一步的优化和尝试中,我们能够加入更加智能和互联化的支付方式,使用户的生活更加便捷高效,并提高用户黏性。