示例#1
0
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
示例#3
0
    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)
示例#4
0
文件: jsapi.py 项目: iblogc/wechatpy
 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
示例#5
0
文件: jsapi.py 项目: 859162000/wlba
 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
示例#6
0
    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
示例#7
0
    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
示例#8
0
    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
示例#9
0
文件: jsapi.py 项目: myuanz/wechatpy
    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
示例#10
0
文件: card.py 项目: ferren/wechatpy
    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}"
示例#11
0
    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)
示例#12
0
    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)
示例#13
0
文件: card.py 项目: jxtech/wechatpy
    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)
示例#14
0
    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))
示例#15
0
def _get_signature(token, timestamp, nonce, encrypt):
    signer = WeChatSigner()
    signer.add_data(token, timestamp, nonce, encrypt)
    return signer.signature