微信小程序用户信息接口实现总结
官方文档:
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