安卓aidl+service實作第三方支付alipay
一、專案介紹
在andriod開發中,為了跨行程呼叫第三方服務,通常會使用aidl,即安卓介面定義語言來實作介面的共享,本次案例將詳細展示aidl的的使用,以及如何跨行程第三方應用呼叫支付服務,
二、具體的思路
- 第三方應用系結服務,實作一個支付成功后的ui變化的介面,點擊按鈕之后,通過系結服務回傳的類,進行頁面的跳轉以及介面的傳遞,此時進入支付界面的activity
- 支付界面的activity也系結相同的服務,但是回傳一個不同于上面的類,輸入密碼,點擊提交,如果密碼正確,呼叫第三方應用傳遞過來的介面的方法,當然啦,是間斷呼叫,具體在下文有講
三、具體實作
1. 在main目錄下撰寫兩個aidl檔案
- 第一個負責請求支付,(在第三方應用界面在點擊支付按鈕后,頁面進行跳轉到支付界面)
// ThirdPartPayAction.aidl
package com.alibaba;
import com.alibaba.ThirdPayResult;
interface ThirdPartPayAction {
// 請求支付
void requestPay(String orderInfo,float payMoney,ThirdPayResult callback);
}
- 二個負責具體的支付后的實作(在支付界面輸密碼后進行支付,第三方應用的界面ui的變化)
//具體的支付行為,由第三方軟體實作
// ThirdPayResult.aidl
package com.alibaba;
// Declare any non-default types here with import statements
interface ThirdPayResult {
void onPaySuccess();
void onPayFalied(in int errrorCode, in String msg);
}
2.撰寫服務并注冊到manifest中
- 在服務中,用內部類的方式實作了ThirdPayResult的介面,生成了ThirdPayResultImpl類,由于aidl本身就繼承了ibinder,所以可以在onbind()中直接接回傳該類
- 上文中已經提到ThirdPayResult是實作點擊按鈕,實作頁面的跳轉的,系結在第三方應用中的服務類
- 其中兩個方法,是呼叫介面來實作ui的變化的,但是他不會親自呼叫而是通過呼叫payaction ->呼叫ThirdPayResult->呼叫介面
- ThirdpayResultIMpl主要就是負責支付界面的跳轉
- payaction類是系結在支付界面的服務類,功能是呼叫ThirdPayResult中的介面的方法,而這個介面實作,是由第三方界面進行提供的,也就是上文中提到了ui的實作
package com.alibaba;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
/**
* 在進行跨包呼叫的時候,兩邊都應該先編譯
* 不然第三方應用會使用之前的版本,此處不編譯相當于沒改
*/
public class PayService extends Service {
private static final String TAG = PayService.class.getName();
//注意!此處的一定要寫在全域 不然payaction無法呼叫pay中的此類的paysucess
private ThirdPartPalyImpl mthirdPartPaly = new ThirdPartPalyImpl();
@Nullable
@Override
public IBinder onBind(Intent intent) {
String action = intent.getAction();
Log.e(TAG, "onBind action is --> " + action);
if(action != null) {
if (action.equals("com.alibaba.THIRD_PART_PAY")) {
//說明是第三方支支付請求
Log.e(TAG, "onBind: 回傳一個第三方支付類");
return mthirdPartPaly;
}
}
Log.e(TAG, "onBind: 系結確定支付類" );
return new PayAction();
}
public class PayAction extends Binder {
public void pay(float payMoney){
Log.e(TAG, "呼叫pay方法");
//支付的方法
mthirdPartPaly.paySuccess();
}
public void onUserCancle(){
//用戶點擊界面上的取消/退出
Log.e(TAG, "onUserCancle" );
mthirdPartPaly.payFalied(1,"user cancel pay");
}
}
//采用內部類實作介面
private class ThirdPartPalyImpl extends ThirdPartPayAction.Stub {
private ThirdPayResult mCallback;
@Override
public void requestPay(String orderInfo, float payMoney, ThirdPayResult callback) throws RemoteException {
this.mCallback = callback;
//第三方應用發起請求,打開一個支付界面
Intent intent = new Intent();
intent.setClass(PayService.this, PayActivity.class);
intent.putExtra(Constants.KEY_BILL_INFO, orderInfo);
intent.putExtra(Constants.KEY_PAY_MONEY, payMoney);
//跑在不同的任務上
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
//支付成功
public void paySuccess() {
if (mCallback != null) {
try {
mCallback.onPaySuccess();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
//支付失敗
public void payFalied(int errorCode, String errorMsg) {
if (mCallback != null) {
try {
mCallback.onPayFalied(errorCode, errorMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
}
4.撰寫支付界面并且系結服務
package com.alibaba;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class PayActivity extends Activity {
private static final String TAG = PayActivity.class.getName();
private boolean misBind;
private EditText mPasswordBox;
private PayService.PayAction payAction;
private Alipayinfo mConnection;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay);
doBindService();
initView();
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (payAction != null) {
payAction.onUserCancle();
}
}
private void initView() {
Intent intent = getIntent();
String payinfo = intent.getStringExtra(Constants.KEY_BILL_INFO);
float paymoney = intent.getFloatExtra(Constants.KEY_PAY_MONEY, 0);
TextView orderInfotv = this.findViewById(R.id.order_info_tv);
orderInfotv.setText("支付資訊" + payinfo);
TextView payMoneytv = this.findViewById(R.id.pay_money);
payMoneytv.setText("支付金額" + paymoney + " 元");
mPasswordBox = this.findViewById(R.id.pay_password_input);
Button commitBtn = this.findViewById(R.id.pay_commit);
commitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//設定點擊事件
String password = mPasswordBox.getText().toString().trim();
if ("12345".equals(password) && payAction != null) {
Log.e(TAG, "paymoney -->" +paymoney );
payAction.pay(paymoney);
Log.e(TAG, "支付成功!");
finish();
Log.e(TAG, "payfinish" );
} else {
Toast.makeText(PayActivity.this, "密碼錯誤", Toast.LENGTH_SHORT).show();
return;
}
}
});
}
private void doBindService() {
Intent intent = new Intent(this,PayService.class);
// intent.setAction("com.alibaba.THIRD_PAY_INFO");
// intent.addCategory(Intent.CATEGORY_DEFAULT);
// intent.setPackage("com.alibaba");
mConnection = new Alipayinfo();
misBind = bindService(intent, mConnection, BIND_AUTO_CREATE);
}
public class Alipayinfo implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
payAction = (PayService.PayAction) service;
Log.e(TAG, "onServiceConnected payAction系結成功");
}
@Override
public void onServiceDisconnected(ComponentName name) {
payAction = null;
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if (mConnection != null && misBind) {
unbindService(mConnection);
misBind = false;
}
}
}
常量類如下所示
package com.alibaba;
public class Constants {
public static final String KEY_BILL_INFO = "key_bill_info";
public static final String KEY_PAY_MONEY = "key_pay_money";
}
現在基本實作了支付內部的服務的系結,現在要去撰寫第三方應用的系結服務就大功告成了
5.復制aidl到第三方應用的main包下,并且進行服務的系結
package com.example.client2callalipay;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.alibaba.ThirdPartPayAction;
import com.alibaba.ThirdPayResult;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private TextView count;
private Button buy;
private boolean misBind;
private AlipayConnection alipayConnection;
private ThirdPartPayAction thirdPartPayAction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//系結服務,在現在開發中,其實這部分是由支付寶的sdk完成的
bindAlipayService();
initView();
initListener();
}
private void bindAlipayService() {
Intent intent = new Intent();
intent.setAction("com.alibaba.THIRD_PART_PAY");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setPackage("com.alibaba");
alipayConnection = new AlipayConnection();
misBind = bindService(intent, alipayConnection, BIND_AUTO_CREATE);
}
private class AlipayConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(TAG, "onServiceConnected 服務已經系結上了");
thirdPartPayAction = ThirdPartPayAction.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e(TAG, "onServiceDisconnected: 服務已經銷毀 " );
}
}
private void initListener() {
buy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//進行充值
try {
if (thirdPartPayAction != null) {
thirdPartPayAction.requestPay("充值100積分",100,new PayCallback());
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
private class PayCallback extends ThirdPayResult.Stub{
@Override
public void onPaySuccess() throws RemoteException {
//支付成功,修改ui上的內容,實際上是修改后臺的資料
//其實,支付寶是通過回呼的url地址,通知我們服務器
Log.e(TAG, "onPaySuccess:");
count.setText("100積分");
Toast.makeText(MainActivity.this,"充值成功",Toast.LENGTH_SHORT).show();
}
@Override
public void onPayFalied(int errrorCode, String msg) throws RemoteException {
Log.e(TAG, "onPayFalied --> 充值失敗" );
Toast.makeText(MainActivity.this,"充值失敗",Toast.LENGTH_SHORT).show();
}
}
private void initView() {
buy = this.findViewById(R.id.buy_btn);
count = this.findViewById(R.id.count_tv);
}
//進行銷毀
@Override
protected void onDestroy() {
super.onDestroy();
if (misBind && alipayConnection != null) {
Log.e(TAG, "onDestroy ");
unbindService(alipayConnection);
alipayConnection = null;
misBind = false;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/290300.html
標籤:其他
