微信企業號回調模式驗證與發送消息


最近放假閑着無聊,研究了一下微信企業號, 打算通過企業號做一個運維報警信息發送的功能,記錄自己的操作  

第一步

注冊企業號,網上一搜一大把的教程,這里略過  微信企業號登錄地址  https://qy.weixin.qq.com/

 

第二步  登錄后 點左側 應用中心 -新建應用  

 

第三步  在第二步第一圖中的自建應用下面找到剛剛新建的應用 拉到最下面有一個模式選擇,點擊回調模式 會看到下圖界面

 

Token 和EncodingAESKey 點擊隨機獲取即可,上面的url需要你有自己的服務地址  你的服務接口需要跟據微信規則對請求信息加解密,然后返回一個明文字符串,后面會上代碼   url先留空,等下服務弄好再回來填寫    ,此時微信端就設置完成  頁面不要關閉  

 

第四步  先上驗證url代碼  python版本實現  本人是java程序員,用python來搞這個也是一時興趣,用起來到是比java方便些

# -*- coding:utf-8 -*-
from SimpleHTTPServer  import SimpleHTTPRequestHandler
import httpserver
from SocketServer  import ThreadingMixIn
from SocketServer  import ThreadingTCPServer
import SocketServer
from SocketServer  import BaseRequestHandler
import urlparse
from WXBizMsgCrypt import WXBizMsgCrypt
import xml.etree.cElementTree as ET

hostIP = ''
portNum = 8080

serverMessage = "msg_signature"

sToken = "第三步中的token"
sEncodingAESKey = "第三步中的EncodingAESKey"
sCorpID = "這個是你的企業id 在企業號主頁面設置中賬號信息里有"


class mySoapServer(SimpleHTTPRequestHandler ):
    def do_head(self):
        pass

    def do_GET(self):
        try:
            if self.path.find(serverMessage) == -1:
                self.send_error(404, message=None)
                return

            # 解析請求
            result = urlparse.urlparse(self.path)
            params = urlparse.parse_qs(result.query,True)
            print params
            sVerifyMsgSig = params['msg_signature'][0]
            sVerifyTimeStamp =params['timestamp'][0]
            sVerifyNonce =params['nonce'][0]
            sVerifyEchoStr =  params['echostr'][0]

            wxcpt = WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID)
            ret, sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr)

            print "ret=",ret
            self.send_response(200, message=None)
            self.send_header('Content-type', 'text/html')
            self.end_headers()

            if ret == 0:
                res = sEchoStr.decode("utf8")
            else:
                res = "%s" % ret
            print  res
            self.wfile.write(res.encode(encoding='utf_8', errors='strict'))
        except IOError:
            self.send_error(404, message=None)


def GetQuery(str):
    params = str[str.index("?") + 1:]

    parsed_result = {}

    list = [param for param in params.split('&')]

    for item in list:
        if item.find("=") > -1:
            name = item[:item.index("=")]
            value = urlparse.urlparse(item[item.index("=") + 1:])
        else:
            name = item
            value = ""

        if name in parsed_result:
            parsed_result[name].append(value)
        else:
            parsed_result[name] = [value]

    return parsed_result  


class ThreadingHttpServer(ThreadingMixIn, ThreadingTCPServer):
    pass

myServer = ThreadingHttpServer((hostIP, portNum), mySoapServer)
print("Server Started ....")
myServer.serve_forever()
myServer.server_close()

把上面代碼保存為server.py     把代碼中的 sToken ,sEncodingAESKey sCorpID 換成你自己的,其它不用動  

在服務器上運行

python server.py 

  建議使用python2.6.*版本  其它版本未測試 不保證運行正常  

其中 WXBizMsgCrypt包為微信提供 下載地址 http://qydev.weixin.qq.com/download/python.zip
遇到問題執行
yum install python-devel.x86_64
pip install yum -y install gcc
pip install pycrypto

 

 第五步   返回第三步中填寫url       http://你的ip:8080  點擊驗證  不出意外驗證通過

當然,本人python小白到是出了很多意外,坑還比較多, 不過做的過程沒有記錄問題,只記下了最終正確的過程

 

 第六步  上面過程驗證通過后創建一個管理組,這里貌似至少有兩個人關注公眾號,因為管理組要求至少有一個非企業號創建人

添加好后應該就會拿到CorpID 和 Secret  這兩個記錄下來,之后發消息需要

 

第七步 發送消息  上代碼

#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-

import urllib
import urllib2
import json
import datetime

class WeiXinSendMsgClass(object):
    def __init__(self):
        self.access_token = get_token()
        self.to_user = ""
        self.to_party = ""
        self.to_tag = "2"
        self.msg_type = "text"
        self.agent_id = 1
        self.content = ""
        self.safe = 0

        self.data = {
            "touser": self.to_user,
            "toparty": self.to_party,
            "totag": self.to_tag,
            "msgtype": self.msg_type,
            "agentid": self.agent_id,
            "text": {
                "content": self.content
            },
            "safe": self.safe
        }

    def send(self, to_user, content):
        if to_user is not None and content is not None:
            self.data['touser'] = to_user
            self.data['text']['content'] = content
        else:
            print
            raise RuntimeError
        import requests
        import json

        url = "https://qyapi.weixin.qq.com/cgi-bin/message/send"
        querystring = {"access_token": self.access_token}

        payload = json.dumps(self.data, encoding='utf-8', ensure_ascii=False)

        headers = {
            'content-type': "application/json",
            'cache-control': "no-cache",
        }



        response = requests.request("POST", url, verify=False,data=payload, headers=headers, params=querystring)

        return_content = json.loads(response.content)
        if return_content["errcode"] == 0 and return_content["errmsg"] == "ok":
            print "Send successfully! %s " % return_content
        else:
            print "Send failed! %s " % return_content

def get_token():
    parameters = {
        "corpid": "上一步中記錄的CorpID",
        "corpsecret": "上一步記錄的Secret"
    }
    url_parameters = urllib.urlencode(parameters)
    token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?"
    url = token_url + url_parameters
    response = urllib2.urlopen(url)
    result = response.read()
    token_json = json.loads(result)
    token_json = token_json['access_token']
    return  token_json

上面代碼只需要把 corpid 和 corpsecret 換成自己的就可以了   保存為wx_sendMessage.py  

 

然后就可以在你需要發送消息的地方調用 啦   

# -*- coding:utf-8 -*-
import wx_sendMessage
msg = wx_sendMessage.WeiXinSendMsgClass()
msg.send("目標用戶賬號", "這里是發送的消息")

大功告成,到此為止已經可以完成對某一個關注企業號的用戶發送消息啦,可是還不夠,群發是必須滴

 

群組發送的話就再擴展一下send方法  再加一個參數totag  就是標簽id

可以在通訊錄新建標簽,然后把相應的人員加進去    見下圖   右側標簽id就是需要傳的參數值

 

修改如下,前后代碼省略

    def send(self, to_user, totag,content):
        if to_user is not None and content is not None:
            self.data['touser'] = to_user
            self.data['totag'] = totag
            self.data['text']['content'] = content
        else:
            print
            raise RuntimeError        

 

好啦,這篇文章到這里就結束 了,如果有同學們正好也在做着跟我同樣的事情並且看到我這篇文章的話,有不明白的話可以在文章下面留言,本人看到的話會及時回復的!!!

 


免責聲明!

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



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