fix(reward-service): 修复 WalletServiceClient 未正确解析 wallet-service 响应格式的 Bug
问题原因:
wallet-service 使用全局 TransformInterceptor 拦截器,会将所有响应包装成:
{ success: true, data: { success: boolean, ... }, timestamp: "..." }
原代码直接读取外层的 success 字段(始终为 true),导致即使业务失败
(内层 data.success = false)也被误判为成功。
具体案例:
用户 D25122700024 点击结算时,wallet-service 因余额不足返回:
{ success: true, data: { success: false, error: "Insufficient..." }, ... }
reward-service 误读为成功,导致奖励被标记为 SETTLED 但钱包余额未变更。
修复内容:
1. settleToBalance: 解析 response_data.data 获取真实业务结果
2. confirmPlantingDeduction: 同上
3. allocateFunds: 同上
所有方法现在会:
- 使用 response_data.data || response_data 兼容包装和非包装格式
- 严格检查 data.success !== true 来判断业务是否成功
- 失败时记录详细错误日志
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
8b80e45524
commit
ec71121907
|
|
@ -133,6 +133,19 @@ export class WalletServiceClient {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wallet-service 使用全局 TransformInterceptor,响应格式为:
|
||||||
|
// { success: true, data: { success: boolean, ... }, timestamp: "..." }
|
||||||
|
const response_data = await response.json();
|
||||||
|
const data = response_data.data || response_data;
|
||||||
|
|
||||||
|
if (data.success !== true) {
|
||||||
|
this.logger.error(`Confirm deduction failed for order ${params.orderId}: ${data.error || 'Unknown error'}`);
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
error: data.error || 'Confirm deduction failed',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
this.logger.log(`Successfully confirmed deduction for order ${params.orderId}`);
|
this.logger.log(`Successfully confirmed deduction for order ${params.orderId}`);
|
||||||
return { success: true };
|
return { success: true };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -181,14 +194,25 @@ export class WalletServiceClient {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.json();
|
const response_data = await response.json();
|
||||||
|
// wallet-service 使用全局 TransformInterceptor,响应格式为:
|
||||||
|
// { success: true, data: { success: boolean, ... }, timestamp: "..." }
|
||||||
|
const data = response_data.data || response_data;
|
||||||
|
|
||||||
|
if (data.success !== true) {
|
||||||
|
this.logger.error(`Settlement failed for ${params.accountSequence}: ${data.error || 'Unknown error'}`);
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
error: data.error || 'Settlement failed',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
this.logger.log(`Successfully settled to balance for ${params.accountSequence}`);
|
this.logger.log(`Successfully settled to balance for ${params.accountSequence}`);
|
||||||
return {
|
return {
|
||||||
success: data.success,
|
success: true,
|
||||||
settlementId: data.settlementId,
|
settlementId: data.settlementId,
|
||||||
settledAmount: data.settledAmount,
|
settledAmount: data.settledAmount,
|
||||||
balanceAfter: data.balanceAfter,
|
balanceAfter: data.balanceAfter,
|
||||||
error: data.error,
|
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.logger.error(`Error settling to balance for ${params.accountSequence}:`, error);
|
this.logger.error(`Error settling to balance for ${params.accountSequence}:`, error);
|
||||||
|
|
@ -224,6 +248,19 @@ export class WalletServiceClient {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wallet-service 使用全局 TransformInterceptor,响应格式为:
|
||||||
|
// { success: true, data: { success: boolean, ... }, timestamp: "..." }
|
||||||
|
const response_data = await response.json();
|
||||||
|
const data = response_data.data || response_data;
|
||||||
|
|
||||||
|
if (data.success !== true) {
|
||||||
|
this.logger.error(`Allocate funds failed for order ${request.orderId}: ${data.error || 'Unknown error'}`);
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
error: data.error || 'Allocate funds failed',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
this.logger.log(`Successfully allocated funds for order ${request.orderId}`);
|
this.logger.log(`Successfully allocated funds for order ${request.orderId}`);
|
||||||
return { success: true };
|
return { success: true };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue