微信登录 扫码登录(简单使用)


微信登录与绑定用户☟

用户使用手机号码登录后 校验是否已经绑定微信号
微信扫码登录的用户 校验是否已经绑定手机号码
本章使用: python3.6 django MySQL
微信扫码登陆流程与后端代码

点击跳转微信开放平台

创建网站应用

创建网站应用

填写网站应用信息

填写网站应用信息

查看id与密钥

查看id与密钥

设置回调域

设置回调域

微信扫码登录-获取code值☟

路由
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=你自己的域名&response_type=code&scope=snsapi_login&state=STATE
上述路由参数 备注
APPID 刚刚获取到的appid appid
redirect_uri http:// https://根据你的域名 例如本地: http://127.0.0.1:8000
response_type code 默认值
scope snsapi_login 默认值
state STATE 默认值

微信扫码登录-获取access_token值☟

路由
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
上述路由参数 备注
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 就是确认是你扫码的

微信扫码登录-获取扫码用户的信息☟

路由
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
上述路由参数 备注
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})

文章作者: 柒仔
文章链接: /article/3/
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 XiaoLiu!
侵权声明: 若无意对您的文章造成侵权,请您留言,博主看到后会及时处理,谢谢。
评论-----昵称和邮箱必填,网址选填
  目录