跨平台手机号:微信手机号授权登录、微信授权登录双登录实现账户生态融合,新时代的身份密钥

news2024/11/15 6:53:19

在这里插入图片描述

小程序厂商的多样性体现在开发工具、服务领域、商业模式等多方面,各厂商凭借独特的技术优势、行业解决方案和市场策略,满足不同企业和用户需求。与此同时,随着移动互联网发展,手机号统一登录成为提升用户体验、简化登录流程的关键趋势。通过手机号统一登录,开发者可以实现发布在不同厂商平台的小程序,实现账号的统一

微信小程序的登录流程机制基于微信提供的官方接口,旨在让小程序能够安全、便捷地获取微信用户的授权信息,进而实现用户在小程序内的快速登录。

微信授权登录

  • 基于微信账号体系:用户直接使用自己的微信账号进行登录,无需额外注册小程序或应用的独立账户。

  • 一键授权:用户点击“微信登录”按钮后,通过微信授权机制,快速将微信账号信息授权给第三方应用或小程序。

  • 安全可靠:微信作为中间信任方,保证用户身份的真实性,降低账户盗用风险。同时,微信不直接提供用户的敏感信息(如密码、手机号等)给第三方,而是提供经过安全处理的用户标识符(如openid、unionid等)。

  • 跨平台与设备同步:用户在任何设备或平台上,只要使用相同的微信账号登录,都能获得一致的登录状态,无需记忆多个账户和密码。

微信手机号登录

  • 一键授权:用户只需在小程序内点击“授权并登录”按钮,即可通过微信授权机制快速获取其绑定的手机号,无需手动输入,极大地简化了登录过程,提升了用户体验。

  • 数据安全:微信在传输过程中对用户的手机号进行加密处理,小程序端接收到的是加密后的数据(包括encryptedData和iv)。只有配合小程序登录时获取的session_key,才能在服务器端解密出真实的手机号,有效保障了用户隐私数据的安全。

  • 账户关联:对于已注册但未绑定微信的小程序用户,手机号登录功能可实现微信账号与其原有账户的快速关联,方便用户使用同一手机号在不同设备或场景下无缝切换登录状态。

一、微信授权登录

1、流程概述

微信小程序登录流程主要包括以下几个步骤:

  • 小程序端发起登录请求

    • 使用 wx.login() API 获取微信临时登录凭证(code)。
    • wx.login() 是小程序内发起登录请求的关键接口,调用后微信客户端会返回一个 code,此 code 只能用于换取微信用户的基本信息,且具有时效性。
  • 将临时登录凭证发送给开发者服务器

    • 将上述 code 通过 HTTPS 请求发送给小程序的后端服务器。
    • 后端服务器需使用这个 code 向微信服务器请求换取更详细的用户信息。
  • 开发者服务器向微信服务器交换用户信息

    • 后端服务器使用 code、AppID 和 AppSecret 调用微信接口 https://api.weixin.qq.com/sns/jscode2session
    • 微信服务器验证后返回 openidsession_key 以及 unionid(若适用)。
  • 处理返回的用户信息

    • 开发者服务器根据返回的 openid 确定用户唯一身份,session_key 用于后续的数据加密解密操作。
    • 通常,服务器会基于这些信息生成自定义的登录态(如 session 或 JWT token),并将其返回给小程序端。
  • 小程序端存储登录态

    • 小程序接收到服务器返回的自定义登录态后,将其存储在本地(如 StorageStorageSync)。
    • 在后续的网络请求中携带此登录态,以证明用户已登录。
  • 维持登录状态

    • 使用 wx.checkSession() 检查当前用户登录状态是否有效。
    • 若登录态已失效,重新执行登录流程;否则继续使用现有登录态。

2、流程实战

步骤1:小程序端发起登录请求

// 小程序端
wx.login({
  success(res) {
    if (res.code) {
      // 发送 code 到开发者服务器换取用户信息
      const code = res.code;
      sendCodeToServer(code);
    } else {
      console.log('获取 code 失败:' + res.errMsg);
    }
  },
  fail(err) {
    console.error('登录失败:', err);
  }
});

步骤2:将临时登录凭证发送给开发者服务器

// 小程序端
function sendCodeToServer(code) {
  const requestUrl = 'https://your-backend-server.com/login';
  wx.request({
    url: requestUrl,
    method: 'POST',
    data: { code },
    success(res) {
      handleLoginResponse(res.data);
    },
    fail(err) {
      console.error('请求后端服务器失败:', err);
    }
  });
}

步骤3:开发者服务器向微信服务器交换用户信息

