首頁 >後端開發 >Python教學 >Django使用Social-Auth實作微信第三方網站掃碼登入的方法介紹

Django使用Social-Auth實作微信第三方網站掃碼登入的方法介紹

高洛峰
高洛峰原創
2017-03-16 15:50:023906瀏覽

前言

之前讓網頁公司製作新官網的時候規劃有第三方帳號的登入功能,但由於當時的一些開放平台申請步驟比較繁瑣(尤其是微信開放平台),所以一直拖延著,到了最近只能自己加入相關的功能。

由於是剛接觸<a href="//m.sbmmt.com/wiki/1514.html" target="_blank">Python</a><a href="//m.sbmmt.com/wiki/1515.html" target="_blank">Django</a>,我找了好多影片和資料學習練習,才慢慢把MVT結構什麼的弄清楚了,第三方登入方面百度找到了兩篇很有用的文章,也從中學習到了很多:

1. python實作微信第三方網站掃碼登入(Django)
2. 用django-social-auth 做中國社群網站三方登入(QQ,微博,豆瓣,百度,人人,微信)

在實現QQ、微博的登入時就深刻體會到使用social-auth來實現第三方登入是非常簡單方便、直接而且完美的,然而卻一直沒有找到微信怎麼也同樣來實現(上面第二篇文章也一樣沒有提及);從social-auth的解讀文件裡也愣是沒找到Weixin的內容,由於官網已經有相應的User資料表以及儲存第三方的UserSocialAuth資料格,非常規範,在使用上面第一種方法實作之後卻苦惱於使用者資料表的新增和修改,真心不想破壞那種結構,就在重拾social-auth想學習一下資料庫儲存方式的時候,竟然在social-back<a href="//m.sbmmt.com/wiki/1048.html" target="_blank">end</a>s裡發現了Weixin.py,那不就說明能支持微信麼?

注意事項

  • #微信開放平台申請及開通需要提交許多認證資料,也需要繳交¥300每年的認證費用;跟公眾號、服務號等不一樣哦。網址:http://open.weixin.qq.com

  • 認證通過後,加入對應的網頁應用,注意授權回調域的填寫,寫網站的主網域即可,比如說不能寫www.zzmxy.com/login/wechat之類的,只需要寫www.zzmxy.com 即可(不需要加入http或https),不然後期都是re<a href="//m.sbmmt.com/wiki/1275.html" target="_blank">dir</a>ect_uri 參數錯誤!

##實操步驟

  1. 安裝social-auth由於官網使用的是
    python-social-auth==0.2.12 ,下載原始碼回來之後,發現在social-backends裡也是有Weixin.py的,證明可用;

    pip install python-social-auth==0.2.12
  2. social-auth設定:

  • SOCIAL_AUTH_PIPELINE設定:請參考上述的第二篇文章的書寫;

  • AUTHENTICATION_BACKENDS設定:

    AUTHENTICATION_BACKENDS = (
       'social.backends.weibo.WeiboOAuth2',      #微博的功能
       'social.backends.qq.QQOAuth2',            #QQ的功能
       'social.backends.weixin.WeixinOAuth2',    #这个是导入微信的功能
       'oscar.apps.customer.auth_backends.EmailBackend',
       'django.contrib.auth.backends.ModelBackend',
       )
  • 微信開放平台應用程式

    APPIDSECRET的配置:

    SOCIAL_AUTH_WEIBO_KEY = '53*****29'
    SOCIAL_AUTH_WEIBO_SECRET = '272152************81a8b3'
    SOCIAL_AUTH_QQ_KEY = '10*****51'
    SOCIAL_AUTH_QQ_SECRET = '5807************d15bd97'
    SOCIAL_AUTH_WEIXIN_KEY = 'wx4fb***********599'            #开放平台应用的APPID
    SOCIAL_AUTH_WEIXIN_SECRET = 'f1c17************08c0489'    #开放平台应用的SECRET
  • 配置完成之後,運行你的網站,使用www.域名.com/login/weixin 訪問即可打開相應的頁面了,但有沒有發現出現錯誤了:

    Scope參數錯誤或沒有Scope權限,實際操作過程中,我發現social-auth自動產生的二維碼存取連結裡,是少了一個 scope參數,而微信官方給的二維碼存取連結是這樣的:

    https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
    如上需要的參數為5個,

    state可省略,但scope 則是必需的,而對於網頁授權的訪問,scope作用域參數為固定值scope=snsapi<a href="//m.sbmmt.com/js/js-weixinapp-api.html" target="_blank">_login</a>,這樣的話,我們就需要在social-auth的原始程式碼上,把這個參數值給加上,根據你實際的site-packages安裝路徑,找到/social/backends/ weixin.py文件,如我使用VirtualEnv建造的路徑是:

    /home/ubuntu/env/mppython/lib/python2.7/site-packages/social/backends/weixin.py
    打開這個文件,找到裡面

    def auth_params()這一段內容(原文):

    def auth_params(self, state=None):
        appid, secret = self.get_key_and_secret()
        params = {
            'appid': appid,
            'redirect_uri': self.get_redirect_uri(state),
        }
        if self.STATE_PARAMETER and state:
            params['state'] = state
        if self.RESPONSE_TYPE:
            params['response_type'] = self.RESPONSE_TYPE
        return params

    params字典裡,加入一個scope參數即可,修改後如下:

    def auth_params(self, state=None):
        appid, secret = self.get_key_and_secret()
        params = {
            'appid': appid,
            'redirect_uri': self.get_redirect_uri(state),
            'scope': 'snsapi_login',
        }
        if self.STATE_PARAMETER and state:
            params['state'] = state
        if self.RESPONSE_TYPE:
            params['response_type'] = self.RESPONSE_TYPE
        return params
    修改儲存後,再重新運行工程,再次訪問www.域名.com/login/weixin 即可看到效果了!

  • #

    以上是Django使用Social-Auth實作微信第三方網站掃碼登入的方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn