Python Django對接企業微信第三方服務回調驗證的一些坑


今天公司老總,叫我把公司的企業微信,服務商管理后台中的本地應用進行回調驗證。

聽起來一臉懵逼,沒搞過企業微信對接情況。一頭霧水,不知道如何下手。

先講解一下,企業微信情況。

登錄到企業微信后,右上角服務商管理后台

之后點擊進入應用管理界面

選擇網頁應用,這里說下,創建應用的方法,自己去百度一下哈,如何創建我就不闡述了。這里配置回調URL,即是你網站的URL地址,

比如:https://xxxx.xxxx.com/weixin

 這里我用Django框架的公司網站進行回調驗證,如果沒有驗證回調成功,下面會有提示需要得到服務商的響應,才可以驗證成功。

 接下來講講如何實現,微信官方給了一個Python回調驗證的dome演示包,我們可以在這里下載https://work.weixin.qq.com/api/doc#90000/90138/90307/python%E5%BA%93

這里就有第一個大坑,本代碼使用了pycrypto這個包,這里用到一個叫crypto的東西,這個玩意3年前就不更新了。所以在網上找了一圈,怎么安裝

這里我先不說安裝方式,后面的博客中,繼續更新如何安裝這個坑爹的python包。

安裝好這個包后,你會發現,我們從微信官方下載的python代碼包,里面是用python2.7版本的,那么問題來了,這里我用的python3.6,納尼?

不兼容,怎么辦,先跑起來,遇到問題在說吧!

在你的Django中,添加如下ULR,這個URL需要匹配任意的請求地址。

這里我就不闡述用(.*)的意思了,就是匹配任意的URL

因為在做URL回調的時候,微信會給你發一個類似如下圖的,這樣一個URL,這個測試連接地址為:https://work.weixin.qq.com/api/devtools/devtool.php

如何使用這個測試連接。

 

 

按照如下內容進行填寫,企業CorpID自己找到后填寫正確。點擊檢查問題,就會有前面一張圖中所示的URL地址,這個地址就可以拿來進行本地測試。因為我是現在本地測試成后,才修改在官網上的!

拿着這個測試的URL,在你的Django上先進行URL匹配測試

我這里匹配到URL以后,返回頁面

說明你的URL匹配已經成功,接下來要做的就是如何解析RUL,把URL中的內容拆分出來。

在views.py中寫你的匹配的方法:

def weixin(request):
    if request.method == "POST":
        return HttpResponse("Weixin-NO")
    else:
        signature = request.GET.get('msg_signature', '')
        timestamp = request.GET.get('timestamp', '')
        nonce = request.GET.get('nonce', '')
        echo_str = request.GET.get('echostr', '')
        print(signature)
        print(timestamp)
        print(nonce)
        print(echo_str)
        return HttpResponse("Weixin-yes")

在這個請求中,獲取到如下數據

好的,現在數據獲取到以后,接下來需要進行URL拼接,加解密過程的驗證

這里說明一下,wxcpt.VerifyURL這個方法是演示demo中的

  • WXBizMsgCrypt.py文件封裝了WXBizMsgCrypt接口類,提供了用戶接入企業微信的三個接口,Sample.py文件提供了如何使用這三個接口的示例,ierror.py提供了錯誤碼。
  • WXBizMsgCrypt封裝了VerifyURL, DecryptMsg, EncryptMsg三個接口,分別用於開發者驗證接收消息的url、接收消息的解密以及開發者回復消息的加密過程。使用方法可以參考Sample.py文件。

 我們需要微信給我們的WXBizMsgCrypt.py文件

將這個文件放到與views.py同級目錄下,導入一下,方便調用。完整代碼如下

這需要幾個參數:

from django.http.response import HttpResponse
from wechatpy.exceptions import InvalidSignatureException
from userApp.WXBizMsgCrypt import WXBizMsgCrypt
#回調模式里面隨機生成的那個Token,EncodingAESKey
sCorpID = "這個ID是企業微信號的ID"
sToken = '這是應用回調URL下面的token'
sEncodingAESKey ="回調URL下面的EncodingAESKey"
wxcpt = WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID)
def weixin(request):
    if request.method == "POST": return HttpResponse("Weixin-NO") else: signature = request.GET.get('msg_signature', '') timestamp = request.GET.get('timestamp', '') nonce = request.GET.get('nonce', '') echo_str = request.GET.get('echostr', '') try: ret, sEchoStr = wxcpt.VerifyURL(signature, timestamp, nonce, echo_str) if (ret != 0): print("ERR: VerifyURL ret: " + str(ret)) except InvalidSignatureException: return HttpResponse("Weixin-NO") response = HttpResponse(sEchoStr, content_type="text/plain") return response

這里也可以選擇不捕獲這個異常。不寫這一步也可。

在python3.6下主要問題出現在下面這個方法調用中,前面說到微信官方給的版本是2.7我們要將官方給的事列代碼進行小改動。

ret, sEchoStr = wxcpt.VerifyURL(signature, timestamp, nonce, echo_str)

 下圖是官方包的導入

需要做些小改動,把沒有必要的東西刪除。下圖是我修改后的導入

之后修改微信官方給的方法,

1、找到如下方法,進行添加

2、講微信官方給的代碼,中所有的Exception,e 還有print 全部改成python3中的寫法

        except Exception,e:
            print e
#修改為
        except Exception as e:
            print (e)

#所有的print改為python3的寫法,print()

3、找到如下方法,修改

修改完成后,再次進行URL訪問

打印一下ret 的值,如果是0,那么說明修改成功。回調驗證正確。

在回調測試網站上進行測試

這里可以看到,我的EchoStr是21312,用下面這個地址,在本地進行測試時,會返回給你這個數值,如下圖

這里說明驗證成功。這里就可以將代碼上傳至服務器。然后在企業微信中點擊設置,進行驗證即可驗證成功。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM