微信开发者中心
申请到自己的公众号以及有了自己的服务器后,可以编写并配置自己的微信开发接口.
如果没有服务器,可以去搜索小米球,作为临时学习用。非常方便。
在django里面定义处理微信访问的视图
@csrf_exempt def wechatindex(request): wechatObj = wechatCallbackapiTest(request) if request.GET.get(\'echostr\',None): echostr = wechatObj.valid() return HttpResponse(echostr) else: #POST print(request.body) result = wechatObj.responseMsg() print(result) return HttpResponse(result)
微信访问的url都带有 timestamp, signature, nonce 等微信验证需要的参数
def _checkSignature(self): signature = self.request.GET[\'signature\'] timestamp = self.request.GET[\'timestamp\'] nonce = self.request.GET[\'nonce\'] list = [TOKEN,timestamp,nonce] list.sort() sha1 = hashlib.sha1() sha1.update(list[0].encode(\'utf-8\')) sha1.update(list[1].encode(\'utf-8\')) sha1.update(list[2].encode(\'utf-8\')) hashcode = sha1.hexdigest() print(\'hashcode:\' + hashcode) print(\'signature:\' + signature) if hashcode == signature: return True else: return False
def valid(self): echoStr = self.request.GET[\'echostr\'] if self._checkSignature(): return echoStr #验证成功的话,要返回 echoStr到微信公众平台 else: return \'\'
解析用户发送的消息。用户post的消息存在 request.body里面
def _parseMsg(self,xmlbody): \'\'\'解析用户发送的消息\'\'\' try: xmlData = ET.fromstring(xmlbody) msg ={} msg[\'ToUserName\'] = xmlData.find(\'ToUserName\').text msg[\'FromUserName\'] = xmlData.find(\'FromUserName\').text msg[\'CreateTime\'] = xmlData.find(\'CreateTime\').text msg[\'MsgType\'] = xmlData.find(\'MsgType\').text msg[\'MsgId\'] = xmlData.find(\'MsgId\').text if msg[\'MsgType\'] == \'text\': msg[\'Content\'] = xmlData.find(\'Content\').text elif msg[\'MsgType\'] == \'image\': msg[\'PicUrl\'] = xmlData.find(\'PicUrl\').text msg[\'MediaId\'] = xmlData.find(\'MediaId\').text elif msg[\'MsgType\'] == \'voice\': msg[\'MediaId\'] = xmlData.find(\'MediaId\').text msg[\'Format\'] = xmlData.find(\'Format\').text msg[\'Recognition\'] = xmlData.find(\'Recognition\').text elif msg[\'MsgType\'] == \'video\': msg[\'MediaId\'] = xmlData.find(\'MediaId\').text msg[\'ThumbMediaId\'] = xmlData.find(\'ThumbMediaId\').text elif msg[\'MsgType\'] == \'location\': msg[\'MediaId\'] = xmlData.find(\'MediaId\').text msg[\'Location_X\'] = xmlData.find(\'Location_X\').text # 地理位置消息 msg[\'Location_Y\'] = xmlData.find(\'Location_Y\').text msg[\'Scale\'] = xmlData.find(\'Scale\').text msg[\'Label\'] = xmlData.find(\'Label\').text elif msg[\'MsgType\'] == \'link\': msg[\'Title\'] = xmlData.find(\'Title\').text msg[\'Description\'] = xmlData.find(\'Description\').text msg[\'Url\'] = xmlData.find(\'Url\').text return msg except Exception as e: raise e
公众号回复用户消息的简单示例:
def responseMsg(self): if self.request.body !=\'\': postObj = self._parseMsg(self.request.body) keyword = postObj[\'Content\'] textTpl = \'\'\' <xml> <ToUserName><![CDATA[{0}]]></ToUserName> <FromUserName><![CDATA[{1}]]></FromUserName> <CreateTime>{2}</CreateTime> <MsgType><![CDATA[{3}]]></MsgType> <Content><![CDATA[{4}]]></Content> </xml> \'\'\' if keyword == \'?\' or keyword == \'?\': result = textTpl.format(postObj[\'FromUserName\'], postObj[\'ToUserName\'], int(time.time()), \'text\', time.strftime(\'%Y-%m-%d %H:%M:%S\', time.localtime()) ) return result else: return \'\'
版权声明:本文为ahMay原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。