午后醉清风 發表於 2019-5-24 15:27:00

微信公众号定制开发

<p>&nbsp;</p>
<p>1、配置 公众号&nbsp; &nbsp;-开发-网页服务-网页授权- 修改&nbsp;网页授权获取用户基本信息&nbsp;授权域名。 (注: 公众号自动回复开发,需要开启&nbsp;&nbsp;服务器配置,单独的获取用户信息则不需要。 jssdk是 白名单授权管理。)</p>
<p><span style="color: rgba(255, 0, 0, 1)">2、菜单 接入 :&nbsp; &nbsp;http:// XXX /&nbsp;user/info 访问时用户授权,授权以后跳转到&nbsp; http://XXX/home?code=xxx (配置)此时再次&nbsp; 调用&nbsp;http:// XXX /&nbsp;user/info 获取用户信息 放入session(供以后接口获取)</span></p>
<p>代码参考:&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> setting.py</span>
<span style="color: rgba(0, 0, 0, 1)">
AppID </span>= <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">
AppSecret </span>= <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">
Token </span>= <span style="color: rgba(128, 0, 0, 1)">''</span>


<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> view.py</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> wx.view代码</span>

<span style="color: rgba(0, 0, 255, 1)">from</span> wechatpy.utils <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> check_signature
</span><span style="color: rgba(0, 0, 255, 1)">from</span> back <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> settings
</span><span style="color: rgba(0, 0, 255, 1)">from</span> wechatpy.exceptions <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> InvalidSignatureException
</span><span style="color: rgba(0, 0, 255, 1)">from</span> django.http <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> HttpResponse
</span><span style="color: rgba(0, 0, 255, 1)">from</span> wechatpy <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> parse_message, create_reply
</span><span style="color: rgba(0, 0, 255, 1)">from</span> wechatpy.replies <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> BaseReply
</span><span style="color: rgba(0, 0, 255, 1)">from</span> wechatpy <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> WeChatClient
</span><span style="color: rgba(0, 0, 255, 1)">from</span> wechatpy.oauth <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> WeChatOAuth
</span><span style="color: rgba(0, 0, 255, 1)">from</span> django.shortcuts <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> redirect

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> wx.wechat as wx_wechat


</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 连接微信公众号的方法</span>
<span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> serve(request):
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> GET 方式用于微信公众平台绑定验证</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> request.method == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
      signature </span>= request.GET.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">signature</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">)
      timestamp </span>= request.GET.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">timestamp</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">)
      nonce </span>= request.GET.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">nonce</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">)
      echo_str </span>= request.GET.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">echostr</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">)
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
            check_signature(settings.Token, signature, timestamp, nonce)
      </span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> InvalidSignatureException:
            echo_str </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">错误的请求</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
      response </span>=<span style="color: rgba(0, 0, 0, 1)"> HttpResponse(echo_str)
    </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:

      msg </span>=<span style="color: rgba(0, 0, 0, 1)"> parse_message(request.body)
      msg_dict </span>= msg.<span style="color: rgba(128, 0, 128, 1)">__dict__</span>[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_data</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]
      </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> print(msg.id, msg.source, msg.create_time, msg.type, msg.target, msg.time, msg.__dict__['_data']['Event'], '====')</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> msg.type == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">text</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
            </span><span style="color: rgba(0, 0, 255, 1)">pass</span>
      <span style="color: rgba(0, 0, 255, 1)">elif</span> msg.type == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">event</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> msg_dict[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Event</span><span style="color: rgba(128, 0, 0, 1)">'</span>] == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">subscribe</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
                  </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 关注后 将获取的用户的信息保存到数据库</span>
<span style="color: rgba(0, 0, 0, 1)">                wx_wechat.subscribe(getWxUserInfo(msg.source))
            </span><span style="color: rgba(0, 0, 255, 1)">elif</span> msg_dict[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Event</span><span style="color: rgba(128, 0, 0, 1)">'</span>] == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">unsubscribe</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
                  </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 取关后,将用户的关注状态更改为 未关注</span>
<span style="color: rgba(0, 0, 0, 1)">                wx_wechat.unsubscribe(msg.source)
      </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
            </span><span style="color: rgba(0, 0, 255, 1)">pass</span><span style="color: rgba(0, 0, 0, 1)">
      response </span>= HttpResponse(<span style="color: rgba(128, 0, 0, 1)">''</span>, content_type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">application/xml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> response


</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> getWxClient():
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> WeChatClient(settings.AppID, settings.AppSecret)


</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> getWxUserInfo(openid):
    wxClient </span>=<span style="color: rgba(0, 0, 0, 1)"> getWxClient()
    wxUserInfo </span>=<span style="color: rgba(0, 0, 0, 1)"> wxClient.user.get(openid)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> wxUserInfo


</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> getWeChatOAuth(redirect_url):
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> redirect_url = "需要跳转的域名: dayu1.net/home"</span>
    <span style="color: rgba(0, 0, 255, 1)">return</span> WeChatOAuth(settings.AppID, settings.AppSecret, redirect_url, scope=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">snsapi_userinfo </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 定义授权装饰器</span>
<span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> oauth(method):
    </span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> warpper(request):
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> request.session.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user_info</span><span style="color: rgba(128, 0, 0, 1)">'</span>, None) <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> None:
            code </span>= request.GET.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">code</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, None)
            wechat_oauth </span>=<span style="color: rgba(0, 0, 0, 1)"> getWeChatOAuth(request.get_raw_uri())
            url </span>=<span style="color: rgba(0, 0, 0, 1)"> wechat_oauth.authorize_url
            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> code:
                </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
                  wechat_oauth.fetch_access_token(code)
                  user_info </span>=<span style="color: rgba(0, 0, 0, 1)"> wechat_oauth.get_user_info()
                </span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> Exception as e:
                  </span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(str(e))
                  </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 这里需要处理请求里包含的 code 无效的情况</span>
                  <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> abort(403)</span>
                <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
                  request.session[</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user_info</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> user_info
            </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> redirect(url)

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> method(request)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> warpper

@oauth
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> get_wx_user_info(request):
    user_info </span>= request.session.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user_info</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> HttpResponse(str(user_info))



</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> url 配置</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> wx.url代码</span>
<span style="color: rgba(0, 0, 255, 1)">from</span> django.urls <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> path
</span><span style="color: rgba(0, 0, 255, 1)">from</span> . <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> views

urlpatterns </span>=<span style="color: rgba(0, 0, 0, 1)"> [
    path(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wechat/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, views.serve),

    path(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user/info</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, views.get_wx_user_info)
]</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/Mvloveyouforever/p/10918384.html
頁: [1]
查看完整版本: 微信公众号定制开发