赞
踩
通过跨进程调用支付服务来模拟支付宝的第三方应用支付场景
通过aidl来实现跨进程服务通信。
支付的话,可以分为两部分考虑,首先是调用支付宝进行支付,那么首先会进入一个支付页面,这个页面是由支付宝生成的,也就是我们启动支付宝的第三方支付服务的时候,支付宝会首先调用一个支付页面,而支付页面所展示的信息,比如支付的订单信息,支付的金额信息,都是需要第三方应用来传递个支付宝的,所以此处第三方应用调用服务时,还需要给支付宝传递这些订单信息,我们把这一块儿抽象为一个接口,即ThirdPartPayAction(第三方支付动作),主要包含三个参数,即:String orderInfo, int orderMoney , ThirdPartPayResult callBack。其中的ThirdPartPayResult可能初学的同学不太理解,这里展开说一下:
翻译过来就是第三方支付结果,我们知道当支付成功之后会有所操作,那么这个操作是在支付之后执行的,而第三方应用此时如果要获取支付成功与否的信息,并且进行响应的话,支付宝需要告诉第三方应用支付是否成功,那么就涉及到一个信息的传递,而目前就本人已知的进程间通讯也就是靠调用服务来实现的,如果是一个应用中的话,当然可以使用其他方式。而依然使用aidl来实现这一步的通讯的话,非常麻烦,同时也会占用更多的内存和cpu资源。而此时如果支付宝提供一个可供我们进行继承的接口,我们来实现它给我们的方法,最后由支付宝在确定支付结果之后自动执行我们想要的方法, 这不就很简单了吗?
比如我们重写支付成功的方法,那么支付宝在支付成功后便会自己调用这个方法。
在ThirdPartPayResult中,我们定义了两个方法:
1、创建PayService并且使之继承自Service,同时在安卓manifest文件中进行注册,为了接受第三方app的绑定启动,配置action和category,同时将exported设置为true
2、重写onBind方法
在第三方应用进行绑定启动服务的时候,回调用onBind方法, 此时我们需要判断action是否正确,如果action对应的上的话,那么我们就返回进行支付活动的接口实现类,注意这个接口实现类,继承自ThirdPartPayAction.Stub,我们如果要在进程间进行服务的通信的话,使用的都得是aidl中定义的接口,而且要保证两个app的aidl完全相同,同时传递的类是可序列化的,否则都不能成功。而继承类,我们也要进行一些方法的实现
此类继承自ThirdPartPayAction.Stub
先重写一个requestPay方法,也就是请求支付的方法。
在这个方法中,我们首先需要打开一直支付界面,即PayActivity,同时传递我们想要显示的数据以及在客户端进行接口实现的callBack方法。
以及根据支付的情况对callBack进行调用
如果说action对的上的话,就返回这个类给客户端
因为aidl里面写的接口,安卓会自动为我们生成文件,而这个文件已经继承自binder类了
可以观察到,.Stub文件内部类已经继承自android.os.Binder了,同时实现了ThirdPartPayAction接口,这就是我们想要的实现类了。这样就可以直接返回binder了。
完成上述这一切之后,支付页面就已经启动了,此时我们除了读取传输过来的订单数据并进行显示以外,还需要一直密码输入流程以及支付流程吧!
类似于这样的一个界面。
此时我们的密码验证操作,可以直接从这里去数据库进行校验,当然这是简单的写法,商用的话害的考虑数据库的安全性。在支付的时候依然需要用到支付这个服务的,所以这个activity也是需要调用服务功能的,在密码正确,支付成功的时候要调用支付成功的回调方法, 在密码错误时进行提示,再点击返回时,要取消支付,这些都是需要在PayService中回调callBack的。
这里依然是需要绑定服务的,当然因为是一个app内的,我们可以直接使用绑定启动,同时除了第三方支付的action之外,没有其他action,所以直接else返回即可。
PayAction的具体实现
其实就是简单的对支付结果进行了回调。
点击返回按钮时也要调用支付失败的回调。
首先在安卓11,也就是api30之后,要进行跨进程绑定服务的话,需要在manifest中进行一些配置:
需要打开QUERY_ALL_PACKAGES的权限,或者是在 标签中声明需要访问的服务的包名。
在mainActivity中,我们首先要进行服务的绑定操作。设置对应的action,category以及对应的包名。通过绑定服务是获取到binder返回,也就是继承serviceConnection中的service,通过ThirdPartPayAction.Stub.asInterface转成我们需要的接口实现类的对象。然后便可以绑定按钮的监听,进行request-Pay操作了。在调用requestPay操作时,我们还需要重写callback方法。做好以上步骤之后,简易的客户端就算是搭建完毕了,最后别忘记销毁服务绑定。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。