위챗 공식 계정 개발 Django- 웹 페이지 인증

텍스트 링크
기초적인 위챗 공식번호 개발, 웹 페이지 권한 수여, JSSDK, 이미지 처리는 가장 중요한 세 부분일 것이다
근본적으로 문서 개발대로 기술 함량이 높지 않다.
(Django=많은 권한 제어 모듈이 완성되어 비교적 효율적이다)
시작하기 전에 내부 네트워크가 뚫린 각종 도구를 강력히 추천합니다. 공중번호를 실시간으로 디버깅할 수 있습니다
스스로 구축하는 것을 추천합니다. 도메인 이름을 사용자 정의할 수 있고 전송도 안심할 수 있습니다.
https://github.com/inconshreveable/ngrok
https://github.com/fatedier/frp
모든 것을 수동으로 이루고 싶지 않은 것은 참고할 수 있다. WeRoBot은 처음부터 이걸로 힘을 좀 덜려고 했지만 일부 인터페이스가 실현되지 않고 고쳐져서 마지막에...무심코'작은 봉인'을 실현했지만 기초 인터페이스만 사용하면 프레임을 직접 사용하는 게 편해요.
웹 페이지 권한 부여, 공식 문서를 직접 베끼기:
  • 첫 번째 단계: 사용자 동의 권한 수여, 코드 획득
  • 2단계: 코드로 웹 페이지 권한 교환accesstoken
  • 3단계:access 리셋token(필요한 경우)
  • 4단계: 사용자 정보 가져오기(scope는 snsapi user info 필요)
  • 첨부: 권한 수여증빙(access token)이 유효한지 검사
  • # xgc.wechat.py  
    
    token=os.environ.get('TOKEN') #      
    app_id=os.environ.get('APP_ID')
    app_secret=os.environ.get('APP_SECRET')
    redirect_url = os.environ.get('REDIRECT_URL')
    state = os.environ.get('STATE')
    #      
    web_get_code = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&state=%s&scope='%(app_id,redirect_url,state)
    web_get_fan_info = 'https://api.weixin.qq.com/sns/userinfo?access_token='
    web_check_access_token = 'https://api.weixin.qq.com/sns/auth?access_token='
    web_get_access_token = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&grant_type=authorization_code&code='%(app_id,app_secret)
    
    # views.py  
    
    class web_authorization(View):
    
        def get(self, request):
            from xgc.wechat import web_get_code, web_get_fan_info,web_get_access_token,web_check_access_token
            code = request.GET.get("code", "")
            if not code:
                return HttpResponse("    ")
            requests_web_get_access_token_result = requests.get(web_get_access_token+code).json()
            if 'errmsg' in requests_web_get_access_token_result.keys():
                return HttpResponseRedirect(web_get_code+'snsapi_base#wechat_redirect')
            if cache.has_key('web_access_token'):
                web_access_token = cache.get('web_access_token')
            else:
                web_access_token = requests_web_get_access_token_result['access_token']
                cache.set('web_access_token',web_access_token,110*60) #      
            fan_openid = requests_web_get_access_token_result['openid']
            #                ,            ,        
            # check_access_token = requests.get(web_check_access_token+'%s&openid=%s'%(web_access_token,fan_openid)).json()
            # if check_access_token['errcode']!=0:
            #     return HttpResponseRedirect(web_get_code+'snsapi_base#wechat_redirect')
            scope = requests_web_get_access_token_result["scope"]
            if scope == "snsapi_userinfo":
                fan_info = requests.get(web_get_fan_info+'%s&openid=%s&lang=zh_CN' % (web_access_token, fan_openid))
                fan_info.encoding = 'utf-8'
                fan_info = fan_info.json()
                FansProfile.create_fan(fan_info)
            check_openid = FansProfile.objects.filter(openid=fan_openid).first()
            if not check_openid:
                return render(request, 'register.html', {'url': web_get_code+'snsapi_userinfo#wechat_redirect','header':'    ','text':'         ,        '})
            response = HttpResponseRedirect('index')
            response.set_cookie('fanid',check_openid.id,3600)
            return response

    code
    여기 제가 직접 공중번호 메뉴 부분에 안내 URL을 설치했어요.
    여기 베이스 인증으로 설정된 것은 코드에 인증 부분을 추가했기 때문입니다
    사용자 첫 번째 인증 후 우리는 사용자의 기본 정보를 저장할 수 있으며 다음에user info 인증을 할 필요가 없습니다
    그리고 자동 권한 수여 사용자 체험도 좋고요.
    {
        "type": "view",
        "name": "    ",
        "url": wechat_get_code+'snsapi_base#wechat_redirect',
        "key": "test_4"
    }

    access_token
    문서에서 말한 바와 같이 코드를 얻은 후에 우리가 필요로 하는access 로 직접 교환을 요청합니다token
    if cache.has_key('web_access_token'):
        web_access_token = cache.get('web_access_token')
    else:
        web_access_token = requests_web_get_access_token_result['access_token']
        cache.set('web_access_token',web_access_token,110*60)

    코드에서 캐시 정책을 사용했습니다. 위챗에서 많은 Token은 요청 횟수 제한이 있고 실효 기간이 있습니다. 캐시 Token은 현명한 선택입니다. 구체적인 캐시 아래에 언급될 것입니다.
    refresh_token
    access 바꾸기token과 동시에 위챗은refreshtoken은access 에 사용token의 리셋은 제 코드에서 사용하지 않고 직접 재권한을 부여했습니다
    snsapi_userinfo
    첫 번째 권한 수여 때 우리는 데이터베이스에 이 사용자의 인증 기록이 있는지 검사했다
    없으면 사용자 info 권한 부여를 유도합니다
    그중에서 주의해야 할 것은 여기 위챗 서버에서 되돌아오는 데이터가 데이터 인코딩 유형을 가리키지 않아 직접 읽으면 난코드가 발생할 수 있다는 점입니다. 저희는response 인코딩을 지정하여 디코딩을 할 수 있습니다. 구체적으로 설명해서 이 댓글을 추천합니다.https://www.v2ex.com/t/172276
    if scope == "snsapi_userinfo":
        fan_info = requests.get(web_get_fan_info+'%s&openid=%s&lang=zh_CN' % (web_access_token, fan_openid))
        fan_info.encoding = 'utf-8'
        fan_info = fan_info.json()
        FansProfile.create_fan(fan_info)

    PS:set_쿠키는 제가 팬의 모델을 계승하지 않았기 때문에 Django의user모델은 자신의auth모듈을 사용할 수 없습니다. 나중에 폼을 제출하고 사진을 올릴 때 누가 올렸는지 알아야 하기 때문에 사용자 id를 쿠키에 기록하는 방식을 사용합니다.
    캐시 정보
    이곳은 Redis 방식을 사용합니다. 우선 Django의 settings.py 도입 캐시 설정
    CACHES = {
        'default': {
            'BACKEND': 'django_redis.cache.RedisCache', #      
            'LOCATION': '127.0.0.1:6379',
            'TIMEOUT': 600,
            'OPTIONS': {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "IGNORE_EXCEPTIONS": True,
            }
        }
    }

    그리고 우리는 from django를 도입할 수 있다.core.cache import cache 모듈
    아래와 같은 몇 가지 기본적인 조작을 진행하다
    #   web_access_token  
    #    110*60s, 110min
    cache.set('web_access_token',web_access_token,110*60)

    공식 문서
    os.environ.get('')
    루트 디렉터리를 가져옵니다.env 파일의 다양한 설정
    부분비밀token,appid 단독 설정
    이로써 가상 환경 추천 도구인 Pipenv를 만듭니다. 일반적인 가상 환경 추천 도구가 아닌 Pipenv 등 ~ 기본 지원을 만듭니다.env 가져오기

    좋은 웹페이지 즐겨찾기