这是一份关于多端登录功能的技术实现笔记,主要围绕微信登录手机号一键微信登录这两种方式,在小程序、H5网页、原生App(iOS/安卓) 三个不同平台上的实现要点。

我来为你详细解读一下其中的内容。

核心概要

这份笔记的核心是讲解如何集成“微信”和“手机号”这两种主流的登录方式。它区分了三个主要的技术场景,并列出了每个场景下的关键代码和实现流程。


1. 小程序登录 (Mini Program)

在小程序中,提供了两种用户体验极佳的登录方式:

a) 微信无感登录 (Seamless WeChat Login)

这是一种非常流畅的登录体验。用户打开小程序时,系统可以在用户无感知的情况下自动完成登录或注册。

  • 流程:
    1. 前端调用 uni.login:代码 await uni.login({ provider: "weixin", onlyAuthorize: true }) 被调用。这里的 uni.loginuni-app 框架的 API,等同于原生小程序的 wx.login()
      • onlyAuthorize: true 是一个关键参数,它表示只进行授权,不弹出授权窗口,从而获取一个临时的登录凭证 code
    2. 发送 code 到后端:前端拿到这个 code 后,将其发送给自己的服务器。
    3. 后端换取用户信息:后端服务器使用这个 code,再加上小程序的 AppID 和 AppSecret,向微信服务器请求,换取用户的唯一标识 openid 和会话密钥 session_key
    4. 后端返回 token:后端根据 openid 判断用户是新用户还是老用户,完成注册或登录逻辑,并生成一个自定义的登录状态凭证(通常叫 token),返回给前端。前端后续请求都携带这个 token
b) 手机号一键登录 (One-click Phone Number Login)

当需要获取用户的手机号时,微信提供了一种安全、便捷的方式,用户只需点击一下按钮授权即可,无需手动输入。

  • 流程:
    1. 前端设置授权按钮
      • 在界面上放置一个特殊的按钮:<button open-type="getPhoneNumber" @getphonenumber="handleGetPhoneNumber">
      • open-type="getPhoneNumber" 是关键,它告诉微信这个按钮是用来请求用户手机号授权的。
    2. 用户授权:用户点击按钮,微信会弹出一个授权窗口,询问用户是否同意小程序获取其手机号。
    3. 获取手机号的 code:如果用户同意,@getphonenumber 事件会被触发,回调函数会收到一个专门用于换取手机号的 code(在 e.detail.code 中)。
    4. 获取登录的 code:同时,前端还需要像“无感登录”一样,调用 uni.login() 获取一个登录 code
    5. 将两个 code 发送到后端:前端将登录 code获取手机号的 code 一起发送给后端。
    6. 后端解密手机号并返回 token:后端先用登录 code 换取 session_key,再用 session_key 和获取手机号的 code 去解密手机号信息。然后将手机号与用户账户绑定,并返回 token 给前端。

2. H5 网页登录 (Web Page)

H5 网页的登录方式相对传统,笔记中主要讲解了微信登录的两种不同场景。

a) 场景一:在微信内置浏览器中打开

当用户在微信聊天或朋友圈里点开你的网页时,可以使用微信网页授权登录。

  • 流程:
    1. 前端重定向到微信授权页
      • 构造一个微信授权 URL,地址是:https://open.weixin.qq.com/connect/oauth2/authorize
      • 这个 URL 需要拼接上你的 appidredirect_uri(授权后跳回的地址)、scope(授权范围,如 snsapi_userinfo)等参数。
    2. 用户授权:微信会显示一个授权页面,用户点击同意。
    3. 微信跳回你的页面:微信会带着一个临时的 code 参数,跳转回你指定的 redirect_uri
    4. 后端换取 token:你的前端页面从 URL 中拿到 code,发给后端,后端用这个 code 去换取 access_token 和用户的 openid、昵称、头像等信息,完成登录。
    • 笔记中提到的 window.location.href = '拼好的连接' 就是执行这个重定向操作。
b) 场景二:在非微信的外部浏览器中打开 (如 PC 网站)

当用户在电脑浏览器上访问你的网站时,可以提供一个“微信扫码登录”的功能。

  • 流程:
    1. 前端重定向到微信二维码页
      • 构造另一个微信授权 URL,地址是:https://open.weixin.qq.com/connect/qrconnect
      • 同样需要拼接 appidredirect_uri 等参数。
    2. 显示二维码:这个页面会展示一个让用户扫描的二维码。
    3. 用户扫码授权:用户用手机微信扫描二维码,并在手机上确认登录。
    4. 微信跳回你的页面:确认后,PC 浏览器页面会自动跳转回你指定的 redirect_uri,并携带 code,后续流程同上。
    • 笔记中提到的 window.location.replace 也是一种页面跳转方式,与 href 的区别在于它不会在浏览器历史中留下记录。

3. 原生 App 登录 (iOS 和 Android)

对于原生 App,集成微信登录需要使用微信开放平台提供的 SDK。

  • 代码逻辑相似:整体的授权逻辑(调起微信 -> 用户授权 -> 返回 App -> 拿到 code -> 发给后端)和 H5 网页授权是类似的。
  • 但有平台特定的配置条件
    • 安卓 (Android):需要在微信开放平台注册你的应用,获取 AppID,并在项目中正确配置。这是微信识别你应用的凭证。
    • iOS:除了 AppID,还需要配置 Links。这通常指的是 Universal Links (通用链接)。这是 iOS 的一种机制,用于在用户授权后,能从微信 App 安全地跳回到你的 App 中。

总结

这份笔记清晰地梳理了不同平台下实现微信和手机号微信登录的技术路径和关键点:

  • 小程序:利用微信提供的原生能力 (uni.login, getPhoneNumber),体验最流畅。
  • H5 网页:遵循标准的 OAuth 2.0 网页授权协议,根据是否在微信环境内,使用不同的授权入口 (oauth2/authorize vs qrconnect)。
  • 原生 App:依赖微信官方 SDK,并需要进行严格的平台相关配置(安卓的 AppID 签名,iOS 的 Universal Links)。

更多推荐