描述

APP中有商城功能,然后集成支付宝来支付。

在测试支付功能的时候,本来应该:支付成功后检查订单状态如果成功支付了,就跳转订单详情并显示定位状态为待发货。

但实际上,检查后就还是支付界面,没有跳转。

分析

代码:日志追踪流程排查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
/**
* 支付宝支付状态改变了
*
* @param event
*/
@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");
//延时3秒
//因为支付宝回调我们服务端可能有延迟
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()));

//因为后端这里并没有改order的status从0(未支付)到500(已经支付,等待发货)
// if (BuildConfig.DEBUG && isPayed){
// data.setStatus(501);
// }

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

最后知道,这个订单支付前支付后两个状态都是0,也就是未支付。

所以这是后端在处理这个order的状态时候没有变更。

实现

为了实现目的效果,只能本地自己改一下

PayActivity中设置一个变量isPayed。默认为false

表示临时订单有没有支付。

然后在支付宝反馈为是的时候,改为true

image-20230523181111076

PayAcivityshowData方法中判断/

如果是开发阶段同时这个变量为ture就手动设置这里的订单状态为已经支付

image-20230523180850546

到这里,app就可以正常跳转到订单详情界面。

但是订单详情的信息还是未支付

因为这里的判断订单还是用的请求网络。

image-20230523181259738

那就只能在展示数据的时候,再改这个状态

image-20230523181333275

最后结果:

总结

工作中遇到后端的bug要即使反馈给后端人员。

学习的话,灵活变通。