微信sdk更新,修正上传门头照照片错误
This commit is contained in:
@@ -1,5 +1,11 @@
|
||||
import { getRuntimePlatform, isIosDevice, isWechatDevTools } from './env';
|
||||
import { ensureJssdkReady, normalizeJssdkPageUrl } from './jssdk';
|
||||
import {
|
||||
ensureJssdkReady,
|
||||
getJssdkSignUrl,
|
||||
initWechatJssdk,
|
||||
normalizeJssdkPageUrl,
|
||||
resetJssdkConfig,
|
||||
} from './jssdk';
|
||||
import type { WeixinSdkConfig } from './types';
|
||||
|
||||
export type ChooseWechatImageOptions = {
|
||||
@@ -108,6 +114,45 @@ function localIdToFile(localId: string): Promise<File> {
|
||||
});
|
||||
}
|
||||
|
||||
function checkJsApi(apiName: string): Promise<boolean> {
|
||||
return new Promise((resolve) => {
|
||||
if (!window.wx?.checkJsApi) {
|
||||
resolve(!!window.wx?.chooseImage);
|
||||
return;
|
||||
}
|
||||
window.wx.checkJsApi({
|
||||
jsApiList: [apiName],
|
||||
success: (res) => resolve(!!res.checkResult?.[apiName]),
|
||||
fail: () => resolve(false),
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function ensureChooseImageJssdk(config: WeixinSdkConfig): Promise<void> {
|
||||
const jssdkOptions = {
|
||||
apiBase: config.apiBase ?? '/api/v1',
|
||||
clientApp: config.clientApp,
|
||||
getAccessToken: config.getAccessToken,
|
||||
jsApiList: ['chooseImage', 'getLocalImgData'],
|
||||
};
|
||||
|
||||
await ensureJssdkReady(jssdkOptions);
|
||||
|
||||
let ready = await checkJsApi('chooseImage');
|
||||
if (!ready) {
|
||||
resetJssdkConfig();
|
||||
await initWechatJssdk({ ...jssdkOptions, url: getJssdkSignUrl() });
|
||||
ready = await checkJsApi('chooseImage');
|
||||
}
|
||||
if (!ready) {
|
||||
throw new Error('微信选图接口未授权,请刷新页面后重试');
|
||||
}
|
||||
}
|
||||
|
||||
function isPermissionDeniedError(msg: string): boolean {
|
||||
return /permission|denied|invalid signature|config:fail|signature|接口未就绪|offline verifying/i.test(msg);
|
||||
}
|
||||
|
||||
function invokeChooseImage(
|
||||
count: number,
|
||||
sourceType: Array<'album' | 'camera'>,
|
||||
@@ -144,13 +189,14 @@ export async function chooseWechatImages(
|
||||
|
||||
if (platform === 'wechat-h5') {
|
||||
const sourceTypeKey = sourceType.join(',');
|
||||
const jssdkOptions = {
|
||||
apiBase: config.apiBase ?? '/api/v1',
|
||||
clientApp: config.clientApp,
|
||||
getAccessToken: config.getAccessToken,
|
||||
jsApiList: ['chooseImage', 'getLocalImgData'],
|
||||
};
|
||||
try {
|
||||
await ensureJssdkReady({
|
||||
apiBase: config.apiBase ?? '/api/v1',
|
||||
clientApp: config.clientApp,
|
||||
getAccessToken: config.getAccessToken,
|
||||
jsApiList: ['chooseImage', 'getLocalImgData'],
|
||||
});
|
||||
await ensureChooseImageJssdk(config);
|
||||
} catch (e) {
|
||||
const errMsg = e instanceof Error ? e.message : 'JSSDK 初始化失败';
|
||||
void reportChooseImageEvent(config, { status: 'fail', errMsg, sourceType: sourceTypeKey, stage: 'jssdk' });
|
||||
@@ -171,6 +217,10 @@ export async function chooseWechatImages(
|
||||
let lastError: Error | null = null;
|
||||
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
||||
if (attempt > 0) {
|
||||
if (lastError && isPermissionDeniedError(lastError.message)) {
|
||||
resetJssdkConfig();
|
||||
await initWechatJssdk({ ...jssdkOptions, url: getJssdkSignUrl() });
|
||||
}
|
||||
await delay(800);
|
||||
}
|
||||
try {
|
||||
@@ -180,7 +230,7 @@ export async function chooseWechatImages(
|
||||
} catch (e) {
|
||||
lastError = e instanceof Error ? e : new Error('无法打开相册');
|
||||
const raw = lastError.message;
|
||||
const retryable = /offline verifying|权限验证中|接口未就绪/i.test(raw);
|
||||
const retryable = /offline verifying|权限验证中|接口未就绪/i.test(raw) || isPermissionDeniedError(raw);
|
||||
if (attempt < maxAttempts - 1 && retryable) continue;
|
||||
void reportChooseImageEvent(config, {
|
||||
status: 'fail',
|
||||
|
||||
Reference in New Issue
Block a user