{"id":3552,"date":"2022-03-16T17:21:48","date_gmt":"2022-03-16T09:21:48","guid":{"rendered":"https:\/\/egonlin.com\/?p=3552"},"modified":"2022-03-16T17:21:48","modified_gmt":"2022-03-16T09:21:48","slug":"%e7%ac%ac%e5%9b%9b%e8%8a%82%ef%bc%9a%e5%be%ae%e4%bf%a1%e7%99%bb%e5%85%a5%e5%b0%8f%e7%a8%8b%e5%ba%8f%e4%b8%8e%e5%90%8e%e7%ab%af%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/egonlin.com\/?p=3552","title":{"rendered":"\u7b2c\u56db\u8282\uff1a\u5fae\u4fe1\u767b\u5165\u5c0f\u7a0b\u5e8f\u4e0e\u540e\u7aef\u5b9e\u73b0"},"content":{"rendered":"<h3>\u5fae\u4fe1\u767b\u5165\u5c0f\u7a0b\u5e8f\u4e0e\u540e\u7aef\u5b9e\u73b0<\/h3>\n<p><strong>\u9700\u6c42\uff1a<\/strong>\u5b9e\u73b0\u5c0f\u7a0b\u5e8f\u7aef\u5b9e\u73b0\u767b\u5165\u4ee5\u540e\uff0c\u540e\u7aef\u5b9e\u73b0\u767b\u5165\u72b6\u6001<\/p>\n<h4>\u5c0f\u7a0b\u5e8f\u7aef<\/h4>\n<p>app.js<\/p>\n<pre><code class=\"language-js\">App({\n    onLaunch: function () {\n    \/\/ \u5c55\u793a\u672c\u5730\u5b58\u50a8\u80fd\u529b001bHJ281qo7rS1JR1481OQC281bHJ2B\n    var _this = this;  \n      wx.login({\n        success: res =&gt; {\n         \/\/ console.log(res);\n          wx.request({\n            url: _this.globalData.apiDomain +&#039;\/api\/member\/code\/login&#039;,\n            data: {\n              code: res.code\n            },\n            method: &quot;POST&quot;,\n            header: {\n              &#039;content-type&#039;: &#039;application\/json&#039; \/\/ \u9ed8\u8ba4\u503c\n            },\n            success: function (res) {\n              console.log(res);\n              wx.setStorageSync(&#039;login_key&#039;, res.data.data.login_key);\n            },\n            fail:function(res){\n              console.log(res)\n            }\n          })\n        }\n      });\n  },\n  \/\/\u8bbe\u7f6e\u5168\u5c40\u7684\u53d8\u91cf\uff0capiDomain\u8fd9\u662f\u6211\u4eec\u63a5\u53e3\u7684ip\n  globalData: {\n    apiDomain:&#039;http:\/\/127.0.0.1:8000&#039;,\n    \/\/\u4fdd\u5b58\u767b\u5165\u7684\u6807\u8bc6\n    login_key:&#039;&#039;\n  }\n})<\/code><\/pre>\n<h4>\u670d\u52a1\u7aef<\/h4>\n<p>1\u6dfb\u52a0\u767b\u5165\u8def\u7531user.login.as_view()\uff0c\u63a5\u6536\u5c0f\u7a0b\u5e8f\u4e2d\u4f20\u8fc7\u6765\u7684code\u3002<\/p>\n<p>2 \u6211\u4eec\u901a\u8fc7code\u8bf7\u6c42\u5fae\u4fe1\u63a5\u53e3\u83b7\u53d6session_key\u548c\u7528\u6237\u552f\u4e00\u6807\u8bc6openid\uff0c\u5f53\u6211\u4eec\u62ff\u5230openid\u540e\uff0c\u4fdd\u5b58\u81f3Wxuser\u8868<\/p>\n<p>3 \u6211\u4eec\u968f\u673a\u751f\u6210\u4e00\u4e2alogin_key,\u4f5c\u4e3a\u952e\uff0c\u5c06session_key\u548copenid\u62fc\u63a5\uff0c\u4f5c\u4e3a\u503c\uff0c\u4fdd\u5b58\u5230redis,\u5728\u5c06login_key\uff08\u76f8\u5f53\u4e8eweb\u4e2d\u7684session\uff09\u8fd4\u56de\u5c0f\u7a0b\u5e8f\uff0c\u540e\u9762\u5c0f\u7a0b\u5e8f\u9700\u8981\u767b\u5165\u8bf7\u6c42\u7684\u63a5\u53e3,\u5fc5\u987b\u5e26login_key\uff0c\u4f5c\u4e3a\u7528\u6237\u6807\u8bc6<\/p>\n<p>url.py<\/p>\n<pre><code class=\"language-python\">from django.contrib import admin\nfrom django.urls import path\nfrom django.conf.urls import url\nfrom api.views import product,user\n\nurlpatterns = [\n    path(&#039;admin\/&#039;, admin.site.urls),\n    url(r&#039;^api\/indexlist\/categoryList$&#039;, product.caetgoryList.as_view()),\n    url(r&#039;^api\/indexlist\/IndexProductList$&#039;, product.ProductList.as_view()),\n    url(r&#039;^api\/indexlist\/categoryProductsList$&#039;, product.categoryProductsList.as_view()),\n    url(r&#039;^api\/indexlist\/detailProduct$&#039;, product.detailProduct.as_view()),\n    url(r&#039;^api\/member\/code\/login$&#039;, user.login.as_view()),\n]<\/code><\/pre>\n<p>user.py<\/p>\n<pre><code class=\"language-python\">from django.shortcuts import render,HttpResponse\nfrom rest_framework.views import APIView\nfrom api.wx import wxlogin,UserInfo,setting\nfrom api import baseResponse\nimport time\nfrom django.core.cache import cache #\u5f15\u5165\u7f13\u5b58\u6a21\u5757\nfrom api import models\nfrom django.http import JsonResponse\nimport hashlib\n# Create your views here.\nclass login(APIView):\n    def post(self,request):\n        # \u7528apiview\u4e4b\u540e\uff0c\u518d\u53d6\u6570\u636e\uff0c\u4ecerequest.data\n        params=request.data\n        #\u5224\u65ad\u524d\u7aef\u662f\u5426\u4f20\u5165code\u53c2\u6570\n        if params.get(&#039;code&#039;):\n            code=params[&#039;code&#039;]\n            #\u8c03\u7528wxloing.getLoginInfo\u83b7\u53d6session_key\u548copenid\n            user_data=wxlogin.getLoginInfo(code)\n            if user_data:\n                #\u5c06session_key\u548copenid\u62fc\u63a5\u6210\u5b57\u7b26\u4e32\uff0c\u4e0d\u8981\u4e71\u9009\u62fc\u63a5\u5b57\u7b26\u4e32\uff0c\u56e0\u4e3aopenid\u4e2d\u6709\u7279\u6b8a\u7b26\u53f7\n                val=user_data[&#039;session_key&#039;]+&#039;&amp;&#039;+user_data[&#039;openid&#039;]\n                #\u751f\u6210MD5\u503c\u83b7\u53d6key\n                md=hashlib.md5()\n                md.update(code.encode(&#039;utf-8&#039;))\n                md.update(str(time.clock()).encode(&#039;utf-8&#039;))\n                key = md.hexdigest()\n                data={}\n                try:\n                    #\u5c06key\u548c\u4e0a\u9762\u7684val\u5b58\u5165redis\n                    cache.set(key,val)\n                    #\u8fd4\u56delogin_key\u5230\u5c0f\u7a0b\u5e8f\n                    data[&#039;login_key&#039;] = key\n                    #\u5c06\u7528\u6237\u6570\u636e\u5b58\u5165\u6570\u636e\u5e93\n                    try:\n                        user = models.Wxuser.objects.get(openid=user_data[&#039;openid&#039;])\n                    except Exception as e:\n                        user=None\n                    #\u5982\u679c\u6570\u636e\u6ca1\u6709\u5219\u521b\u5efa\u8bb0\u5f55\n                    if not user:\n                        models.Wxuser.objects.create(openid=user_data[&#039;openid&#039;])\n                    re_data = baseResponse.resdic(&quot;success&quot;, &quot;\u6210\u529f&quot;,data )\n                    return JsonResponse(re_data)\n                except Exception as e:\n                    print(e)\n                    re_data = baseResponse.resdic(&quot;error&quot;, &quot;redis\u7a0b\u5e8f\u51fa\u9519&quot; )\n                    return JsonResponse(re_data)\n            else:\n                re_data = baseResponse.resdic(&quot;error&quot;, &quot;\u83b7\u53d6session_key\u5931\u8d25&quot;)\n                return JsonResponse(re_data)\n        else:\n            re_data = baseResponse.resdic(&quot;error&quot;, &quot;\u7f3a\u5c11\u53c2\u6570&quot;)\n            return JsonResponse(re_data)<\/code><\/pre>\n<p>api.wx.setting.py<\/p>\n<pre><code class=\"language-python\">AppId=&quot;wxd1eba74200bc40c8&quot;\nAppSecret=&quot;0d7168052febae147f1d70eb6b8996d5&quot;\ncode2session_url= &quot;https:\/\/api.weixin.qq.com\/sns\/jscode2session?appid={}&amp;secret={}&amp;js_code={}&amp;grant_type=authorization_code&quot;\nacces_url=  &#039;https:\/\/api.weixin.qq.com\/cgi-bin\/token?grant_type=client_credential&amp;appid={}&amp;secret={}&#039;\n<\/code><\/pre>\n<p>api.wx.wxlogin<\/p>\n<pre><code class=\"language-python\">from api.wx import setting\nimport requests\nimport json\n\ndef getLoginInfo(code):\n    url=setting.code2session_url.format(setting.AppId,setting.AppSecret,code)\n    re_data= requests.get(url)\n    json_response = re_data.content.decode()  # \u83b7\u53d6r\u7684\u6587\u672c \u5c31\u662f\u4e00\u4e2ajson\u5b57\u7b26\u4e32\n    # \u5c06json\u5b57\u7b26\u4e32\u8f6c\u6362\u6210dic\u5b57\u5178\u5bf9\u8c61\n    data = json.loads(json_response)\n    if data.get(&#039;session_key&#039;):\n        return data\n    return  False<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5fae\u4fe1\u767b\u5165\u5c0f\u7a0b\u5e8f\u4e0e\u540e\u7aef\u5b9e\u73b0 \u9700\u6c42\uff1a\u5b9e\u73b0\u5c0f\u7a0b\u5e8f\u7aef\u5b9e\u73b0\u767b\u5165\u4ee5\u540e\uff0c\u540e\u7aef\u5b9e\u73b0\u767b\u5165\u72b6\u6001 \u5c0f\u7a0b\u5e8f\u7aef app.js App({ [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[307,309],"tags":[],"_links":{"self":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/3552"}],"collection":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3552"}],"version-history":[{"count":0,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/3552\/revisions"}],"wp:attachment":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3552"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3552"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3552"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}