wx.login({ success(res) { if (res.code) { //發起網絡請求 wx.request({ url: app.globalData.host+'login', method:"post", data: { code: res.code } }) } else { console.log('登陸失敗!' + res.errMsg) } } })
#.......省略一下配置路由啥的 class Login(APIView): def post(self,request): code = request.data.get('code') print(code,type(code)) #061HMtlG0hAQ6d2hOYkG0DlhlG0HMtlh <class 'str'>
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
屬性 | 類型 | 默認值 | 必填 | 說明 |
---|---|---|---|---|
appid | string | 是 | 小程序 appId | |
secret | string | 是 | 小程序 appSecret | |
js_code | string | 是 | 登陸時獲取的 code | |
grant_type | string | 是 | 受權類型,此處只需填寫 authorization_code |
返回的 JSON 數據包html
屬性 | 類型 | 說明 |
---|---|---|
openid | string | 用戶惟一標識 |
session_key | string | 會話密鑰 |
unionid | string | 用戶在開放平臺的惟一標識符,在知足 UnionID 下發條件的狀況下會返回,詳見 UnionID 機制說明。 |
errcode | number | 錯誤碼 |
errmsg | string | 錯誤信息 |
值 | 說明 | 最低版本 |
---|---|---|
-1 | 系統繁忙,此時請開發者稍候再試 | |
0 | 請求成功 | |
40029 | code 無效 | |
45011 | 頻率限制,每一個用戶每分鐘100次 |
import requests class Login(APIView): def post(self,request): code = request.data.get('code') #https: // api.weixin.qq.com / sns / jscode2session?appid = {} & secret ={} & js_code = {} & grant_type = authorization_code url= f"https://api.weixin.qq.com/sns/jscode2session?appid=xxxx&secret=xxxx&js_code={code}&grant_type=authorization_code" #appid與secret不一樣的開發者不同 reponse=requests.get(url) #由於返回值是json的形式 data=reponse.json() print(data)
appid看你小程序中設置了是哪一個appid前端
對於的appid有對應的secretpython
其中appid
以及secret
均在你小程序帳號中
數據庫
import hashlib class Login(APIView): ........ if data.get("openid") and data.get("session_key"): md5 = hashlib.md5() md5.update(data['openid'].encode("utf-8")) md5.update(data['session_key'].encode("utf-8")) key = md5.hexdigest() val =data['session_key']+"&"+data['openid'] print(key,val)
from rest_framework.response import Response from django.core.cache import cache class Login(APIView): ........ cache.set(key,val) #存緩存中較少對於數據庫的壓力 has_user=models.Wxuser.objects.filter(openid=data['openid']).first() #將惟一標識進行存儲 if not has_user: models.Wxuser.objects.create(openid=data['openid']) return Response({ "code": 200, "msg": "ok", "data":{'login_key':key} #發送login_key其目的是爲了後續能夠直接去緩存取對於信息 })
目的,標識已登入以及獲取標識,方便後續對於用戶信息的查找django
var that = this wx.login({ success(res) { if (res.code) { //發起網絡請求 wx.request({ url: app.globalData.host + 'login', method: "post", data: { code: res.code }, success(res) { console.log(res.data.data.login_key) console.log(that) that.setData({ login_key: res.data.data.login_key } ) }, }) }else { console.log('登陸失敗!' + res.errMsg) } } })
其中setData
方法的必須對象是整個頁面json