支付寶支付(Android篇)

支付寶Android客戶端集成流程

https://opendocs.alipay.com/open/204/105296

SDK&DEMO

https://opendocs.alipay.com/open/54/104509

1. 第一步:導入支付寶SDK

libs
alipaySdk-15.7.4-20200228192259.aar

2. 第二步:項目build.gradle中將libs目錄作爲依賴倉庫

allprojects{
    repositories{
        // 支付寶 SDK AAR 包所需的配置
        flatDir{
            dirs'libs'
        }
}

3. 第三步:

build.gradle(:app)

dependencies{
        //...
        // 支付寶 SDK AAR 包所需的配置
        implementation(name:'alipaySdk-15.7.4-20200228192259',ext:'aar')
}

4. 第四步:添加權限

android.permission.INTERNET
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE

5. 接口調用

主要代碼片段

final String orderInfo = pay.getJsonStr();//本地接口返回支付寶訂單信息json字符串

final Runnable payRunnable = () -> {
PayTask alipay =new PayTask(OrderPayActivity.this);
    Map result = alipay.payV2(orderInfo, true);
    LogUtil.i("msp:" + result.toString());
    
    Message msg =new Message();
    msg.what =SDK_PAY_FLAG;
    msg.obj = result;
    mHandler.sendMessage(msg);
};

// 必須異步調用

Thread payThread =new Thread(payRunnable);

payThread.start();

private static final int SDK_PAY_FLAG =1;
private static final int SDK_AUTH_FLAG =2;

private HandlermHandler =new Handler() {
	@SuppressWarnings("unused")
	public void handleMessage(Message msg) {
	switch (msg.what) {
	case SDK_PAY_FLAG: {
		PayResult payResult =new PayResult((Map) msg.obj);
	    /**
	    * 對於支付結果,請商戶依賴服務端的異步通知結果。同步通知結果,僅作爲支付結束的通知。
	    */                
	    String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
	     String resultStatus = payResult.getResultStatus();
	     // 判斷resultStatus 爲9000則代表支付成功
	     if (TextUtils.equals(resultStatus, "9000")) {
		// 該筆訂單是否真實支付成功,需要依賴服務端的異步通知。
		//                        			
		showAlert(OrderPayActivity.this, "Payment success:" + payResult);
	    	payResult(true);
	     }else if (TextUtils.equals(resultStatus, "6001")) {
		//取消支付
	           doBack();
	     }else {
		// 該筆訂單真實的支付結果,需要依賴服務端的異步通知。
		//                        
		showAlert(OrderPayActivity.this, "Payment failed:" + payResult);
	    payResult(false);
	    }
		break;
	}
	
	case SDK_AUTH_FLAG: {
		AuthResult authResult =new AuthResult((Map) msg.obj, true);
	   	String resultStatus = authResult.getResultStatus();
		// 判斷resultStatus 爲“9000”且result_code
		// 爲“200”則代表授權成功,具體狀態碼代表含義可參考授權接口文檔
		if (TextUtils.equals(resultStatus, "9000") && 	TextUtils.equals(authResult.getResultCode(), "200")) {
			// 獲取alipay_open_id,調支付時作爲參數extern_token 的value
			// 傳入,則支付賬戶爲該授權賬戶
			showAlert(OrderPayActivity.this, "Authentication success:" + authResult);
	    }else {
	// 其他狀態值則爲授權失敗
			showAlert(OrderPayActivity.this, "Authentication failed:" + authResult);
	    }
		break;
	    }
	default:
	break;
	}
	};
};
private void payResult(boolean success) {
	DialogUtils.showMsg(this, "提示", "訂單支付" + (success ?"成功" :"失敗,重新支付"),
	 (context, builder, dialog, dialogId, which, editText) -> {
		EventBus.getDefault().post(new EventBean(Constant.Event_Msg.PAY_SUCCESS));
		finish();
	    }, 
	    (context, builder, dialog, dialogId, which, editText) -> {
	if (success) {
		EventBus.getDefault().post(new EventBean(Constant.Event_Msg.PAY_SUCCESS));
		finish();
	        }
	}, !success, "取消", "確定", false);
}
private void doBack() {
	DialogUtils.showMsg(this, "提示", "您的訂單還未支付完成,請儘快完成支付。", 
	(context, builder, dialog, dialogId, which, editText) -> {
	EventBus.getDefault().post(new EventBean(Constant.Event_Msg.PAY_SUCCESS));
	        finish();
	    }, (context, builder, dialog, dialogId, which, editText) -> {
	}, true, "確認離開", "繼續支付", false);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章