小程序登录:
小程序可以通过微信官方提供的登录方法方便地获取微信提供的用户身份标识
功能描述:
调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台账号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台账号)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。
示例代码
后端通过拿到前端发送的code进行对官方进行请求,获取openid和session_key
请求前需要传入参数
小程序id:appid(自己小程序)
小程序密钥:secret(自己小程序)
code:js_code(前端发送的code)
请求url示范:
https://api.weixin.qq.com/sns/jscode2session?appid=wx78a9ebfc7f6e5199&secret=e52eb8157527a5065dd4a66d3b8c4f58&js_code=0c16Z51w3suTc33vJi0w3WJECK06Z51M&grant_type=authorization_code
响应成功示范:
{'session_key': 'fAXZyFh2sOJtetJARvJBTQ==', 'openid': 'oFrt47e5vwxzynVGB_apbBxixRr8'}
如果是下面情况,表示code被使用过,已经失效:
{
"errcode": 40163,
"errmsg": "code been used, rid: 66a0b364-6dea0ee5-656dbeef"
}
django实现代码:
stting.py文件中:
AppID = "wx78a9ebfc7f6e5199"
AppSecret = "e52eb8157527a5065dd4a66d3b8c4f58"
code2Session = 'https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code' # 获取微信小程序code
url.py
from django.urls import path
from appFrontLP.views import *
urlpatterns=[
path("login",UserLogin.as_view()),#登录
]
视图文件实现方法:
from rest_framework.views import APIView
from travelWechatApp import settings
def get_user_info(code):
code_url = settings.code2Session.format(AppID, AppSecret, code)
response = requests.get(code_url)
json_response = response.json() # 把它变成json的字典
if json_response.get("session_key"):
return json_response
else:
return False
class UserLogin(APIView):
"""登录授权"""
def post(self, request):
param = request.data
number = param.get("phone")
if not param.get('code'):
return JsonResponse({'status': 1, "msg": "缺少参数"},status=status.HTTP_400_BAD_REQUEST)
else:
code = param.get('code')
user_data = get_user_info(code)
if user_data:
val = user_data['session_key'] + "&" + user_data['openid']
key = user_data['session_key']
sql = f"""SELECT * FROM wechatusers WHERE openid = '{user_data['openid']}'"""
has_user = self.Fetchone(sql)
if not has_user:
into_sql = f"""INSERT INTO wechatusers (openid, session_key, number) VALUES ('{user_data['openid']}', '{key}','{number}')"""
self.Fetchone(into_sql)
return JsonResponse({
'status': 0,
'msg': 'ok',
'data': {'token': key,"openid":user_data['openid']}
},status=status.HTTP_200_OK)
else:
return JsonResponse({'status': 2, 'msg': "无效的code"},status=status.HTTP_400_BAD_REQUEST)