微信登录与绑定用户☟
用户使用手机号码登录后 校验是否已经绑定微信号
微信扫码登录的用户 校验是否已经绑定手机号码
本章使用: python3.6 django MySQL
微信扫码登陆流程与后端代码
点击跳转微信开放平台
创建网站应用

填写网站应用信息

查看id与密钥

设置回调域

微信扫码登录-获取code值☟
微信扫码登录-获取access_token值☟
上述路由参数 |
值 |
备注 |
APPID |
appid |
appid |
SECRET |
密钥 网站应用的密钥 |
密钥 网站应用的密钥 |
CODE |
返回的code值 |
微信扫码登录返回的code值 |
grant_type |
authorization_code |
默认值 |
返回值:
{
"access_token": "36_tzQMLluQGxWLvty7ivsqs7xpE3GvUzbgIrYyvldhAB_WDg3c-wB4-N6OP8uc-y************************************",
"expires_in": 7200,
"refresh_token": "36_S2uCpIM4dU9Z65uvn__PcD5UYp8_uPii97R04NSMItZs2keyuMp7zTkXzehYQ_tHNIPaE4Bh-oIp6cl********************",
"openid": "你的openid",
"scope": "snsapi_login",
"unionid": "你的unionid"
}
# 上述返回值解析
access_token 包含扫码用户的信息
expires_in 超时时间(过期时间)
openid 就是确认是你扫码的
微信扫码登录-获取扫码用户的信息☟
上述路由参数 |
值 |
备注 |
access_token |
36_tzQMXXXXXXX |
前面获取的access_token |
openid |
openid |
前面获取的openid |
返回值:
{
"openid": "你的openid",
"nickname": "微信名字",
"sex": 1, # 男女的意思
"language": "zh_CN", # 中文
"city": "Abiko-shi", # 城市
"province": "Chiba-ken", # 乡镇
"country": "JP", # 日本
"headimgurl":"http://thirdwx.qlogo.cn/mmopen/vi_32/dpF4rnCxdZ3VFjdnEEZ7J2e3hDJORNGibADyWavEeykwWnRnsGuP7dxkAPG70d8BFiagArJ69xy1wkxTG36m18bw/132", # 你的头像
"privilege": [
],
"unionid": "你的unionid"
}
微信扫码登录-后端代码☟
# 路由
url(r'^wx_login/$', WeXinLogin.as_view()), # 获取微信登录 code值
# 对应的视图函数
class WeXinLogin(APIView):
def get(self, request):
code = request.GET.get('code') # 获取code值
state = request.GET.get("state")
myurl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + AppID + "&secret=" + AppSecret + "&code=" + code + "&grant_type=authorization_code"
request = Request(myurl)
html = urlopen(request)
# 获取数据
data = html.read()
strs = json.loads(data.decode())
mytoken = strs["access_token"]
myrhtoken = strs["refresh_token"]
myopenid = strs["openid"]
myunionid = strs["unionid"]
# 获取用户信息的api接口
mytwourl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + mytoken + "&openid=" + myopenid + "&lang=zh_CN"
request2 = Request(mytwourl)
html2 = urlopen(request2)
data2 = html2.read()
strs2 = json.loads(data2.decode())
# 下面是获取扫码者微信帐号完整信息
useropenid = strs2["openid"]
usernickname = strs2["nickname"]
userheadimgurl = strs2["headimgurl"]
userunionid = strs2["unionid"]
user = User.objects.filter(useropenid=useropenid)
if user.count() <= 0:
is_login = User.objects.create_user(useropenid=useropenid,
usernickname=usernickname,
userheadimgurl=userheadimgurl,
userunionid=userunionid,
username=usernickname,
password=userunionid,
mobile=usernickname,
mystate=state)
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(is_login)
token = jwt_encode_handler(payload)
User.objects.filter(username=is_login).update(jwt_token=token)
return Response({'code': RET.OK, 'mobile': usernickname, 'token': token})
is_login = User.objects.get(useropenid=useropenid)
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(is_login)
token = jwt_encode_handler(payload)
User.objects.filter(useropenid=useropenid).update(jwt_token=token)
return Response({'code': RET.OK, "token": token, 'mobile': is_login.username})