前端代码:
onShow: function () {
// 登录
var token = wx.getStorageSync('token')
var code
if (token) {
wx.getUserInfo({
success: res => {
app.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (app.userInfoReadyCallback) {
app.userInfoReadyCallback(res)
}
},
fail: () => {
//跳转授权失败页面
wx.reLaunch({
url: loginFailedUrl,
})
}
})
} else {
wx.login({
success: res => {
code = res.code
wx.getUserInfo({
success: res => {
app.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (app.userInfoReadyCallback) {
app.userInfoReadyCallback(res)
}
// 发送 res.code 到后台换取 openId, sessionKey, unionId
util.get("login", {
code: code, encryptedData: res.encryptedData, iv: res.iv,
}, this.doLoginSucc)
},
fail: () => {
wx.showModal({
title: '授权失败',
content: '登录需允许授权,是否现在进行授权',
success: res => {
if (res.confirm) {
wx.openSetting({
success: res => {
if (res.authSetting["scope.userInfo"] == true) {
wx.getUserInfo({
withCredentials: false,
success: res => {
app.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (app.userInfoReadyCallback) {
app.userInfoReadyCallback(res)
}
// 发送 res.code 到后台换取 openId, sessionKey, unionId
util.get("login", {
code: code, encryptedData: res.encryptedData, iv: res.iv,
}, this.doLoginSucc)
},
fail: () => {
//跳转授权失败页面
wx.reLaunch({
url: loginFailedUrl,
})
}
})
}
}
})
} else if (res.cancel) {
//跳转授权失败页面
wx.reLaunch({
url: loginFailedUrl,
})
}
}
})
}
})
}
})
}
},
后端代码:
class Login(BaseAPIView):
"""
登陆
"""
authentication_classes = ()
def get(self, request):
result = {'succ': False}
js_code = request.GET.get('code')
# encryptedData = request.GET.get('encryptedData')
# iv = request.GET.get('iv')
url = 'https://api.weixin.qq.com/sns/jscode2session'
params = dict()
params['js_code'] = js_code
params['appid'] = 'wxa221200002300d17'
params['secret'] = '23b672b555155b01042cdb35170d1b62'
params['grant_type'] = 'authorization_code'
res = requests.get(url, params=params)
if res.status_code == 200:
data = json.loads(res.text)
open_id = data.get('openid')
# session_key = data.get('session_key')
else:
raise LoginExp()
# try:
# des_util.decrypt_des(js_code,)
# except:
# pass
ub = UserBound.objects.filter(bound_id=open_id).first()
if ub:
token = gen_token(ub.user_id)
result['succ'] = True
result['token'] = token
result['user'] = {'name': ub.user.personaname, 'email': ub.user.email,
'phone':ub.user.phone,}
result['open_id'] = open_id
return Response(result)
开发文档: https://mp.weixin.qq.com/debug/wxadoc/dev/