曾经做过支付模块,当时只是考虑了正流程,其他的也没有太多的考虑,感觉支付也挺简单的。然而,最近在项目中,全面负责支付这一模块,瞬间觉得自己曾经思维是多么的不缜密。废话就不多说了。边写边整理一下这块逻辑实现。
前提1:支付方式 1.支付宝支付 2.余额支付
前提2:支付返回结果,不以支付宝同步返回结果为准,是以本地服务器为基准的。
前提3:在没有安装支付宝的前提下,余额支付与支付宝支付操作方式一样。
基础工作1:判断是否安装了支付宝APP
当存在支付宝支付方式时,我们需要做的第一件事情就是需要判断手机是否安装了支付宝APP。虽然在你拿着支付串去调用支付宝的时候,支付宝自己会识别,但是你自己程序内的逻辑也需要进行判断,后面写到的细节会解释这块内容。
如何判断你手机内是否安装了支付宝APP,见下面代码:
同时,还需要再plist进行配置白名单,否则iOS9以上这个判断无效。
基础工作2:注册监听home键是否进入前台。后面写到的细节会解释这块内容。
创建订单的过程就不说了,直接从拿着p++的订单NSData串去调支付宝开始。
支付宝支付:
1.手机安装了支付宝APP时:
(1)调起支付宝时,对于我们自己的APP来说,相当于执行了home键。我们的应用进入后台,支付宝应用进入前台。此时为了避免重复下单,需要记录我们APP的支付页面此时执行到流程的哪一步了。
(2)进入支付宝页面,我们可能会有4种操作方式。
A:对于iOS9以上系统来说,我们直接点击左上角返回键,直接返回我们自己的应用。
这种情况下返回我们的应用,是不走我们生命周期函数的。也不会走支付宝同步回调的那个方法的,此时是没有完成支付的。
存在的问题:
如果我们前期不记录离开我们自己应用时的执行状态,此时再次点击支付按钮,就是重复创建订单重复获取p++串,重复调用sdk了。这显然不是我们想要的结果。
解决方法:
a.在执行下面这段代码调起支付宝之前,先记录上次离开APP时这个界面执行到哪一步了,(到这里,应该是执行到获取p++串进行调用支付宝sdk这个流程了)
b.返回到我们应用时,我们使用home键监听,再监听的方法里去请求后台服务器是否支付成功。也就是支付查询结果协议。当然此时后台肯定会告诉你支付没有成功,后续处理方式因需求而异了。比如,重试,直接再次调起支付宝。
c.这里仍然需要注意一个小小的细节就是,home键监听稍微慢了些,也就是说先返回我们应用,之后也就是1s左右,home键监听的方法才执行,此时页面支付按钮仍然是可点击的,为了防止他点击,我们仍然可以在记录上次页面流程执行到哪一步的地方同时将页面可点击状态设置为不可点击,等到请求回支付查询结果协议后,变成可点击状态。这个处理也是因需求而异了。
B:我们点击取消,返回我们自己的应用
当我们在支付宝中点击取消,此时支付宝会同步回调到我们的应用中,告诉我们支付失败,这里需要注意一个细节。
a.我们的应用先执行回调方法,后home键监听的方法才执行,这个时候产生问题
存在问题:
在回调方法里会查询一次支付结果请求,在home键监听方法里也会查询一次支付结果请求。这样显然不合理。也会影响后续的操作。
解决方法: 【我的这种解决方法不是最优啦。】
因为调起支付宝进行支付,后续可能存在多种情况返回我们自己的应用,方便统一且不容易出错,在手机安装了支付宝APP应用的前提下,不管哪种方式返回我们自己的应用,都已home键监听为主,进行查询支付结果。这样就避免查询2次的可能。如果不以home键监听为主的话,我们会先请求支付查询结果,后由支付宝再打开我的APP。如果查询结果很快,当查询结果这个协议后续还有其他逻辑,比如延迟返回上一页,这时就会产生时间问题。比如支付宝打开我们的APP慢了些,导致支付宝返回我们APP直接返回到支付页面的上一页了
【有看我文章的小伙伴们,帮我一下,怎么实现,同步线程中,执行2个延时方法。也就是说,让2个延时方法同步执行。我目前测试得到的结果是,同步线程中,存在2个延迟执行的方法,他们两个并不是同步执行。也就是说存在同步线程异步执行的问题。】
C:我们点击home键,将支付宝应用挂起,此时重新点击我们自己的应用切换到前台。
重新点击我们的应用进入前台,此时是不走支付页面的生命周期函数的。
存在问题:与A一样
解决方法:与A一样
D:我们正常支付,支付成功或者失败后,自动返回我们自己的应用。
存在问题:与B一样。
解决方法:与B一样。
2.手机没有安装支付宝及采用余额支付时
手机没有安装支付宝,当我们拿着支付宝串去调支付宝时候,会通过支付宝sdk在我们的应用内直接调起支付宝网页进行支付。这时候就不会涉及到我们的APP打开支付宝或者支付宝打开我们的APP这些操作,也不会有因为我们应用于支付宝应用相互之间相互打开中间所产生的home键监听问题。
余额支付,直接在应用内完成,不会调起支付宝。所以,余额支付与手机没有安装支付宝支付的操作是一样的。他们只需要在支付回调方法里处理逻辑。
总结:
感觉自己写的比较固执。大部分是按照项目需求进行写了。还有些细节可能因需求而异不会那么做,也就没写了。但是主流程我觉得还是可以跟大家分享的。有不当的地方,希望看到的朋友们能帮我指出来。重要的是我提的问题,这个很急,有知道的朋友联系我呀(QQ:702042658)。超级感谢了。