没想到现在 App 里集成支付宝是这么的简单,我还折腾了好久…
好了,开始,假设你已经完成了支付宝那些繁杂的申请啥的工作,进入开发了。
首先,去下载官方的 DEMO :
App支付客户端DEMO&SDK 。
解压后把里面的 jar 包拿出来放到你工程的 lib 目录下,如图
然后进入工程的“Project Structure”,在app module下选择“File dependency”,将libs目录下的alipaySDK-xxxxxxxx.jar导入,或者在app module下的build.gradle下手动添加依赖,如下代码所示:
...... compile files('libs/alipaySdk-20170725.jar') ......
复制进去就行
<activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation|screenSize" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden" > </activity> <activity android:name="com.alipay.sdk.app.H5AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden" > </activity>
声明权限
<uses-permissionandroid:name="android.permission.INTERNET"/> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
好了,准备工作基本完成。
这里参考下给的 Demo。
由于支付包的 Demo 给的是本地加密的方式,并且不推荐使用这种方法,所以我们只需要用的其中的部分代码就好了。
首先,把 PayResult.java 这个类复制到你的项目里。代码如下:
public class PayResult{ private String resultStatus; private String result; private String memo; public PayResult(Map<String, String> rawResult){ if (rawResult == null) { return; } for (String key : rawResult.keySet()) { if (TextUtils.equals(key, "resultStatus")) { resultStatus = rawResult.get(key); } else if (TextUtils.equals(key, "result")) { result = rawResult.get(key); } else if (TextUtils.equals(key, "memo")) { memo = rawResult.get(key); } } } @Override public String toString(){ return "resultStatus={" + resultStatus + "};memo={" + memo + "};result={" + result + "}"; } /** * @return the resultStatus */ public String getResultStatus(){ return resultStatus; } /** * @return the memo */ public String getMemo(){ return memo; } /** * @return the result */ public String getResult(){ return result; } }
然后调支付接口。PayTask对象主要为商户提供订单支付、查询功能,及获取当前开发包版本号。获取PayTask支付对象调用支付(支付行为需要在独立的非ui线程中执行),
private static final int SDK_PAY_FLAG = 1; // 订单信息 final String orderInfo = info; Runnable payRunnable = new Runnable() { @Override public void run(){ PayTask alipay = new PayTask(PayDemoActivity.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();
注意下 orderInfo 这个变量,这个值是由通过向后台请求返回的值。
这里需要后台注意的是,写的时候看好 App支付请求参数说明 这个文档。
然后是支付结果的获取与处理。
@SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg){ switch (msg.what) { case SDK_PAY_FLAG: { @SuppressWarnings("unchecked") PayResult payResult = new PayResult((Map<String, String>) msg.obj); /** 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 */ String resultInfo = payResult.getResult();// 同步返回需要验证的信息 String resultStatus = payResult.getResultStatus(); // 判断resultStatus 为9000则代表支付成功 if (TextUtils.equals(resultStatus, "9000")) { // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); } else { // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show(); } break; } default: break; } }; };
然后就好了。
结束。
这是第一次接入支付宝支付,一开始还很起劲的参照一个库去进行封装,然后发现好像多此一举,并且还不成功,和后台捯饬了好久然后看Demo才弄出来。
参考:
支付宝支付文档