diff --git a/apps/h5-partner/src/components/OssUploadField.tsx b/apps/h5-partner/src/components/OssUploadField.tsx index 6e82c87..16928f3 100644 --- a/apps/h5-partner/src/components/OssUploadField.tsx +++ b/apps/h5-partner/src/components/OssUploadField.tsx @@ -117,10 +117,16 @@ export default function OssUploadField({ setAuthorizing(true); setError(''); try { - await authorizePartnerWechat(); + const result = await authorizePartnerWechat(); + if (result) { + const me = await fetchPartnerProfile(); + setProfile(me); + onWechatReadyChange?.(!!me.hasWechat); + } } catch (e) { const text = e instanceof Error ? e.message : '微信授权失败'; showUploadError(text); + } finally { setAuthorizing(false); } } @@ -139,9 +145,11 @@ export default function OssUploadField({ count: 1, sourceType: ['album', 'camera'], }); - if (!files?.[0]) { - throw new Error('未能获取图片,请重试'); + if (!files) { + openNativeFilePicker(); + return; } + if (!files[0]) return; await uploadSelectedFile(files[0]); }); } finally { diff --git a/apps/h5-partner/src/contexts/PartnerSessionContext.tsx b/apps/h5-partner/src/contexts/PartnerSessionContext.tsx index 03c8d04..81428af 100644 --- a/apps/h5-partner/src/contexts/PartnerSessionContext.tsx +++ b/apps/h5-partner/src/contexts/PartnerSessionContext.tsx @@ -50,6 +50,7 @@ function accountFromProfile(profile: PartnerSessionProfile): PartnerAccount { staffRole: profile.staffRole, permissions: profile.permissions, primaryAccountId: profile.primaryAccountId, + hasWechat: profile.hasWechat, }; } diff --git a/apps/h5-partner/src/lib/api.ts b/apps/h5-partner/src/lib/api.ts index dd7b225..cc32e40 100644 --- a/apps/h5-partner/src/lib/api.ts +++ b/apps/h5-partner/src/lib/api.ts @@ -22,7 +22,10 @@ const AUTH_RECOVERY_EXEMPT_PATHS = [ '/partner/auth/login/wechat', ]; -export type PartnerSessionProfile = Pick & { +export type PartnerSessionProfile = Pick< + PartnerMe, + 'id' | 'name' | 'phone' | 'companyName' | 'isPrimary' | 'permissions' | 'primaryAccountId' | 'hasWechat' +> & { staffRole?: PartnerStaffRole; }; @@ -106,6 +109,7 @@ function profileFromMe(me: PartnerMe): PartnerSessionProfile { staffRole: me.staffRole ?? undefined, permissions: me.permissions, primaryAccountId: me.primaryAccountId, + hasWechat: me.hasWechat, }; } diff --git a/apps/h5-partner/src/lib/wechat-auth.ts b/apps/h5-partner/src/lib/wechat-auth.ts index 745173e..7f3d7ec 100644 --- a/apps/h5-partner/src/lib/wechat-auth.ts +++ b/apps/h5-partner/src/lib/wechat-auth.ts @@ -48,6 +48,7 @@ export function sessionFromWechatLogin(result: WechatLoginResult): PartnerSessio phone: String(partner.phone ?? ''), companyName: partner.companyName ? String(partner.companyName) : undefined, isPrimary: partner.isPrimary !== false, + hasWechat: true, } : undefined, }; diff --git a/apps/h5-partner/src/pages/StoreCreatePage.tsx b/apps/h5-partner/src/pages/StoreCreatePage.tsx index 1fe7bc4..0c921bd 100644 --- a/apps/h5-partner/src/pages/StoreCreatePage.tsx +++ b/apps/h5-partner/src/pages/StoreCreatePage.tsx @@ -135,17 +135,11 @@ export default function StoreCreatePage() { useEffect(() => { - if (step !== 2 || !isWechatEnv()) return; - void refresh(); - void weixinSdk.init().catch(() => { - /* OssUploadField 点击时会再次初始化 */ - }); - }, [step, refresh]); diff --git a/packages/weixin-sdk/src/jssdk.ts b/packages/weixin-sdk/src/jssdk.ts index 8f7657d..d045741 100644 --- a/packages/weixin-sdk/src/jssdk.ts +++ b/packages/weixin-sdk/src/jssdk.ts @@ -9,17 +9,13 @@ let scriptPromise: Promise | null = null; let configured = false; let configuredUrl: string | null = null; -/** 参与 JSSDK 签名的页面 URL(去掉 hash、OAuth 回跳参数) */ +/** 参与 JSSDK 签名的页面 URL(去掉 hash、query;SPA 步骤参数不参与签名) */ export function normalizeJssdkPageUrl(rawUrl: string): string { try { const url = new URL(rawUrl); - url.hash = ''; - url.searchParams.delete('code'); - url.searchParams.delete('state'); - const query = url.searchParams.toString(); - return `${url.origin}${url.pathname}${query ? `?${query}` : ''}`; + return `${url.origin}${url.pathname}`; } catch { - return rawUrl.split('#')[0]; + return rawUrl.split('#')[0].split('?')[0]; } } diff --git a/server/dukang-api/src/integrations/oss/oss-log.util.ts b/server/dukang-api/src/integrations/oss/oss-log.util.ts index c018d44..5a21654 100644 --- a/server/dukang-api/src/integrations/oss/oss-log.util.ts +++ b/server/dukang-api/src/integrations/oss/oss-log.util.ts @@ -24,18 +24,24 @@ type LogOssUploadInput = { }; export async function logOssUpload(prisma: PrismaService, input: LogOssUploadInput) { - const row = await prisma.logThirdParty.create({ - data: { - provider: 'ALIYUN_OSS', - scene: input.scene, - refType: input.actorRef?.refType, - refId: input.actorRef?.refId, - requestBody: input.requestBody as never, - responseBody: input.responseBody as never, - externalNo: input.externalNo?.slice(0, 128), - status: input.status, - errorMessage: input.errorMessage?.slice(0, 512), - }, - }); - return row.id; + try { + const row = await prisma.logThirdParty.create({ + data: { + provider: 'ALIYUN_OSS', + scene: input.scene, + refType: input.actorRef?.refType, + refId: input.actorRef?.refId, + requestBody: input.requestBody as never, + responseBody: input.responseBody as never, + externalNo: input.externalNo?.slice(0, 128), + status: input.status, + errorMessage: input.errorMessage?.slice(0, 512), + }, + }); + return row.id; + } catch (err) { + // 日志表/枚举未就绪时不阻断上传主流程 + console.error('[oss-upload-log] write failed:', err instanceof Error ? err.message : err); + return null; + } } diff --git a/server/dukang-api/src/modules/common/wechat.controller.ts b/server/dukang-api/src/modules/common/wechat.controller.ts index 6589430..7a21a37 100644 --- a/server/dukang-api/src/modules/common/wechat.controller.ts +++ b/server/dukang-api/src/modules/common/wechat.controller.ts @@ -86,13 +86,9 @@ export class WechatController { private normalizeJssdkUrl(rawUrl: string): string { try { const parsed = new URL(rawUrl); - parsed.hash = ''; - parsed.searchParams.delete('code'); - parsed.searchParams.delete('state'); - const query = parsed.searchParams.toString(); - return `${parsed.origin}${parsed.pathname}${query ? `?${query}` : ''}`; + return `${parsed.origin}${parsed.pathname}`; } catch { - return rawUrl; + return rawUrl.split('#')[0].split('?')[0]; } }