• 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,用下面这个地址,在本地进行测试时,会返回给你这个数值,如下图

    这里说明验证成功。这里就可以将代码上传至服务器。然后在企业微信中点击设置,进行验证即可验证成功。

  • 相关阅读:
    使用python2 对服务器监控(监控内存,CPU,网卡流量等)
    centos7使用yum提示有事物未完成的解决办法:
    如何判断Linux下 网卡是虚拟还是物理网卡?
    python3监控系统资源最终版(获取CPU,内存,磁盘,网卡等信息),返回json格式。
    python3 系统监控脚本(2) (监控CPU,内存等信息)
    python3 系统监控脚本(CPU,memory,网络,disk等)
    获取Linux系统运行时间
    Linux之jq
    hadoop--presto安装部署
    docker 笔记--运行中的容器如何添加端口映射
  • 原文地址:https://www.cnblogs.com/ws17345067708/p/10522472.html
Copyright © 2020-2023  润新知