微信sdk更新,修正上传门头照照片错误

This commit is contained in:
2026-07-12 16:10:11 +08:00
parent e8823a0640
commit 656e906254
6 changed files with 126 additions and 27 deletions
+58 -8
View File
@@ -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',