时间:2021-05-18
先上效果图
点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料。
流程
1.使用微信小程序登录和获取用户信息Api接口
2.把Api获取的用户资料和code发送给django后端
3.通过微信接口把code换取成openid
4.后端将openid作为用户名和密码
5.后端通过JSON web token方式登录,把token和用户id传回小程序
6.小程序将token和用户id保存在storage中
下次请求需要验证用户身份的页面时,在header中加入token这个字段
微信小程序代码
获取用户信息的方法这里不展示,可以在微信小程序文档中看到
登录方法
login: function(event) { wx.login({ success: res => { console.log(res) //请求后端换取openid的接口 http.request({ url: '/get-openid/', method: 'POST', data: { //将code传到后端 jscode: res.code }, success: res => { //获取到openid作为账号密码 console.log(res) console.log(app.globalData.userInfo) http.request({ url: '/wx-login/', method: 'POST', data: { openid: res.openid, session_key: res.session_key, nickname: app.globalData.userInfo.nickName, avatar_url: app.globalData.userInfo.avatarUrl, gender: app.globalData.userInfo.gender }, //登录成功后返回token保存在storage中 success: res => { console.log(res) //token存入storage wx.setStorageSync('jwt_token', res.token) wx.setStorageSync('user_id', res.user_id) this.reFreshUserProfile() //登录状态置为true this.setData({ isLogin: true, hasUserInfo: true }) app.globalData.isLogin = true } }) } }) } }) }注销方法
logout: function(res) { this.setData({ isLogin:false, hasUserInfo:false }) app.globalData.isLogin = false wx.removeStorageSync('jwt_token') wx.removeStorageSync('user_id') },Django后端的实现
首先安装djangorestframework-jwt
这里不使用他默认的登录接口,如下所示
它提供了手动签发token和解密token的功能,因此最好自己实现
手动签发token
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload)手动解密token
jwt_decode_handler = api_settings.JWT_DECODE_HANDLER user_dict = jwt_decode_handler(token) user_id = user_dict['user_id']后端换取openid
class OpenId: def __init__(self, jscode): self.url = 'https://api.weixin.qq.com/sns/jscode2session' self.app_id = env.str('APPID') self.app_secret = env.str('APPSECRET') self.jscode = jscode def get_openid(self): url = self.url + "?appid=" + self.app_id + "&secret=" + self.app_secret + "&js_code=" + self.jscode + "&grant_type=authorization_code" res = requests.get(url) try: openid = res.json()['openid'] session_key = res.json()['session_key'] except KeyError: return 'fail' else: return openid, session_key后端返回openid接口实现
这里只使用简单的FBV视图
注:前端传来的值无法从request.POST中接收到,只能使用如下方法
@require_http_methods(['POST'])@csrf_exemptdef GetOpenIdView(request): data = json.loads(request.body) jscode = data['jscode'] openid, session_key = OpenId(jscode).get_openid() return JsonResponse({ 'openid': openid, 'session_key': session_key })后端登录接口实现
如果不存在用户则自动创建
为了简单,用户名和密码都是openid
以上就是简单的微信小程序登录对接Django的思路,很多地方不严谨,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
最近主要在忙活微信与支付宝平台的对接与开发,本篇就基于后端层面来讲述一下微信的登录与绑定实现。(一)、申请微信开放平台最首先的话就是需要去微信开发中心https
前言为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口。乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知
项目背景因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用ajax实现微信授权登录。需求分析因为本人是一个phper,所以,微信开发
详解微信小程序登录获取unionid首先公司开发了小程序,公众号网页和app等,之前都是用的openid来区分用户,但openid只能标识用户在当前小程序或公众
本文介绍了Spring-boot结合Shrio实现JWT的方法,分享给大家,具体如下:关于验证大致分为两个方面:用户登录时的验证;用户登录后每次访问时的权限认证