描述
APP中有商城功能,然后集成支付宝来支付。
在测试支付功能的时候,本来应该:支付成功后检查订单状态如果成功支付了,就跳转订单详情并显示定位状态为待发货。
但实际上,检查后就还是支付界面,没有跳转。
![](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
分析
代码:日志追踪流程排查bug点
我先是去看了代码,然后用日志追踪整个流程排查bug点在哪里。
PayActivity类:支付界面
依次是:
onAlipayStatusChanged -> checkPayStatus -> loadData -> showData
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
@Subscribe(threadMode = ThreadMode.MAIN) public void onAlipayStatusChanged(AlipayStatusChangedEvent event) { String resultStatus = event.getData().getResultStatus();
if ("9000".equals(resultStatus)) {
isPayed = true;
showLoading(R.string.hint_pay_wait); Timber.d("本地支付成功:onAlipayStatusChanged"); binding.primary.postDelayed(() -> { checkPayStatus(); }, 3000);
} else if ("6001".equals(resultStatus)) { SuperToast.show(R.string.error_pay_cancel); } else { SuperToast.show(R.string.error_pay_failed); } }
private void checkPayStatus() { hideLoading(); Timber.d("进入:checkPayStatus 检查状态");
loadData(); } @Override protected void loadData(boolean isPlaceholder) { Timber.d("进入:loadData 开始加载数据");
super.loadData(isPlaceholder); DefaultRepository.getInstance() .orderDetail(id) .to(autoDisposable(AndroidLifecycleScopeProvider.from(this))) .subscribe(new HttpObserver<DetailResponse<Order>>() { @Override public void onSucceeded(DetailResponse<Order> data) {
showData(data.getData()); } }); }
private void showData(Order data) { this.data = data;
binding.price.setText(getResources().getString(R.string.price, data.getPrice()));
Timber.d("支付了吗? " + data.isPaid());
if (data.isPaid()) { EventBus.getDefault().post(new PaySuccessEvent());
finish();
Timber.d("支付成功了"); startActivityExtraId(OrderDetailActivity.class, data.getId()); } else { Timber.d("没有支付"); startCountDown(); } }
|
然后经过追踪发现:
在 onAlipayStatusChanged
里面支付宝确实是已经支付了。(不然呢,我钱都少了一毛)
但是在onShow
里面if (data.isPaid())
判断的时候,确实没有支付。
手机抓网络包确认是后端问题
然后我查看了,抓包日志。
![image-20230523180413575](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
最后知道,这个订单支付前支付后两个状态都是0,也就是未支付。
所以这是后端在处理这个order的状态时候没有变更。
实现
为了实现目的效果,只能本地自己改一下
PayActivity中设置一个变量isPayed。默认为false
表示临时订单有没有支付。
然后在支付宝反馈为是的时候,改为true
![image-20230523181111076](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
在PayAcivity
的showData
方法中判断/
如果是开发阶段同时这个变量为ture就手动设置这里的订单状态为已经支付
![image-20230523180850546](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
到这里,app就可以正常跳转到订单详情界面。
但是订单详情的信息还是未支付
。
因为这里的判断订单还是用的请求网络。
![image-20230523181259738](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
那就只能在展示数据的时候,再改这个状态
![image-20230523181333275](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
最后结果:
![](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
总结
工作中遇到后端的bug要即使反馈给后端人员。
学习的话,灵活变通。