zoukankan      html  css  js  c++  java
  • Django+wechatpy接入微信公众平台以及授权登录

    1. 确定Django环境可以正常运行,环境搭建见:Linux 搭建Nginx+uwsgi+Django环境

    2. 安装 wechatpy[cryptography]

      sudo pip3 install wechatpy[cryptography]
      
    3. 修改settings.py

      1. 接入微信公众号的连接去掉csrf验证,详情参考:解决Django+Vue前后端分离的跨域问题及关闭csrf验证的后半部分

      2. 在settings.py 加入微信公众号配置

        AppID = ''
        AppSecret = ''
        Token = ''
        
    4. 接入

      1. Django接入微信公众号代码

        # wx.view代码
        
        from wechatpy.utils import check_signature
        from back import settings
        from wechatpy.exceptions import InvalidSignatureException
        from django.http import HttpResponse
        from wechatpy import parse_message, create_reply
        from wechatpy.replies import BaseReply
        from wechatpy import WeChatClient
        from wechatpy.oauth import WeChatOAuth
        from django.shortcuts import redirect
        
        import wx.wechat as wx_wechat
        
        
        # 连接微信公众号的方法
        def serve(request):
            # GET 方式用于微信公众平台绑定验证
            if request.method == 'GET':
                signature = request.GET.get('signature', '')
                timestamp = request.GET.get('timestamp', '')
                nonce = request.GET.get('nonce', '')
                echo_str = request.GET.get('echostr', '')
                try:
                    check_signature(settings.Token, signature, timestamp, nonce)
                except InvalidSignatureException:
                    echo_str = '错误的请求'
                response = HttpResponse(echo_str)
            else:
        
                msg = parse_message(request.body)
                msg_dict = msg.__dict__['_data']
                # print(msg.id, msg.source, msg.create_time, msg.type, msg.target, msg.time, msg.__dict__['_data']['Event'], '====')
                if msg.type == 'text':
                    pass
                elif msg.type == 'event':
                    if msg_dict['Event'] == 'subscribe':
                    		# 关注后 将获取的用户的信息保存到数据库
                        wx_wechat.subscribe(getWxUserInfo(msg.source))
                    elif msg_dict['Event'] == 'unsubscribe':
                    		# 取关后,将用户的关注状态更改为 未关注
                        wx_wechat.unsubscribe(msg.source)
                else:
                    pass
                response = HttpResponse('', content_type="application/xml")
            return response
        
        
        def getWxClient():
            return WeChatClient(settings.AppID, settings.AppSecret)
        
        
        def getWxUserInfo(openid):
            wxClient = getWxClient()
            wxUserInfo = wxClient.user.get(openid)
            return wxUserInfo
        
        
        def getWeChatOAuth(redirect_url):
            return WeChatOAuth(settings.AppID, settings.AppSecret, redirect_url)
        
        # 定义授权装饰器
        def oauth(method):
            def warpper(request):
                if request.session.get('user_info', None) is None:
                    code = request.GET.get('code', None)
                    wechat_oauth = getWeChatOAuth(request.get_raw_uri())
                    url = wechat_oauth.authorize_url
                    if code:
                        try:
                            wechat_oauth.fetch_access_token(code)
                            user_info = wechat_oauth.get_user_info()
                        except Exception as e:
                            print(str(e))
                            # 这里需要处理请求里包含的 code 无效的情况
                            # abort(403)
                        else:
                            request.session['user_info'] = user_info
                    else:
                        return redirect(url)
        
                return method(request)
            return warpper
        
        @oauth
        def get_wx_user_info(request):
            user_info = request.session.get('user_info')
            return HttpResponse(str(user_info))
        
        
        # wx.url代码
        from django.urls import path
        from . import views
        
        urlpatterns = [
            path('wechat/', views.serve),
        
            path('user/info', views.get_wx_user_info)
        ]
        
        

        这样等后台配置完毕后,就可以通过访问get_wx_user_info方法来获取当前授权登录的用户的信息

      2. 微信后台设置

        1. 参考:接入指南
        2. 微信公众平台后台登录地址
          1. 正式地址
          2. 测试账号地址

    如需转载请注明出处:https://www.cnblogs.com/zhuchenglin/p/10755547.html

  • 相关阅读:
    CentOS ping www.baidu.com 报错 name or service not know
    python2 当中 遇到 UnicodeDecodeError UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 37: ordinal not in range(128)
    shell基本语法
    android---笔记 AppContext extends Application
    android笔记--加载框
    android笔记--与服务器交互更改简历状态
    android笔记---AndroidManifest.xml
    android笔记-----消息提示
    ios笔记一 追加数据
    android笔记一 控件属性
  • 原文地址:https://www.cnblogs.com/zhuchenglin/p/10755547.html
Copyright © 2011-2022 走看看