python --服务号微信授权登录换取open_id/获取jsjdk
classLogin(APIView):登录defget(self,request,*args,**kwargs)-Response: 授权登录 params code - jscode; 【注】:返回301需要重新获取jscode; codeself.request.GET.get(code)access_token,open_idself._get_open_and_access_token(code)ifnotall((access_token,open_id)):returnResponse({code:301,msg:code码已过期,请更新后从新授权})userUser.objects.filter(open_idopen_id).first()ifnotuser:userself._register_user(access_token,open_id)returnResponse({code:0,msg:success,Authorizations:AuthUser.create_token(user.user_id,hours99999,pwd),results:UserSimpleSerializer(user).data})def_get_open_and_access_token(self,code:str)-tuple: 获取授权信息 params code - js授权码; returns (access_token, openid) resultrequests.get(https://api.weixin.qq.com/sns/oauth2/access_tokenf?appid{appid}secret{appsecret}code{code}fgrant_typeauthorization_code).json()logger.debug(f获取openid返回值:{result})returnresult.get(access_token),result.get(openid)def_register_user(self,access_token:str,open_id:str)-User: 注册用户 params access_token - 会话token; params open_id - open_id; resultrequests.get(fhttps://api.weixin.qq.com/sns/userinfo?access_token{access_token}openid{open_id}langzh_CN).json()logger.success(f首次登陆拉取用户信息:{result})returnUser.objects.create(open_idopen_id,nickname(result[nickname]).encode(iso-8859-1).decode(utf-8),imgresult[headimgurl],)classJsJDK(APIView):JsJDkdefpost(self,request,*args,**kwargs)-Response: 获取 JsJDkk临时票据 params url -- 页面url; urlself.request.data.get(url)logger.warning(furl为:【{url}】)data{noncestr:.join(random.choice(string.ascii_lowercase)for_inrange(15)),jsapi_ticket:self._get_js_ticket(),timestamp:int(time.time()),# 创建一个时间戳url:url}pinjie.join([f{key.lower()}{data[key]}forkeyinsorted(data)])# 根据字符的ASCII值进行排序拼接data[signature]hashlib.sha1(pinjie.encode(utf-8)).hexdigest()# 对字符串进行sha1加密returnResponse(dict({code:0,msg:success},**data))def_get_access_token(self)-str: access_token resultrequests.get(fhttps://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credentialfappid{appid}secret{appsecret}).json()access_tokenresult.get(access_token)logger.debug(f(缓存到期)重新获取access_token【{result}】)returnaccess_tokendef_get_js_ticket(self)-str:ticketticketcache.get(jsapi_ticket)ifnotticket:access_tokenself._get_access_token()resultrequests.get(fhttps://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token{access_token}typejsapi).json()logger.debug(f(缓存到期)重新获取js_ticket【{result}】)ticketresult.get(ticket)cache.set(jsapi_ticket,ticket,timeout7200)returntickethtml测试!DOCTYPEhtmlhtmlheadmeta charsetUTF-8meta nameviewportcontentwidthdevice-width, initial-scale1.0title微信授权/title/headbodyscript(function(){constREDIRECT_URIhttps://www.xxxxxxxx.com/static/front_end/1.html;constAPPIDxxxxxxxxx;constSCOPEsnsapi_userinfo;constRESPONSE_TYPEcode;functionlog(message,data){console.log([微信授权]${message},data||);}functionbuildAuthUrl(){constbasehttps://open.weixin.qq.com/connect/oauth2/authorize;constparamsnewURLSearchParams({appid:APPID,redirect_uri:REDIRECT_URI,response_type:RESPONSE_TYPE,scope:SCOPE,// state: });consturl${base}?${params.toString()}#wechat_redirect;returnurl;}functiongetCodeFromUrl(){constparamsnewURLSearchParams(window.location.search);constcodeparams.get(code);returncode;}asyncfunctionsendCodeToBackend(code){constapiUrlhttps://www.xxxxxxx.com/front_end/api/login/?code${code};try{constresponseawaitfetch(apiUrl,{method:GET,headers:{Content-Type:application/json}});constdataawaitresponse.json();if(data.code301){log(code已过期重新授权);window.location.hrefbuildAuthUrl();}else{document.body.innerHTMLpre登录成功:${JSON.stringify(data,null,2)}/pre;}}catch(error){document.body.innerHTMLpre请求失败:${error.message}/pre;}}functionmain(){constcodegetCodeFromUrl();if(code){sendCodeToBackend(code);}else{log(未检测到code跳转微信授权);window.location.hrefbuildAuthUrl();}}main();})();/script/body/html