Android整合支付寶支付功能
公司專案中需要支付功能,現在支付寶、微信支付很方便,也很多人使用,因此,他們是首選。在此記錄一下支付寶整合過程,下期為微信支付,敬請期待
授人以魚不如授人以漁
首先去支付寶官網下載其最新的Android的SDK整合Dmeo
將支付寶jar包新增專案中
- alipaySdk-20160516.jar
可以看到其主要的呼叫方法在PayDemoActivity類中,下面為主要支付呼叫方法:
/**
* 完整的符合支付寶引數規範的訂單資訊
*/
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 構造PayTask 物件
PayTask alipay = new PayTask(PayDemoActivity.this);
// 呼叫支付介面,獲取支付結果
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必須非同步呼叫
Thread payThread = new Thread(payRunnable);
payThread.start();
注意,我們需要非同步發支付請求。可以看到他僅僅需要我們 傳遞好引數
- 完整的符合支付寶引數規範的訂單資訊
這一步,我公司由伺服器返回已經處理好的祕鑰,我直接傳遞給支付寶即可
partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="測試"&body="測試測試"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&sign="lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"&sign_type="RSA"
請求後,我們講獲得返回值result
resultStatus={9000};memo={};result={partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="測試"&body="測試測試"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&success="true"&sign_type="RSA"&sign="hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZgSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU="}
錯誤碼
- 9000 -> 訂單支付成功
- 8000 -> 正在處理中
- 4000 -> 訂單支付失敗
- 6001 -> 使用者中途取消
- 6002 ->網路連線出錯
回撥處理
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
/**
* 同步返回的結果必須放置到服務端進行驗證(驗證的規則請看https://doc.open.alipay.com/doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建議商戶依賴非同步通知
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考介面文件
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 判斷resultStatus 為非"9000"則代表可能支付失敗
// "8000"代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端非同步通知為準(小概率狀態)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(PayDemoActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判斷為支付失敗,包括使用者主動取消支付,或者系統返回的錯誤
Toast.makeText(PayDemoActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
}
}
break;
}
default:
break;
}
};
};
至此Android客戶端整合支付寶已經完成,是不是So easey!
上面是支付寶Demo的程式碼,我自己寫的時候做了優化,畢竟我們整合的支付外掛不僅僅只有支付寶,因此需要寫一個統一支付pay,在此基礎上做好相應的封裝,方便後續的擴充,在此說下我的封裝思路。
- 新建一個IPay藉口,裡面僅僅只有pay方法
- 新建一個Pay實現IPay,重寫pay方法,實現支付功能,在Pay裡面,統一做網路請求操作,如需要從伺服器獲取==完整的符合支付寶引數規範的訂單資訊==,微信一樣需要這樣,因此可以在此類中統一做請求,獲得返回值之後,根據呼叫支付型別,執行相應pay方法。
- 當然也可以建立一個PayHelper 專門用於實現各個支付型別的pay方法,然後在Pay中呼叫,減少程式碼量
- 我們要新建一個IPayResultCallBack介面,定義onSuccess、onFail方法,表示支付成功失敗的回撥
- 新建一個抽象類PayResultCallBack實現IPayResultCallBack,講onSuceess、onFail放到支付成功/失敗相應中,表明支付成功、失敗回撥方法,到時呼叫pay方法是,即要傳遞實現好的回撥類物件
支援基本一個可擴充的支付功能基本搭建完成,剩餘的僅僅是需要一個一個整合其他支付功能,走的路子任然如此,一個pay,然後回撥方法裡面處理支付結果!!!
1、IPay
/**
* 支付介面
* Created by kingpeng on 16/5/19.
*/
public interface IPay {
void pay(int payType,String orderInfo);
}
2、Pay
/**
* 支付工具類
* Created by kingpeng on 16/5/19.
*/
public class Pay implements IPay {
private Activity mContext;
private MyCallback mCallback = new MyCallback();
private int mPayType;
private PayHelper mPayHelper;
private IPayResultCallback mPayResultCallback;
public Pay(Activity context, IPayResultCallback payResultCallback) {
mContext = context;
mPayResultCallback = payResultCallback;
mPayHelper = new PayHelper();
}
@Override
public void pay(int payType, String orderInfo) {
mPayType = payType;
ReqParam param = new ReqParam();
param.setAlertProgressDialog(mContext, true);
param.put("orderInfo", orderInfo);
param.put("payway", payType);
RequestUtil.getInstance().postApi3(R.string.payment_app_require, param, mCallback);
}
/**
* 支付寶支付
*
* @param payInfo
*/
private void aliPay(final String payInfo) {
mPayHelper.aliPay(mContext, payInfo, mPayResultCallback);
}
private class MyCallback extends ReqCallbackIml {
@Override
public void onSuccess(int action, String response) {
switch (action) {
case R.string.payment_app_require:
PayParseBean bean = (PayParseBean) GsonUtil.jsonToBean(response, PayParseBean.class);
if (bean != null && bean.errcode == 0) {
switch (mPayType) {
case 1:
//請求支付寶
aliPay(bean.signStr);
break;
case 2:
//ToDo 請求微信
break;
}
} else {
ToastUtils.showDefaultToastCenter(mContext.getApplicationContext(), "獲取訂單資訊失敗");
}
break;
}
}
@Override
public void onFail(int action, Throwable e) {
ToastUtils.showDefaultToastCenter(mContext.getApplicationContext(), "獲取訂單資訊失敗");
}
}
3、PayHelper
/**
* 支付幫助類
* Created by kingpeng on 16/5/19.
*/
public class PayHelper {
public PayHelper() {
}
/**
* 支付寶支付
*
* @param activity
* @param payInfo
*/
public void aliPay(Activity activity, String payInfo, IPayResultCallback payResultCallback) {
new AlipayTask(activity, payInfo, payResultCallback).execute();
}
private class AlipayTask extends AsyncTask<String, Integer, String> {
private Activity mContext;
private String mPayInfo;
private IPayResultCallback mPayResultCallback;
public AlipayTask(Activity context, String payInfo, IPayResultCallback payResultCallback) {
super();
mContext = context;
mPayInfo = payInfo;
mPayResultCallback = payResultCallback;
}
@Override
protected String doInBackground(String... params) {
// 構造PayTask 物件
PayTask alipay = new PayTask(mContext);
// 呼叫支付介面,獲取支付結果
String result = alipay.pay(mPayInfo, true);
return result;
}
@Override
protected void onPostExecute(String result) {
mPayResultCallback.payResult(result, Constants.PAY_ALIPAY);
}
}
4、PayResultCallbackImpl
/**
* 支付結果回撥
* Created by kingpeng on 16/5/19.
*/
public abstract class PayResultCallbackImpl implements IPayResultCallback {
public void payResult(String result, int payType) {
switch (payType) {
case Constants.PAY_ALIPAY:
aliPayResult(result, payType);
break;
case Constants.PAY_WX:
wxPayResult(result, payType);
break;
}
}
/**
* 支付寶支付結果
*
* @param result
* @param payType
*/
private void aliPayResult(String result, int payType) {
PayResult payResult = new PayResult(result);
/**
* 同步返回的結果必須放置到服務端進行驗證(驗證的規則請看https://doc.open.alipay.com/doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建議商戶依賴非同步通知
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考介面文件
if (TextUtils.equals(resultStatus, "9000")) {
onPaySuccess(result, payType);
} else {
// 判斷resultStatus 為非"9000"則代表可能支付失敗
// "8000"代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端非同步通知為準(小概率狀態)
// 其他值就可以判斷為支付失敗,包括使用者主動取消支付,或者系統返回的錯誤
onPayFail(result, payType);
}
}
/**
* 支付成功
*
* @param result
* @param payType
*/
public abstract void onPaySuccess(String result, int payType);
/**
* 支付失敗
*
* @param result
* @param payType
*/
public abstract void onPayFail(String result, int payType);
}
相關文章
- Android前端 Java後端 整合支付寶支付Android前端Java後端
- Android 支付寶支付功能封裝實現Android封裝
- android 整合微信支付和支付寶支付其實很簡單Android
- iOS使用Stripe整合支付寶Alipay支付iOS
- 網站如何整合支付寶支付介面網站
- Android 接入微信支付寶支付Android
- Android 支付寶支付開發流程Android
- iOS--支付寶環境整合iOS
- 乾貨系列:ios支付寶的整合iOS
- 對iOS端支付寶和微信支付程式碼進行整合iOS
- SpringMVC 實現支付寶支付功能(沙箱環境)SpringMVC
- 玩轉 iOS 開發:整合 AliPay – 支付寶iOS
- 玩轉 iOS 開發:整合 AliPay - 支付寶iOS
- pay-spring-boot 開箱即用的Java支付模組,整合支付寶支付、微信支付SpringbootJava
- Laravel 整合 EasyAlipay 實現支付寶手機網站 Wap 支付Laravel網站
- 整合支付寶錢包支付 iOS SDK 的方法與經驗iOS
- android 支付功能Android
- Android整合微信支付Android
- 支付寶截圖反饋功能實現
- java實現沙箱測試環境支付寶支付(demo)和整合微信支付和支付寶支付到springmvc+spring+mybatis環境全過程(支付寶和微信支付、附原始碼)JavaSpringMVCMyBatis原始碼
- Android使用Path仿支付寶支付成功失敗動畫Android動畫
- 十幾行程式碼搞定Android呼叫支付寶支付行程Android
- [Android] webview調起支付寶支付頁面記錄AndroidWebView
- Java 支付寶支付,退款,單筆轉賬到支付寶賬戶(支付寶訂單退款)Java
- 支付寶線上支付介面
- SSM 實現支付寶支付功能(圖文詳解+完整程式碼)SSM
- iOS支付寶授權登入整合注意事項iOS
- Android 透過scheme跳轉支付寶實現支付AndroidScheme
- 支付寶alipay移動支付
- Java接入支付寶支付教程Java
- Django呼叫支付寶支付介面Django
- vue-仿支付寶支付Vue
- 支付寶App支付全解析APP
- C# 專案中【支付寶】介面開發整合案例C#
- iOS版支付寶9.9.3更新:“到位”功能正式上線iOS
- SpringBoot(二)整合支付寶 - 電腦網站支付和查詢賬單Spring Boot網站
- 支付寶支付產品介面文件地址和支付寶代金券理解
- PHP-Laravel支付寶支付和微信支付PHPLaravel