企业微信应用获取本企业成员及互联企业成员手机号等敏感信息

本文详细介绍了如何使用企业微信OAuth2进行授权登录,包括scope设置、agentid要求、授权过程、code和access_token的获取,以及如何获取用户手机号、邮箱等敏感信息的步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

1、应用需要通过OAuth2的授权登录方式登录。

企业微信提供了OAuth的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。

构造OAuth2网页授权链接时:scope必须为snsapi_privateinfo;且agentid必填。

若agentid不填,怎会将scope默认为snsapi_base。

当用户进入网页授权链接后,将弹出授权窗口,用户授权同意后才会返回信息。默认授权为头像、邮箱、手机号。

详情见开始开发 - 接口文档 - 企业微信开发者中心

2、该应用需从企业微信终端(PC端移动端皆可)打开

因为OAuth2网页授权链接只能在企业微信终端打开


获取手机号

1、获取用户身份

通过OAuth2的授权登录后,会跳转至redirect_uri?code=CODE&state=STATE,我们就能从当前的URL上获取code,可用如下代码获取

//search 函数用来获取当前URL的参数
const search = () => {
    const params: any = {}
    const href = window.location.href
        .replace(/^(.*?)(#.*)?$/, '$1')
        .replace(/^.*?(\?(.*))?$/, '$2')
        .split('&')
        .forEach(ps =>
            ps.replace(/(.*?)=(.*)/g, ($0: string, $1: string, $2: string) => {
                return (params[$1.trim()] = $2.trim())
            })
        )

    return params
}

const { code } = search() || {}


获取到code后,可通过 get请求以下接口获取到当前登录人userId以及获取敏感数据票据的user_ticket。https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=ACCESS_TOKEN&code=CODE

注意:code只能使用一次,需要定义好前端还是后端使用;

access_token:通过corpid(企业ID)、corpsecret(应用的凭证密钥)获得,可多次使用,但是会有过期时间。详情见获取access_token - 接口文档 - 企业微信开发者中心

获取用户身份接口详情见获取访问用户身份 - 接口文档 - 企业微信开发者中心

2、获取用户手机号等敏感信息

通过post请求以下接口,可获取用户的手机号、邮箱l、性别等敏感信息。https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=ACCESS_TOKEN

//请求体
{
   "user_ticket": "USER_TICKET"
}

user_ticket为上一步获取用户身份 的get请求的返回值。

具体接口详情见获取访问用户敏感信息 - 接口文档 - 企业微信开发者中心

<think>好的,我现在需要帮助用户解决关于微信小程序获取用户手机号的问题。首先,我得回忆一下微信小程序的开发文档和相关流程。用户提到了引用[1]和[2],这些内容可能涉及获取手机号的步骤和注意事项。 首先,微信小程序获取用户手机号通常需要用户主动触发,比如点击按钮。然后,前端需要调用wx.login获取code,接着使用button组件的getPhoneNumber事件来获取加密数据。后端需要通过code和encryptedData、iv来解密出手机号。这里要注意的是,用户必须已经授权过,否则可能需要重新授权。 接下来,我需要确认步骤是否正确。比如,前端部分是否必须使用button组件,是否有其他方式。根据微信文档,确实需要使用button,并且open-type设置为getPhoneNumber。然后,用户点击后通过事件获取加密数据,传给服务器。服务器需要用session_key来解密,而session_key的获取需要用到appid和secret,这可能涉及到安全性的问题,比如不能在前端暴露这些信息。 然后,用户提到的引用[2]里提到了生成3rdSessionId,并将其作为key存储sessionkey和openid,这样可以避免直接传输sessionkey,提高安全性。这一步可能是在用户登录流程中的一部分,结合获取手机号的过程。所以,整个流程可能需要将登录和获取手机号分开处理,或者整合在一起,确保每个步骤都有正确的参数传递。 还需要注意,获取手机号的接口权限是否已经申请,因为有些接口需要企业资质才能使用。另外,用户手机号获取需要用户的明确同意,所以在用户体验上要设计好提示和授权流程。 最后,可能的问题点包括:session_key的有效期,解密失败的情况处理,用户拒绝授权的处理,以及如何维护用户的登录状态。需要确保后端解密逻辑正确,使用微信提供的解密算法,比如AES解密,并且正确处理可能的异常情况,比如网络错误或参数错误。 总结下来,步骤应该是:前端获取code和加密数据,后端用code换取session_key,然后用session_key解密数据得到手机号。同时,通过3rdSessionId来维护用户的登录态,确保安全性和会话管理。</think>### 微信小程序获取用户手机号方法详解 微信小程序获取用户手机号需要结合前端组件调用和后端解密流程,以下是具体步骤及注意事项: --- #### **一、前端实现步骤** 1. **用户触发按钮** 必须使用 `<button>` 组件并设置 `open-type="getPhoneNumber"`,用户点击后触发事件: ```html <button open-type="getPhoneNumber" bindgetphonenumber="onGetPhoneNumber">获取手机号</button> ``` 2. **获取临时登录凭证(code)** 调用 `wx.login()` 获取临时登录凭证 `code`: ```javascript wx.login({ success(res) { if (res.code) { // 将 code 发送至服务器 } } }); ``` 3. **处理手机号加密数据** 在 `onGetPhoneNumber` 回调中获取加密数据 `encryptedData` 和初始向量 `iv`: ```javascript onGetPhoneNumber(e) { const { encryptedData, iv } = e.detail; // 将 encryptedData、iv 和 code 发送至服务器 } ``` --- #### **二、后端解密流程** 1. **获取 session_key** 使用 `code` 调用微信接口 `auth.code2Session`,换取 `openid` 和 `session_key`: ```python import requests appid = "YOUR_APPID" secret = "YOUR_SECRET" url = f"https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={code}&grant_type=authorization_code" response = requests.get(url) session_data = response.json() # 包含 openid 和 session_key ``` 2. **生成 3rdSessionId** 生成随机 `3rdSessionId` 并关联 `session_key` 和 `openid`,存储至缓存(如 Redis)[^2]: ```python import uuid third_session = str(uuid.uuid4()) redis.set(third_session, f"{session_key}|{openid}", ex=7200) # 有效期 2 小时 ``` 3. **解密手机号** 使用 AES 算法解密 `encryptedData`: ```python from Crypto.Cipher import AES import base64 import json def decrypt_phone(encrypted_data, iv, session_key): aes_key = base64.b64decode(session_key) aes_iv = base64.b64decode(iv) cipher = AES.new(aes_key, AES.MODE_CBC, aes_iv) decrypted = cipher.decrypt(base64.b64decode(encrypted_data)) result = json.loads(decrypted[:-decrypted[-1]].decode()) return result["purePhoneNumber"] # 示例返回: "13800000000" ``` --- #### **三、安全性注意事项** 1. **敏感信息保护** - `session_key` 必须通过 HTTPS 传输且不能暴露给客户端[^2]。 - 使用 `3rdSessionId` 替代敏感数据传递,维护登录态[^2]。 2. **用户授权限制** - 用户需主动点击按钮,每个手机号需单独授权。 - 未授权时 `encryptedData` 为 `null`,需提示用户重新授权。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值