// // AccreditLoginHandler.swift // ylgamehall // // H5 → Native handler:accreditlogin — 微信授权登录 // 契约:docs/H5-Native-Contract.md §3.1 [1] + §3.2 [10]sharelogin // // 完整链路(Phase 4.E): // 1. WeChatAuth.authorize() → 拉起微信授权 + 客户端直拼 oauth2 + userinfo // (msext NewRootVC.m:2415-2428 等价路径,沿用 AppID/AppSecret/scope) // 2. bridge.call("sharelogin", data: 7 字段) 反向 callback // 字段名严格 1:1 含历史包袱:`Province` 大写 P / `city` 经 danbian 去单引号 // // ⚠️ canImport(WechatOpenSDK) 守卫:SDK 未链接前走 stub(与 Phase 4.A 一致), // 仅响应 callback 不触发 sharelogin;项目方在 Xcode Embed & Sign 后真实路径激活。 // import Foundation public enum AccreditLoginHandler { public static func register(on bridge: any BridgeProtocol) { bridge.register("accreditlogin") { _, callback in print("[Bridge] accreditlogin H5 调用命中 ✅") callback?(.string("Response from accreditlogin")) // 拉起微信授权 → 拿 7 字段 → 反向 callback sharelogin Task { @MainActor in do { let user = try await WeChatAuth.authorize() print("[Bridge] accreditlogin 拿到 user,发 sharelogin 反向 callback") bridge.call("sharelogin", data: .object([ // 字段名严格 1:1 contract §3.2 表 [10] / msext NewRootVC.m:2428 "openid": .string(user.openid), "headimgurl": .string(user.headimgurl), "nickname": .string(user.nickname), "sex": .number(Double(user.sex)), "city": .string(user.city), "Province": .string(user.Province), // ← 大写 P "unionid": .string(user.unionid) ]), callback: nil) } catch WeChatAuthError.userCancelled { print("[Bridge] accreditlogin 用户取消授权(errCode -2)") // msext 行为:用户取消不弹 alert、不触发 sharelogin } catch { print("[Bridge] accreditlogin 失败:\(error)") // 其它失败也吞下(msext 同款乐观策略:不反向通知 H5) } } } } }