def interface(request): msg_signature = request.GET.get('msg_signature', '') signature = request.GET.get('signature', msg_signature) timestamp = request.GET.get('timestamp', '') nonce = request.GET.get('nonce', '') echostr = request.GET.get('echostr', '') crypto = WeChatCrypto(WECHAT_TOKEN, AES_KEY, APPID) if request.method == 'GET': signer = WeChatSigner() signer.add_data(WECHAT_TOKEN, timestamp, nonce) log.debug('>>> Signatrue:{},get:{},body:{}'.format( signer.signature, request.GET, request.body)) try: echostr = crypto.check_signature(signature, timestamp, nonce, echostr) except InvalidSignatureException as e: log.error('>>> SignatrueException:{},get:{},body:{}'.format( e, request.GET, request.body)) return HttpResponse('') return HttpResponse(echostr) # 处理POST请求 try: decrypted_xml = crypto.decrypt_message(request.body, msg_signature, timestamp, nonce) except (InvalidCorpIdException, InvalidSignatureException): # to-do: 处理异常或忽略 log.error('>>> Decrypt message exception,get:{},body:{}'.format( request.GET, request.body)) return HttpResponse('Decrypt message exception') xml = response_message(decrypted_xml, request) encrypted_xml = crypto.encrypt_message(xml, nonce, timestamp) response = HttpResponse(encrypted_xml, content_type="application/xml") return response
def sign(self, query): signer = WeChatSigner() signer.add_data( self.app.token, query["timestamp"], query["nonce"] ) return signer.signature
def test_wechat_card_signer(self): from wechatpy.utils import WeChatSigner signer = WeChatSigner() signer.add_data('789') signer.add_data('456') signer.add_data('123') signature = signer.signature self.assertEqual('f7c3bc1d808e04732adf679965ccc34ca7ae3441', signature)
def get_jsapi_signature(self, noncestr, ticket, timestamp, url): data = [ 'noncestr={noncestr}'.format(noncestr=noncestr), 'jsapi_ticket={ticket}'.format(ticket=ticket), 'timestamp={timestamp}'.format(timestamp=timestamp), 'url={url}'.format(url=url), ] signer = WeChatSigner(delimiter=b'&') signer.add_data(*data) return signer.signature
def get_jsapi_signature(self, noncestr, ticket, timestamp, url): """ 获取 JSAPI 签名 :param noncestr: nonce string :param ticket: JS-SDK ticket :param timestamp: 时间戳 :param url: URL :return: 签名 """ data = [ 'noncestr={noncestr}'.format(noncestr=noncestr), 'jsapi_ticket={ticket}'.format(ticket=ticket), 'timestamp={timestamp}'.format(timestamp=timestamp), 'url={url}'.format(url=url), ] signer = WeChatSigner(delimiter=b'&') signer.add_data(*data) return signer.signature
def get_jsapi_signature(self, noncestr, ticket, timestamp, url): """ 获取 JSAPI 签名 :param noncestr: nonce string :param ticket: JS-SDK ticket :param timestamp: 时间戳 :param url: URL :return: 签名 """ data = [ f"noncestr={noncestr}", f"jsapi_ticket={ticket}", f"timestamp={timestamp}", f"url={url}", ] signer = WeChatSigner(delimiter=b"&") signer.add_data(*data) return signer.signature
def get_jsapi_signature(self, noncestr, ticket, timestamp, url): """ 获取 JSAPI 签名 https://work.weixin.qq.com/api/doc#90001/90144/90539/签名算法/ :param noncestr: nonce string :param ticket: JS-SDK ticket :param timestamp: 时间戳 :param url: URL :return: 签名 """ data = [ "noncestr={noncestr}".format(noncestr=noncestr), "jsapi_ticket={ticket}".format(ticket=ticket), "timestamp={timestamp}".format(timestamp=timestamp), "url={url}".format(url=url), ] signer = WeChatSigner(delimiter=b"&") signer.add_data(*data) return signer.signature
def get_redirect_url(self, url, encrypt_code, card_id): """ 获取卡券跳转外链 """ from wechatpy.utils import WeChatSigner code = self.decrypt_code(encrypt_code) signer = WeChatSigner() signer.add_data(self.secret) signer.add_data(code) signer.add_data(card_id) signature = signer.signature return f"{url}?encrypt_code={encrypt_code}&card_id={card_id}&signature={signature}"
def test_wechat_card_signer(self): from wechatpy.utils import WeChatSigner signer = WeChatSigner() signer.add_data("789") signer.add_data("456") signer.add_data("123") signature = signer.signature self.assertEqual("f7c3bc1d808e04732adf679965ccc34ca7ae3441", signature)
def get_redirect_url(self, url, encrypt_code, card_id): """ 获取卡券跳转外链 """ from wechatpy.utils import WeChatSigner code = self.decrypt_code(encrypt_code) signer = WeChatSigner() signer.add_data(self.secret) signer.add_data(code) signer.add_data(card_id) signature = signer.signature r = "{url}?encrypt_code={code}&card_id={card_id}&signature={signature}" return r.format(url=url, code=encrypt_code, card_id=card_id, signature=signature)
def test_forward(self): """测试转发回复""" scheme = "http" netloc = "example.com" path = "/debug" url = "{scheme}://{netloc}{path}".format( scheme=scheme, netloc=netloc, path=path ) token = self.app.token timestamp = str(int(time.time())) nonce = "123456" query_data = dict( timestamp=timestamp, nonce=nonce ) signer = WeChatSigner() signer.add_data(token, timestamp, nonce) signature = signer.signature query_data["signature"] = signature sender = "openid" content = "xyz" xml = """<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[{sender}]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{content}]]></Content> <MsgId>1234567890123456</MsgId> </xml>""".format(sender=sender, content=content) req_url = url + "?" + urlencode(query_data) request = RequestFactory().post(req_url, xml, content_type="text/xml") with mock.patch.object(Handler, "_get_appname"): Handler._get_appname.return_value = self.app.name request = Handler().initialize_request(request) message = request.wechat reply_text = "abc" def reply_test(url, request): self.assertEqual(url.scheme, scheme) self.assertEqual(url.netloc, netloc) self.assertEqual(url.path, path) query = dict(parse_qsl(url.query)) self.assertEqual(query["timestamp"], timestamp) self.assertEqual(query["nonce"], nonce) self.assertEqual(query["signature"], signature) check_signature(self.app.token, query["signature"], timestamp, nonce) msg = parse_message(request.body) self.assertIsInstance(msg, messages.TextMessage) self.assertEqual(msg.source, sender) self.assertEqual(msg.content, content) reply = replies.create_reply(reply_text, msg) return response(content=reply.render()) handler = self._create_handler(replies=dict( type=Reply.MsgType.FORWARD, url=url )) with common_interceptor(reply_test): reply = handler.reply(message) self.assertIsInstance(reply, replies.TextReply) self.assertEqual(reply.content, reply_text) self.assertEqual(reply.target, sender) def bad_reply(url, request): return response(404) with common_interceptor(bad_reply): self.assertRaises(HTTPError, lambda: handler.reply(message))
def _get_signature(token, timestamp, nonce, encrypt): signer = WeChatSigner() signer.add_data(token, timestamp, nonce, encrypt) return signer.signature