微信小程序用户信息接口实现总结

微信小程序用户信息接口实现总结

官方文档:

https://mp.weixin.qq.com/debug/wxadoc/dev/api/

微信小程序登录流程(wx.login(OBJECT))

1、调用接口获取登录凭证(code)

注意: code–用户登录凭证(有效期五分钟),开发者需要在开发者服务器后台调用 api。

2、将code传入后台服务器,向微信端发送请求,使用code换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)等(用户数据的加解密通讯需要依赖会话密钥完成),存储在后台缓存中。

code 换取 session_key返回参数列表:

参数 说明
openid 用户唯一标识
session_key 会话密钥
unionid 用户在开放平台的唯一标识符。本字段在满足一定条件的情况下才返回。

通过上述接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能失效。反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。开发者只需要调用wx.checkSession接口检测当前用户登录态是否有效。登录态过期后开发者可以再调用wx.login获取新的用户登录态。

wx.checkSession(OBJECT)调用方法参见官方文档。

获取微信用户基本信息流程(wx.getUserInfo(OBJECT))

1、首先调用wx.login登录接口(此过程需要用户授权 scope.userInfo同意后才能调用),详细调用参数参考官方文档

2、接收微信返回参数,包括敏感数据在内的完整用户信息的加密数据encryptedData及加密算法的初始向量iv

3、将encryptedData、iv参数传至后台服务器解密后存储

参数 类型 说明
encryptedData String 包括敏感数据在内的完整用户信息的加密数据
iv String 加密算法的初始向量

解密后参数列表:

参数 类型 说明
nickName String 用户昵称
avatarUrl String 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
gender String 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
city String 用户所在城市
province String 用户所在省份
country String 用户所在国家
language String 用户的语言,简体中文为zh_CN
    # 示例
    {
        "openId": "OPENID",
        "nickName": "NICKNAME",
        "gender": GENDER,
        "city": "CITY",
        "province": "PROVINCE",
        "country": "COUNTRY",
        "avatarUrl": "AVATARURL",
        "unionId": "UNIONID",
        "watermark":
        {
            "appid":"APPID",
        "timestamp":TIMESTAMP
        }
    }

小程序通过微信授权获取用户手机号流程(getPhoneNumber(OBJECT))

1、调用login接口(目的是获取session_key参数)或进行登录态检查 checkSession确保为登录状态

2、因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 组件的点击来触发,需要将 `组件的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据encryptedData及iv(同上)

3、 在后台服务器结合 session_key 以及所申请小程序的 app_id 进行解密获取手机号。

解密后参数列表:

参数 类型 说明
phoneNumber String 用户绑定的手机号(国外手机号会有区号)
purePhoneNumber String 没有区号的手机号
countryCode String 区号

    # 示例
    {
        "phoneNumber": "13580006666",  
        "purePhoneNumber": "13580006666", 
        "countryCode": "86",
        "watermark":
        {
            "appid":"APPID",
            "timestamp":TIMESTAMP
        }
    }

解密部分python实现:

python实现解密函数需要的参数

参数 类型 含义
appId string 申请的微信小程序的appid
session_key string 由微信登录成功后返回的code参数换取后存储在服务器中,使用前需进行登录态检查

encryptedData string 包括敏感数据在内的完整用户信息的加密数据
iv string 加密算法的初始向量

解密代码:

    #!/usr/bin/env python
    # encoding: utf-8
    import base64
    import json
    from Crypto.Cipher import AES
    # 需要导入的package: pycrypto==2.6.1

    class WXBizDataCrypt:
        def __init__(self, appId, sessionKey):
            self.appId = appId
            self.sessionKey = sessionKey

        def decrypt(self, encryptedData, iv):
            # base64 decode
            sessionKey = base64.b64decode(self.sessionKey)
            encryptedData = base64.b64decode(encryptedData)
            iv = base64.b64decode(iv)

            cipher = AES.new(sessionKey, AES.MODE_CBC, iv)

            decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData)))

            if decrypted['watermark']['appid'] != self.appId:
                raise Exception('Invalid Buffer')

            return decrypted

        def _unpad(self, s):
            return s[:-ord(s[len(s)-1:])]

调用解密方法:

    #!/usr/bin/env python
    # encoding: utf-8
    APPID="**********"   # 小程序APPID
    session_key="**********************"   # 维持登录态的session_key
    from util.WXBizDataCrypt import WXBizDataCrypt

    def decrypto(encryptedData, iv, APPID, session_key):
        pc = WXBizDataCrypt(appid, session_key)
        result = pc.decrypt(encryptedData, iv)
        return result

你可能感兴趣的:(python)