开发者服务器端(如使用 Node.js):

const request = require('request');

function exchangeCodeForUserInfo(code, appId, appSecret) {
  const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`;

  return new Promise((resolve, reject) => {
    request(url, (error, response, body) => {
      if (!error && response.statusCode === 200) {
        const userInfo = JSON.parse(body);
        resolve(userInfo);
      } else {
        reject(error || new Error('Failed to exchange code for user info'));
      }
    });
  });
}

步骤4:处理返回的用户信息

开发者服务器端(继续使用 Node.js 示例):

exchangeCodeForUserInfo(code, appId, appSecret)
  .then(userInfo => {
    const { openid, session_key } = userInfo;

    // 基于 openid 生成或查找用户记录
    // 生成自定义登录态(如 session 或 JWT token)

    // 返回自定义登录态给小程序端
    const response = {
      statusCode: 200,
      body: { token: generatedToken },
    };
    return response;
  })
  .catch(handleError);

function handleError(error) {
  // 处理错误,返回合适的错误响应
}

步骤5:小程序端存储登录态

// 小程序端
function handleLoginResponse(loginResponse) {
  const token = loginResponse.token;
  wx.setStorageSync('userToken', token); // 保存登录态到本地 Storage
}

// 后续网络请求中携带登录态
function makeAuthenticatedRequest(url, data) {
  const token = wx.getStorageSync('userToken');
  wx.request({
    url,
    data: { ...data, token },
    // ...
  });
}

步骤6:维持登录状态

// 小程序端
function checkAndRefreshSession() {
  wx.checkSession({
    success() {
      // 登录态有效,无需重新登录
      console.log('Session is valid, no need to re-login.');
    },
    fail() {
      // 登录态已过期,需要重新执行登录流程
      console.log('Session has expired, re-initiating login process.');
      initiateLogin();
    },
  });
}

// 在适当的地方(如 App 启动、页面加载等)调用 checkAndRefreshSession()
checkAndRefreshSession();

总结起来,微信小程序登录流程机制的核心在于通过官方接口获取并交换临时登录凭证,进而获得用户唯一标识(如 openid)并在小程序端和服务器端之间建立有效的登录状态。小程序端负责发起登录请求、存储和携带登录态,而开发者服务器则负责与微信服务器交互,验证凭证并生成自定义登录态。整个过程确保了用户数据的安全传输与隐私保护,同时简化了用户的登录操作。

二、微信小程序手机号登录

微信小程序实现手机号登录的流程机制,实际上是将手机号作为用户身份标识,结合微信提供的“获取用户手机号”功能来实现快速登录或账户关联。以下是对这一流程的详解与举例:

1、流程概述

微信小程序手机号登录流程主要包括以下几个步骤:

  • 启用获取手机号功能

    • 在小程序管理后台开启“获取用户手机号”权限。
  • 小程序端请求用户授权

    • 使用带有 open-type="getPhoneNumber"<button> 组件,引导用户授权获取手机号。
  • 用户授权并获取加密手机号

    • 用户同意授权后,小程序端通过回调函数接收加密的手机号数据(encryptedDataiv)以及 session_key
  • 将加密数据发送至开发者服务器

    • 小程序端将加密数据及 session_key 通过 HTTPS 请求发送给后端服务器。
  • 开发者服务器解密手机号

    • 后端服务器使用 session_keyivencryptedData 进行解密,得到明文手机号。
  • 手机号与用户账户关联或注册新用户

    • 首先,判断用户是否存在,如果存在执行登录相关操作,不存在绑定用户信息并注册。
    • 其次,执行登录相关操作时,判断手机号是否相同(用户手机号可能换绑),相同则登录,不相同任登录并提示重新绑定或者不登录提示其他登录方式。

二、流程实战

步骤1:启用获取手机号功能

在小程序管理后台,进入“开发”->“开发设置”,找到“用户信息”部分,勾选“获取用户手机号”权限,并按照要求填写相关信息。

步骤2:小程序端请求用户授权

<!-- 小程序端wxml文件 -->
<button open-type="getPhoneNumber" bindgetphonenumber="onGetPhoneNumber">授权并登录</button>
// 小程序端js文件
Page({
  onGetPhoneNumber(e) {
    const { detail: { encryptedData, iv, errMsg } } = e;

    if (errMsg === 'getPhoneNumber:ok') {
      // 用户同意授权,发送加密数据至服务器
      sendEncryptedDataToServer(encryptedData, iv);
    } else {
      console.log('获取手机号失败:', errMsg);
    }
  },
});

步骤3:用户授权并获取加密手机号

用户在小程序内点击授权按钮后,微信客户端会弹出授权界面,用户同意后,小程序端通过 onGetPhoneNumber 回调函数接收到加密的手机号数据。

步骤4:将加密数据发送至开发者服务器

// 小程序端
function sendEncryptedDataToServer(encryptedData, iv) {
  const requestUrl = 'https://your-backend-server.com/loginWithPhone';
  wx.request({
    url: requestUrl,
    method: 'POST',
    data: { encryptedData, iv },
    success(res) {
      handleLoginResponse(res.data);
    },
    fail(err) {
      console.error('请求后端服务器失败:', err);
    }
  });
}

步骤5:开发者服务器解密手机号

开发者服务器端(如使用 Node.js):

const crypto = require('crypto');
const { decode, encrypt, decrypt } = require('wx-crypto'); // 或使用其他微信数据解密库

function decryptPhoneNumber(encryptedData, iv, sessionKey) {
  const decodedData = decode(encryptedData);
  const decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv);
  let decrypted = decipher.update(decodedData, 'base64', 'utf8');
  decrypted += decipher.final('utf8');

  try {
    const result = JSON.parse(decrypted);
    return result.phoneNumber;
  } catch (err) {
  throw new Error('Failed to parse decrypted phone number data');
  }
}

// 假设已从前端请求中获取到 encryptedData 和 iv
const phoneNumber = decryptPhoneNumber(encryptedData, iv, sessionKeyFromLoginStep);

步骤6:手机号与用户账户关联或注册新用户

第一步:通过微信登录接口获取用户身份标识

微信小程序提供了wx.login()接口,允许小程序获取微信用户的临时登录凭证(code)。小程序端调用此接口后,会收到一个code,然后将此code发送到开发者服务器。服务器端使用该code、小程序的AppID和AppSecret向微信服务器发起请求,换取用户的唯一标识(openid)和其他基础信息(如unionid,如果有绑定公众号的话)。这些标识可以用来唯一识别用户,不论他们是否更换设备或清除小程序数据,只要他们仍使用同一个微信账号登录,openid和unionid都会保持不变。

小程序端代码示例:

wx.login({
  success: res => {
    if (res.code) {
      // 发送 code 到开发者服务器
      sendCodeToServer(res.code);
    } else {
      console.log('微信登录失败:' + res.errMsg);
    }
  },
  fail: err => {
    console.log('微信登录失败:' + err.errMsg);
  }
});

服务器端使用code换取用户信息(示例使用Node.js):

const axios = require('axios');
const { appId, appSecret } = require('./config');

function exchangeCodeForUserInfo(code) {
  return axios.get(
    `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`
  )
    .then(response => response.data)
    .catch(error => {
      console.error('兑换 code 失败:', error);
      throw error;
    });
}

第二步:通过用户身份标识处理执行登录相关操作

开发者服务器端:

async function handleLoginWithPhone(encryptedData, iv, sessionKey) {
  const phoneNumber = decryptPhoneNumber(encryptedData, iv, sessionKey);
  
  const { openid, unionid, session_key } = await exchangeCodeForUserInfo(code);

  // 通过用户标识,进行数据库查询
  const userExists = await checkUserExistence(openid, unionid);

  if (userExists) { //判断用户是否存在
    // 根据手机号查找用户
    const userPhoneNumber = await userService.findByPhoneNumber(phoneNumber);

    if (userPhoneNumber) { //判断用户手机号是否存在
      // 手机号已存在,登录成功
      const token = generateUserToken(user.id);
      return { status: 'success', token };
    } else {
      // 手机号不存在,登录成功并提示手机号有变动
      return { status: 'success', token , phoneChange: true};
    }
  } else {
    // 用户不存在,用户注册
    
    // 处理注册逻辑
    ... 
	
    return { status: 'register' };
  }
}

小程序端根据服务器返回的状态进行相应处理

function handleLoginResponse(response) {
  if (response.status === 'success') {
    const token = response.token;
    wx.setStorageSync('userToken', token); // 存储登录态
    navigateToHome(); // 跳转至首页或其他逻辑
  } else if (response.status === 'register_or_bind_required') {
    showRegisterOrBindPrompt(); // 引导用户注册或绑定已有账户
  } else {
    console.error('Unknown login response:', response);
  }
}

注意事项:

  1. session_key 的一致性:解密手机号需要用到的 session_key 必须与之前登录流程中获取的 session_key 相同。这意味着在请求获取手机号之前,用户应当已经完成常规的微信登录流程,确保服务器端持有正确的 session_key

  2. 用户隐私保护:务必遵循相关法律法规,对收集到的用户手机号进行严格保密,仅用于必要的业务场景,并在用户明确同意的情况下使用。同时,确保数据传输过程的安全性,如使用 HTTPS 协议。

综上所述,微信小程序实现手机号登录的流程机制是利用微信提供的接口获取用户授权的手机号,通过服务器端解密后与现有账户进行关联或引导用户进行注册,从而实现基于手机号的快速登录。这一机制简化了用户登录过程,但同样要求开发者充分关注数据安全与用户隐私保护。

微信授权登录利用微信账号体系为用户提供快速、安全的登录方式,适用于依赖微信生态的应用或小程序。而手机号登录则通过微信授权获取用户绑定的手机号,实现基于手机号的登录或账户关联,尤其适用于希望整合微信账号与自身账户体系的场景。两种登录方式都强调用户隐私保护和数据安全,开发者在实现过程中需遵循微信平台规定,确保合规操作。

跨平台手机号授权

随着移动互联网发展,手机号统一登录成为提升用户体验、简化登录流程的关键趋势。小程序厂商纷纷响应,通过集成微信或其他第三方平台的手机号授权功能,实现用户一键授权,快速获取并验证手机号,无缝衔接自有账户体系。此举不仅增强了登录便捷性,还确保了数据传输安全,有助于构建跨平台账户统一管理,提升用户粘性与数据整合能力。

可以按照以上微信手机号授权登录、微信授权登录的机制实现其他小程序厂商平台的登录注册,实现跨平台手机号机制。

在尊重用户隐私的前提下,小程序厂商遵循相关法规及平台政策,明确告知授权目的,妥善处理手机号信息,共同营造安全、便捷、个性化的登录环境,推动小程序生态繁荣发展。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1617084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTFshow-PWN-栈溢出(pwn36)

存在后门函数&#xff0c;如何利用&#xff1f; 好好好&#xff0c;终于到了这种有后门函数的了 checksec 检查一下&#xff1a; 32 位程序&#xff0c;RELRO 保护部分开启 RWX: Has RWX segments 存在可读可写可执行的段 使用 ida32 看 main 函数 跟进 ctfshow 函数…

T2I-Adapter:学习适配器为文本到图像扩散模型挖掘更多可控能力

文章目录 一、研究动机二、T2I-Adapter的特点三、模型方法&#xff08;一&#xff09;关于stable diffusion&#xff08;二&#xff09;适配器设计1、结构控制2、空间调色板3、多适配器控制 &#xff08;三&#xff09;模型优化训练期间的非均匀时间步采样 一、研究动机 T2I模…

安卓手机如何改ip地址?探索方法与注意事项

在数字时代&#xff0c;IP地址成为了我们在线身份的重要标识。对于安卓手机用户而言&#xff0c;了解如何修改IP地址可能涉及多种场景&#xff0c;那么&#xff0c;如何安全、有效地进行这一操作呢&#xff1f;下面将为您提供相关方法&#xff0c;并探讨修改IP地址时的注意事项…

国外问卷调查如何做?需要借助海外住宅IP吗?

在数字化时代&#xff0c;国外问卷调查不仅是了解市场需求的重要手段&#xff0c;还成为了一项能够赚取额外收入的方式。随着全球范围内消费者行为的多样化&#xff0c;各类企业和机构越来越需要了解不同地区的用户观点和偏好&#xff0c;以优化产品和服务。 一、国外问卷调查…

接口测试和Mock学习路线(中)

1.什么是 swagger Swagger 是一个用于生成、描述和调用 RESTful 接口的 WEB 服务。 通俗的来讲&#xff0c;Swagger 就是将项目中所有想要暴露的接口展现在页面上&#xff0c;并且可以进行接口调用和测试的服务。 现在大部分的项目都使用了 swagger&#xff0c;因为这样后端…

基于STM32实现流水灯【Proteus仿真】

详情更多 wechat&#xff1a;嵌入式工程师成长日记 https://mp.weixin.qq.com/s?__bizMzg4Mzc3NDUxOQ&mid2247485624&idx1&sn4e553234c2624777409bd2067a07aad8&chksmcf430de0f83484f6189b119d9d83ea6e6f2a85d13afaa04d218483918231c38e6382d3007061&tok…

【大语言模型LLM】- Meta开源推出的新一代大语言模型 Llama 3

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

【图说】VMware Ubuntu22.04 详细安装教程

前言 无论是从事 Linux 开发工作&#xff0c;还是希望电脑运行双系统&#xff0c;VMware 虚拟机都是我们日常工作不可或缺的工具。本章将会重点介绍 VMware 安装流程&#xff0c;以及在 VMware 上如何运行、使用 Ubuntu22.04 系统。 一、VMware 下载安装 1.1 VMware 官网下载…

使用虚拟信用卡订阅Starlink教程

Starlink 是由 SpaceX 公司开发的卫星互联网服务平台。它旨在通过将成千上万的卫星部署到地球轨道上&#xff0c;为全球范围内的用户提供高速互联网接入。通过 Starlink&#xff0c;用户可以通过卫星连接接入互联网&#xff0c;无需依赖传统的地面基础设施&#xff0c;这对于偏…

软考高项(已通过,E类人才)-学习笔记材料梳理汇总

软考高项&#xff0c;即软考高级信息系统项目管理师&#xff0c;全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试中的高级水平测试。适用于从事计算机应用技术、软件、网络、信息系统和信息服务等领域的专业人员&#xff0c;以及各级企业管理人员和从事项目…

基于K-means和FCM算法的合成纹理图像及SAR图像的分割

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

免 Administrator 权限安装软件

以欧路词典为例, 从官网下载的安装包 https://www.eudic.net/v4/en/app/download 直接运行会弹出 UAC 提示需要管理员权限. 一个词典而已, 为啥要管理员权限呢? 答案是安装程序默认使用的安装路径是 C:\Program Files\ 这就不难理解了. 对于这种不需要其他额外权限的软件, 可以…

zabbix自动发现和自动注册

一、zabbix自动发现 1.1 确保客户端上的zabbix-agent2服务器状态正常 1.2 在web页面删除原有的客户端主机 1.3 在服务端和客户端上配置hosts 1.4 web端配置自动发现 二、zabbix自动注册 2.1 环境配置 2.2 修改zabbix-agent2配置文件 过滤非#或非&#xffe5;开头的内容 2.3 we…

Qt 跨平台开发的一丢丢总结

Qt 跨平台开发 文章目录 Qt 跨平台开发摘要第一 \ & /第二 神奇{不能换行显示第三 预处理宏 关键字&#xff1a; Qt、 win、 linux、 lib、 MSVC 摘要 最近一直在琢磨Qt跨平台开发的问题&#xff0c;缘由有以下几个&#xff0c; 首先第一个&#xff0c;我们目前开发…

【剪映专业版】03立体自动翻页

【剪映专业版】立体自动翻页制作 1.导入素材&#xff0c;图片或视频均可 2.将素材2拖动至素材1的上方&#xff0c;点击蒙版&#xff0c;选择线性蒙版&#xff0c;并旋转为90度。 3.复制素材1&#xff0c;并拖动到素材2上方&#xff0c;分割并删除后半部分&#xff0c;点击蒙版…

Java进阶-Stream流

概述 在Java8中&#xff0c;得益于lambda所带来的函数式编程&#xff0c;引入了一个全新的Stream流的概念目的&#xff1a;用于简化集合和数组操作的api 案例 需求&#xff1a;创建一个集合存储多个字符串元素&#xff0c;将集合中所有以“z”开头的元素存储到新的集合中&am…

邀请全球创作者参与 The Sandbox 创作者训练营

作为首屈一指的元宇宙平台之一&#xff0c;The Sandbox 的使命是成为全球创作者的中心。随着我们对 Game Maker 的不断改进、旨在激发创作者灵感的定期 Game Jams、革命性的 "创作者挑战 "以及众多其他活动的开展&#xff0c;我们见证了大量个人加入我们充满活力的创…

C++ 虚表起源

本文会让看不见 摸不着的虚表(Vtable),虚指针(Vptr)彻底现行 本文涉及思想: C 面向对象 封装 继承 多态 中的 多态 概念解释: 虚表指针&#xff1a; 这是指向虚表&#xff08;vtable&#xff09;的指针&#xff0c;虚表中包含了该类的所有虚函数对应的地址。 虚表&#x…

每日一题 — 二分查找

704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 朴素二分查找模板&#xff1a; while(.......){//防止溢出int mid left(right - left)/2;if(........){right mid-1;}else if(......){left mid1;}else{return mid;}} 代码&#xff1a; public int search(int[] num…

十六、Qgis工具如何将shp转换geoJson类型文件

在使用GIS地图的时候线路图是非常重要的一个部分,根据以前的下载方法下载好了Qgis工具,那么如何将在openstreetmap下载下来的.shp文件转换为geoJson呢,下面就来说说。 准备工作 一、首先肯定是下载好了中国地图的全部的.shp包。里面包含全国的地图,包含shp,cpg,dbf类型的道…