def wechat(): signature = request.args.get('signature', '') timestamp = request.args.get('timestamp', '') nonce = request.args.get('nonce', '') encrypt_type = request.args.get('encrypt_type', 'raw') msg_signature = request.args.get('msg_signature', '') try: check_signature(TOKEN, signature, timestamp, nonce) except InvalidSignatureException: abort(403) if request.method == 'GET': echo_str = request.args.get('echostr', '') return echo_str # POST request if encrypt_type == 'raw': # plaintext mode msg = parse_message(request.data) replies.EmptyReply().render() reply = handler.handle_msg(msg, AppId, Secret) return reply.render() else: # encryption mode crypto = WeChatCrypto(TOKEN, EncodingAESKey, AppId) try: msg = crypto.decrypt_message(request.data, msg_signature, timestamp, nonce) except (InvalidSignatureException, InvalidAppIdException): abort(403) else: msg = parse_message(msg) reply = handler.handle_msg(msg, AppId, Secret) return crypto.encrypt_message(reply.render(), nonce, timestamp)
def test_send(self): """测试客服回复""" sender = "openid" message = messages.TextMessage(dict( FromUserName=sender, content="xyz" )) message = self._wrap_message(message) # 空消息转换 empty_msg = replies.EmptyReply() empty_str = "" self.assertIsNone(Reply.reply2send(empty_msg)[0]) self.assertIsNone(Reply.reply2send(empty_str)[0]) client = self.app.client.message # 文本消息转换 content = "test" msg_type = Reply.MsgType.TEXT reply = Reply(type=msg_type, content=content).reply(message) funcname, kwargs = Reply.reply2send(reply) self.assertTrue(hasattr(client, funcname)) self.assertEqual(funcname, "send_text") self.assertEqual(reply.content, kwargs["content"]) # 图片消息转换 media_id = "media_id" msg_type = Reply.MsgType.IMAGE reply = Reply(type=msg_type, media_id=media_id).reply(message) funcname, kwargs = Reply.reply2send(reply) self.assertTrue(hasattr(client, funcname)) self.assertEqual(funcname, "send_image") self.assertEqual(reply.media_id, kwargs["media_id"]) # 声音消息转换 msg_type = Reply.MsgType.VOICE reply = Reply(type=msg_type, media_id=media_id).reply(message) funcname, kwargs = Reply.reply2send(reply) self.assertTrue(hasattr(client, funcname)) self.assertEqual(funcname, "send_voice") self.assertEqual(reply.media_id, kwargs["media_id"]) # 视频消息转换 title = "title" description = "desc" msg_type = Reply.MsgType.VIDEO reply = Reply(type=msg_type, media_id=media_id, title=title, description=description).reply(message) funcname, kwargs = Reply.reply2send(reply) self.assertTrue(hasattr(client, funcname)) self.assertEqual(funcname, "send_video") self.assertEqual(reply.media_id, kwargs["media_id"]) self.assertEqual(reply.title, kwargs["title"]) self.assertEqual(reply.description, kwargs["description"]) # 选填字段 reply = Reply(type=msg_type, media_id=media_id).reply(message) funcname, kwargs = Reply.reply2send(reply) self.assertTrue(hasattr(client, funcname)) self.assertEqual(funcname, "send_video") self.assertEqual(reply.media_id, kwargs["media_id"]) self.assertIsNone(kwargs["title"]) self.assertIsNone(kwargs["description"]) # 音乐消息转换 music_url = "music_url" hq_music_url = "hq_music_url" msg_type = Reply.MsgType.MUSIC reply = Reply(type=msg_type, thumb_media_id=media_id, title=title, description=description, music_url=music_url, hq_music_url=hq_music_url).reply(message) funcname, kwargs = Reply.reply2send(reply) self.assertTrue(hasattr(client, funcname)) self.assertEqual(funcname, "send_music") self.assertEqual(reply.thumb_media_id, kwargs["thumb_media_id"]) self.assertEqual(reply.music_url, kwargs["url"]) self.assertEqual(reply.hq_music_url, kwargs["hq_url"]) self.assertEqual(reply.title, kwargs["title"]) self.assertEqual(reply.description, kwargs["description"]) # 选填字段 reply = Reply(type=msg_type, thumb_media_id=media_id).reply(message) funcname, kwargs = Reply.reply2send(reply) self.assertTrue(hasattr(client, funcname)) self.assertEqual(funcname, "send_music") self.assertEqual(reply.thumb_media_id, kwargs["thumb_media_id"]) self.assertIsNone(kwargs["url"]) self.assertIsNone(kwargs["hq_url"]) self.assertIsNone(kwargs["title"]) self.assertIsNone(kwargs["description"]) # 图文消息转换 pass # 确认消息发送 handler = self._create_handler(replies=dict( type=Reply.MsgType.TEXT, content=content )) def callback(url, request, response): data = json.loads(request.body.decode()) self.assertEqual(data["touser"], sender) self.assertEqual(data["msgtype"], Reply.MsgType.TEXT) self.assertEqual(data["text"]["content"], content) with wechatapi_accesstoken(), wechatapi("/cgi-bin/message/custom/send", dict( errcode=0 ), callback): handler.replies.all()[0].send(message)
def test_empty_reply_deserialize(self): reply = replies.EmptyReply() self._test_deserialize(reply)