in packages-fetcher/console-fetcher-interceptor-res-risk/src/util/create-interceptor-response-rejected.ts [81:152]
export default function createInterceptorResponseRejected(o?: IFetcherInterceptorConfig): FetcherFnInterceptResponseRejected {
const riskConfig: IFetcherInterceptorConfig = {
CODE_FORBIDDEN,
CODE_NEED_VERIFY,
CODE_INVALID_INPUT,
...o
};
return async (error: FetcherError, fetcherConfig: FetcherConfig, response: FetcherResponse<Record<string, unknown>> | undefined, request: FetcherFnRequest): Promise<unknown> => {
const {
code
} = error;
const responseData = response?.data;
switch (code) {
case riskConfig.CODE_FORBIDDEN:
await riskForbidden();
throw convertToRiskErrorForbidden(error);
case riskConfig.CODE_NEED_VERIFY: {
const {
isMpk,
mpkIsDowngrade
} = convertMpkSetting({
riskConfig,
riskResponse: responseData
});
// 带上风控参数重新请求被风控的接口
const reRequestWithVerifyResult = async (verifyResult: RiskPromptResolveData): Promise<unknown> => {
const reRequestResponse = await request<unknown>(mergeConfig(fetcherConfig, canHaveBody(fetcherConfig) ? {
body: {
...verifyResult,
...isMpk && mpkIsDowngrade ? {
// 轻量级虚商的降级联路需要指定 riskVersion: '1.0' 来覆盖 riskVersion: '2.0'
riskVersion: '1.0'
} : {}
}
} : {
params: {
...verifyResult,
...isMpk && mpkIsDowngrade ? {
riskVersion: '1.0'
} : {}
}
}));
return reRequestResponse;
};
// 对于 OneConsole 控制台风控而言,如果请求参数中带有 riskVersion:2.0,那么说明是新版风控
const newRisk = ((): boolean | undefined => {
if (fetcherConfig.body && typeof fetcherConfig.body === 'object') {
return fetcherConfig.body.riskVersion === '2.0';
}
})();
const verifyResult = await riskPrompt({
error,
newRisk,
riskConfig,
reRequestWithVerifyResult,
riskResponse: responseData
});
return verifyResult.reRequestResponse;
}
default:
throw error;
}
};
}