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:
hailin 2026-01-06 03:38:00 -08:00
parent 8b80e45524
commit ec71121907
1 changed files with 40 additions and 3 deletions

View File

@ -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}`);
return { success: true };
} 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}`);
return {
success: data.success,
success: true,
settlementId: data.settlementId,
settledAmount: data.settledAmount,
balanceAfter: data.balanceAfter,
error: data.error,
};
} catch (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}`);
return { success: true };
} catch (error) {