今天公司老總,叫我把公司的企業微信,服務商管理后台中的本地應用進行回調驗證。
聽起來一臉懵逼,沒搞過企業微信對接情況。一頭霧水,不知道如何下手。
先講解一下,企業微信情況。
登錄到企業微信后,右上角服務商管理后台
之后點擊進入應用管理界面
選擇網頁應用,這里說下,創建應用的方法,自己去百度一下哈,如何創建我就不闡述了。這里配置回調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,用下面這個地址,在本地進行測試時,會返回給你這個數值,如下圖
這里說明驗證成功。這里就可以將代碼上傳至服務器。然后在企業微信中點擊設置,進行驗證即可驗證成功。