python获取微信小程序手机号并绑定遇到的坑

下面是“Python获取微信小程序手机号并绑定遇到的坑”的完整攻略。

1. 准备工作

在进行微信小程序手机号获取之前,需要先获取用户的授权。授权方式分为两种:一种是通过用户点击事件展示授权窗口;另一种是在页面加载时就调用授权接口。由于第一种较为常见,本攻略也采用第一种方式进行讲解。

授权窗口的代码如下:

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>

获取用户信息的方法如下:

//点击获取手机号时,显示微信授权窗口
getPhoneNumber: function (e) {
  console.log(e.detail.errMsg)
  console.log(e.detail.iv)
  console.log(e.detail.encryptedData)
}

2. 解密微信提供的手机号加密数据

根据微信文档描述,encryptedData 是「包括敏感数据在内的完整用户信息的加密数据」,而 iv 是加密算法的初始向量。前往微信公众平台获取小程序的 AES Key 和 AppID。

首先我们需要将加密数据和其指定的密文算法(AES/CBC/PKCS7Padding)进行解密。代码示例:

def decrypt_wechat_user_phone_info(session_key, iv, encrypted_data):
    try:
        #解密手机号加密信息
        aes_key_bytes = base64.b64decode(session_key)
        iv_bytes = base64.b64decode(iv)
        encrypted_data_bytes = base64.b64decode(encrypted_data)

        cipher = AES.new(key=aes_key_bytes, mode=AES.MODE_CBC, iv=iv_bytes)
        decrypted_data = unpad(cipher.decrypt(encrypted_data_bytes), AES.block_size)
        decrypted_data = decrypted_data.decode('utf-8')

        decrypted_data = json.loads(decrypted_data)
        return decrypted_data.get('phoneNumber')
    except Exception as e:
        return None

3. 绑定手机号

获取到用户的手机号之后,我们需要进行头像昵称、手机号及发起该次请求的微信用户的openId、session_key等信息绑定。代码示例:

def wx_get_user_phone(request):
    """
    获取微信小程序用户手机号
    """
    code = request.data.get('code')
    iv = request.data.get('iv')
    encrypted_data = request.data.get('encryptedData')

    # 获取微信openid,微信session_key
    code2session_resp = requests.get(
        'https://api.weixin.qq.com/sns/jscode2session',
        params={
            'appid': WECHAT_APP_ID,
            'secret': WECHAT_APP_SECRET,
            'js_code': code,
            'grant_type': 'authorization_code'
        })

    if code2session_resp.status_code != 200:
        return {"message": "Failed to get wechat session key."}, status.HTTP_500_INTERNAL_SERVER_ERROR

    code2session_resp_data = code2session_resp.json()

    wx_openid = code2session_resp_data.get('openid')
    wx_session_key = code2session_resp_data.get('session_key')

    # 解密手机号信息
    wx_user_phone = decrypt_wechat_user_phone_info(wx_session_key, iv, encrypted_data)

    # 对于已经有注册信息的用户,在不存在其他情况的前提下,不用重复绑定,直接获取用户id即可
    user_profile = UserProfile.objects.filter(wx_openid=wx_openid).first()
    if user_profile:
        user_profile.wx_phone = wx_user_phone
        user_profile.save(update_fields=('wx_phone',))
    else:
        ...

以上是Python获取微信小程序手机号并绑定的一个简单示例。需要注意的是,由于该过程需要在后端进行解密与交互,请务必确保前端与后端的数据完整性及安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python获取微信小程序手机号并绑定遇到的坑 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Python实现比较两个列表(list)范围

    以下是详细讲解“Python实现比较两个列表(list)范围)”的完整攻略。 在Python中,可以使用切片操作符和比较算符来比较两个列表的范围。本文将演示如何比较两个列表的范围。 切片符 切片操作可以从一个列表中获取一个子列表。例如: lst = [1, 2, 3, 4, 5] sub_lst = lst[1:3] print(sub_lst) # 输出[…

    python 2023年5月13日
    00
  • python3 中的几种除法介绍,小数的不同显示

    下面是 Python3 中几种除法的介绍: 1. Python3 中的两种除法 在 Python3 中,除法主要分为两种类型:整数除法和浮点数除法。 整数除法(//):这种除法会得到一个整数解,这个解是向下取整的商,结果不包含小数部分。 浮点数除法(/):这种除法会得到精确的商,结果一定包含小数部分,可以是浮点数型的。 下面分别对这两种除法做详细说明: a.…

    python 2023年6月3日
    00
  • 教你使用python实现微信每天给女朋友说晚安

    下面详细讲解一下“教你使用python实现微信每天给女朋友说晚安”的完整攻略: 1.准备工作 在开始实现之前,首先需要准备以下工作: Windows或MacOS操作系统 Python 3.x环境 Python第三方库(itchat、APScheduler、pycryptodome) 2.登录微信 使用itchat库登录微信,代码示例如下: import it…

    python 2023年6月5日
    00
  • Python使用xlrd实现读取合并单元格

    下面是Python使用xlrd实现读取合并单元格的完整实例教程: 一、xlrd介绍 xlrd是Python的一个库,主要用于读取Excel文件,可以读取Excel的所有数据,包括单元格格式、公式等。官方文档地址:https://xlrd.readthedocs.io/en/latest/ 二、读取合并单元格 1. 安装xlrd库 使用pip安装命令安装xlr…

    python 2023年5月13日
    00
  • 关于python3.9安装wordcloud出错的问题及解决办法

    在Python3.9中安装wordcloud模块时,有时会遇到各种各样的错误。其中一个常见的错误是error: Microsoft Visual C++ 14.0 is required,这错误通常是由于缺少Microsoft Visual C++ 14.0运行库引起的。攻略将提供关于Python3.9安装word出错的问题及解决办法,包括常见错误类型和解决…

    python 2023年5月13日
    00
  • python线程池threadpool使用篇

    Python线程池ThreadPool使用篇 本文将详细介绍Python中线程池ThreadPool的使用方法,包括线程池的创建、任务的提交、结果的获取、线程数设置等操作,同时提供两个示例说明 ThreadPool 的使用。 线程池ThreadPool简介 ThreadPool是Python实现线程池的一种方式,线程池是用来管理多线程的工具,通过维护一定数量…

    python 2023年5月19日
    00
  • Python中日期和时间的用法超强总结

    《Python中日期和时间的用法超强总结》是一篇关于Python日期和时间处理的文章,主要涵盖了Python中日期和时间处理的基础知识、常用库以及常用操作等内容。本篇攻略将会为大家详细介绍该篇文章的内容。 基础知识 文章中首先介绍了Python中处理日期和时间的模块,包括time,datetime,calendar模块,分别实现了时间的表示、时间的计算和日历…

    python 2023年5月14日
    00
  • python爬虫 线程池创建并获取文件代码实例

    下面我会详细讲解Python爬虫中线程池的创建以及如何使用线程池获取文件。首先,我们需要了解Python中线程池的基本概念和实现方式。 线程池的基本概念和实现方式 线程池是一种线程管理机制,它可以在应用程序启动时预先创建一定数量的线程,并维护一个等待执行任务的队列。当有新的任务需要执行时,线程池会从队列中获取任务并分配给空闲的线程执行,以此来达到提高应用程序…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部