Пример #1
0
def test_config_attribute():
    robot = WeRoBot(enable_session=False)
    assert not robot.token
    token = generate_token()
    robot.config["TOKEN"] = token
    assert robot.token == token

    token = generate_token()
    robot.token = token
    assert robot.config["TOKEN"] == token
Пример #2
0
def test_prpcrypto():
    key = "ReUrr0NKeHkppBQq"

    assert len(key) == 16

    crypto = PrpCrypto(key)
    text = generate_token(32)
    app_id = generate_token(32)
    assert crypto.decrypt(crypto.encrypt(text, app_id),
                          app_id) == to_binary(text)
Пример #3
0
def test_config_attribute():
    robot = WeRoBot(SESSION_STORAGE=False)
    assert not robot.token
    token = generate_token()
    robot.config["TOKEN"] = token
    assert robot.token == token

    token = generate_token()
    robot.token = token
    assert robot.config["TOKEN"] == token
Пример #4
0
def test_prpcrypto():
    key = "ReUrr0NKeHkppBQq"

    assert len(key) == 16

    crypto = PrpCrypto(key)
    text = generate_token(32)
    app_id = generate_token(32)
    assert crypto.decrypt(crypto.encrypt(text, app_id),
                          app_id) == to_binary(text)
Пример #5
0
    def get_public_key(self, **kwargs):
        """
        获取企业支付PKCS 银行账户名,账户加密公钥
        """
        xml_data = """
            <xml>
            <mch_id>{mch_id}</mch_id>
            <nonce_str>{nonce_str}</nonce_str>
            <sign_type>{sign_type}</sign_type>
            <sign>{sign}</sign>
            </xml>
        """
        kwargs.update({
                "nonce_str": generate_token(),
                "mch_id": self.partner_id,
                "sign_type": "MD5"
            })

        sign, _ = get_sign(kwargs, sign_type="MD5", pay_sign_key=self.pay_sign_key)
        kwargs['sign'] = sign

        xml_data = xml_data.format(**kwargs)


        json = self.post(PUBLIC_KEY_URI, data=xml_data, cert=(APICLIENT_CERT, APICLIENT_KEY), verify=True)

        return_code = json.get('return_code')
        if return_code == 'SUCCESS':
            public_key = json.get("pub_key")
            # wirte public key to file
            with open(PUBLIC_PEM, 'w') as pem:
                pem.write(public_key)
        return json
Пример #6
0
    def get_transfer_info(self, **kwargs):
        """
        查询企业付款到零钱
        """
        xml_data = """
            <xml>
                 <sign><![CDATA[{sign}]]></sign>
                 <partner_trade_no><![CDATA[{partner_trade_no}]]></partner_trade_no>
                 <mch_id ><![CDATA[{mch_id}]]></mch_id >
                 <appid><![CDATA[{appid}]]></appid>
                 <nonce_str><![CDATA[{nonce_str}]]></nonce_str>
            </xml>
        """

        kwargs.update({
                "mch_id": self.partner_id,
                "appid": self.appid,
                "nonce_str": generate_token()
            })

        sign, _ = get_sign(kwargs, pay_sign_key=self.pay_sign_key)
        kwargs['sign'] = sign


        json = self.post(QUERY_TRANSFER_INFO_URI, data=xml_data, cert=(APICLIENT_CERT, APICLIENT_KEY), verify=True)
        return json
Пример #7
0
    def query_bank(self, **kwargs):
        """
        查询企业付款银行卡
        """
        xml_data = """
            <xml>
            <mch_id>{mch_id}</mch_id>
            <nonce_str>{nonce_str}</nonce_str>
            <partner_trade_no>{partner_trade_no}</partner_trade_no>
            <sign>{sign}</sign>
            </xml>
        """
        kwargs.update({
                "mch_id": self.partner_id,
                "nonce_str": generate_token(),
            })

        sign, _ = get_sign(kwargs, pay_sign_key=self.pay_sign_key)
        kwargs['sign'] = sign

        xml_data = xml_data.format(**kwargs)


        json = self.post(QUERY_BANK_URI, data=xml_data, cert=(APICLIENT_CERT, APICLIENT_KEY), verify=True)
        return json
Пример #8
0
    def create_js_edit_address_param(self, accesstoken, **params):
        """
        alpha
        暂时不建议使用
        这个接口使用起来十分不友好
        而且会引起巨大的误解

        url 需要带上 code 和 state (url?code=xxx&state=1)
        code 和state 是 oauth 时候回来的

        token 要传用户的 token

        这尼玛 你能相信这些支付接口都是腾讯出的?
        """
        params.update({
            'appId': self.appid,
            'nonceStr': generate_token(8),
            'timeStamp': int(time.time())
        })

        _params = [(k.lower(), str(v)) for k, v in params.items()]
        _params += [('accesstoken', accesstoken)]
        _params.sort()

        string1 = '&'.join(["%s=%s" % (p[0], p[1]) for p in _params])
        sign = sha1(string1).hexdigest()

        params = dict([(k, str(v)) for k, v in params.items()])

        params['addrSign'] = sign
        params['signType'] = 'sha1'
        params['scope'] = params.get('scope', 'jsapi_address')

        return params
Пример #9
0
def test_django():
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_test.settings")
    sys.path.append(
        os.path.join(
            os.path.abspath(os.path.dirname(__file__)), 'django_test_env'
        )
    )

    from django.test.utils import setup_test_environment
    setup_test_environment()
    from django.test.client import Client
    from werobot.parser import parse_xml, process_message
    import django

    django.setup()
    client = Client()

    token = 'TestDjango'
    timestamp = str(time.time())
    nonce = str(random.randint(0, 10000))
    signature = get_signature(token, timestamp, nonce)
    echostr = generate_token()

    response = client.get(
        '/robot/', {
            'signature': signature,
            'timestamp': timestamp,
            'nonce': nonce,
            'echostr': echostr
        }
    )
    assert response.status_code == 200
    assert response.content.decode('utf-8') == echostr

    xml = """
    <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1348831860</CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[this is a test]]></Content>
        <MsgId>1234567890123456</MsgId>
    </xml>"""
    params = "?timestamp=%s&nonce=%s&signature=%s" % \
             (timestamp, nonce, signature)
    url = '/robot/'
    response = client.post(url, data=xml, content_type="text/xml")

    assert response.status_code == 403
    assert response.content.decode('utf-8') == u'喵'

    url += params
    response = client.post(url, data=xml, content_type="text/xml")

    assert response.status_code == 200
    response = process_message(parse_xml(response.content))
    assert response.content == 'hello'

    response = client.options(url)
    assert response.status_code == 405
Пример #10
0
    def orderquery(self, **package):
        """
        订单查询
        返回订单支付状态
        """
        xml_data = """
            <xml>
            <appid>{appid}</appid>
            <mch_id>{mch_id}</mch_id>
            <nonce_str>{nonce_str}</nonce_str>
            <out_trade_no>{out_trade_no}</out_trade_no>
            <sign><![CDATA[{sign}]]></sign>
            </xml>
        """
        package.update({
            "appid": self.appid,
            "mch_id": self.partner_id,
            "nonce_str": generate_token(),
        })
        # 根据参与签名参数得到签名
        sign, _ = get_sign(package, pay_sign_key=self.pay_sign_key)
        package['sign'] = sign
        # 转换xml数据
        xml_data = xml_data.format(**package)

        json = self.post(ORDER_QUERY, data=xml_data)
        if json["return_code"] == "SUCCESS" and json['result_code'] == "SUCCESS":
            return json['trade_state'], json
        return 0, {}
Пример #11
0
    def get_line_scan_callback_xml(self, **kw):
        """
        组织线下支付回调返回prepay_id xml数据
        """
        xml_data = """<xml>
            <return_code>{return_code}</return_code>
            <result_code>{result_code}</result_code>
            <appid>{appid}</appid>
            <mch_id>{mch_id}</mch_id>
            <prepay_id><![CDATA[{prepay_id}]]></prepay_id>
            <nonce_str><![CDATA[{nonce_str}]]></nonce_str>
            <sign><![CDATA[{sign}]]></sign>
            </xml>
        """
        kw.update({
            "appid": self.appid,
            "mch_id": self.partner_id,
            "nonce_str": generate_token(),
        })
        # 根据参与签名参数得到签名
        sign, _ = get_sign(kw, pay_sign_key=self.pay_sign_key)
        kw['sign'] = sign
        # 转换xml数据
        xml_data = xml_data.format(**kw)
        

        return xml_data
Пример #12
0
 def get_prepay_id_by_unified_pay(self, **package):
     xml_data = """
         <xml>
         <appid>{appid}</appid>
         <body><![CDATA[{body}]]></body>
         <mch_id>{mch_id}</mch_id>
         <nonce_str>{nonce_str}</nonce_str>
         <notify_url>{notify_url}</notify_url>
         <openid>{openid}</openid>
         <out_trade_no>{out_trade_no}</out_trade_no>
         <spbill_create_ip>{spbill_create_ip}</spbill_create_ip>
         <total_fee>{total_fee}</total_fee>
         <trade_type>{trade_type}</trade_type>
         <sign><![CDATA[{sign}]]></sign>
         </xml>
     """
     package.update({
         "appid": self.appid,
         "mch_id": self.partner_id,
         "nonce_str": generate_token(),
     })
     # 根据参与签名参数得到签名
     sign, _ = get_sign(package, pay_sign_key=self.pay_sign_key)
     package['sign'] = sign
     # 转换xml数据
     xml_data = xml_data.format(**package)
     # 请求统一支付下单接口
     json = self.post(JSPAY_URI, data=xml_data)
     if json["return_code"] == "SUCCESS" and json["result_code"] == "SUCCESS":
         return json['prepay_id']
     return json
Пример #13
0
    def create_js_edit_address_param(self, accesstoken, **params):
        """
        alpha
        暂时不建议使用
        这个接口使用起来十分不友好
        而且会引起巨大的误解

        url 需要带上 code 和 state (url?code=xxx&state=1)
        code 和state 是 oauth 时候回来的

        token 要传用户的 token

        这尼玛 你能相信这些支付接口都是腾讯出的?
        """
        params.update({
            'appId': self.appid,
            'nonceStr': generate_token(8),
            'timeStamp': int(time.time())
        })

        _params = [(k.lower(), str(v))
                   for k, v in params.items()] + [('accesstoken', accesstoken)]
        _params.sort()

        string1 = '&'.join(["%s=%s" % (p[0], p[1]) for p in _params])
        sign = sha1(string1).hexdigest()

        params = dict([(k, str(v)) for k, v in params.items()])

        params['addrSign'] = sign
        params['signType'] = 'sha1'
        params['scope'] = params.get('scope', 'jsapi_address')

        return params
Пример #14
0
def test_django():
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_test.settings")
    sys.path.append(
        os.path.join(
            os.path.abspath(os.path.dirname(__file__)), 'django_test_env'
        )
    )

    from django.test.utils import setup_test_environment
    setup_test_environment()
    from django.test.client import Client
    from werobot.parser import parse_xml, process_message
    import django

    django.setup()
    client = Client()

    token = 'TestDjango'
    timestamp = str(time.time())
    nonce = str(random.randint(0, 10000))
    signature = get_signature(token, timestamp, nonce)
    echostr = generate_token()

    response = client.get(
        '/robot/', {
            'signature': signature,
            'timestamp': timestamp,
            'nonce': nonce,
            'echostr': echostr
        }
    )
    assert response.status_code == 200
    assert response.content.decode('utf-8') == echostr

    xml = """
    <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1348831860</CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[this is a test]]></Content>
        <MsgId>1234567890123456</MsgId>
    </xml>"""
    params = "?timestamp=%s&nonce=%s&signature=%s" % \
             (timestamp, nonce, signature)
    url = '/robot/'
    response = client.post(url, data=xml, content_type="text/xml")

    assert response.status_code == 403
    assert response.content.decode('utf-8') == u'喵'

    url += params
    response = client.post(url, data=xml, content_type="text/xml")

    assert response.status_code == 200
    response = process_message(parse_xml(response.content))
    assert response.content == 'hello'

    response = client.options(url)
    assert response.status_code == 405
Пример #15
0
def test_message_crypt():
    encoding_aes_key = generate_token(32) + generate_token(11)
    token = generate_token()
    timestamp = to_text(int(time.time()))
    nonce = generate_token(5)
    app_id = generate_token(18)
    crypt = MessageCrypt(token=token,
                         encoding_aes_key=encoding_aes_key,
                         app_id=app_id)

    message = crypt.encrypt_message('hello', timestamp, nonce)
    assert message is not None
    message = parse_xml(message)
    assert message is not None
    message = crypt.decrypt_message(message['TimeStamp'], message['Nonce'],
                                    message['MsgSignature'],
                                    message['Encrypt'])
    assert message == to_binary('hello')
Пример #16
0
    def pay_to_bank(self, **kwargs):
        """
        企业付款到银行卡
        kwargs['amount'] = 1
        kwargs['bank_code'] = 1002
        kwargs['bank_note'] = 'test'
        kwargs['desc'] = 'test'
        kwargs['bank_no'] = '6212261001014506692'
        kwargs['true_name'] = '向进'
        kwargs['partner_trade_no'] = str(self._now_time)
        """
        xml_data = """
            <xml>
            <amount>{amount}</amount>
            <bank_code>{bank_code}</bank_code>
            <bank_note>{bank_note}</bank_note>
            <desc>{desc}</desc>
            <enc_bank_no>{enc_bank_no}</enc_bank_no>
            <enc_true_name>{enc_true_name}</enc_true_name>
            <mch_id>{mch_id}</mch_id>
            <nonce_str>{nonce_str}</nonce_str>
            <partner_trade_no>{partner_trade_no}</partner_trade_no>
            <sign>{sign}</sign>
            </xml>
        """
        kwargs.update({
                "mch_id": self.partner_id,
                "nonce_str": generate_token(),
            })
        
        bank_no = kwargs.pop("bank_no", None)
        true_name = kwargs.pop("true_name", None)
        if not (bank_no and true_name):
            raise PayException("bank_no and true_name is required")

        # enc_bank_no, enc_true_name 加密
        enc_bank_no = self.signature(bank_no)
        enc_true_name = self.signature(true_name)

        kwargs['enc_bank_no'] = enc_bank_no
        kwargs['enc_true_name'] = enc_true_name

        sign, _ = get_sign(kwargs, pay_sign_key=self.pay_sign_key)
        kwargs['sign'] = sign
        logger.info("请求提现到银行卡的参数:{}".format(kwargs))
        xml_data = xml_data.format(**kwargs).encode("utf-8")


        json = self.post(PAY_BANK_URI, data=xml_data, cert=(APICLIENT_CERT, APICLIENT_KEY), verify=True)
        result_code = json.get("result_code")
        # SYSTEMERROR, INVALID_REQUEST 微信系统错误,需要使用原请求参数进行重试
        # if result_code in ("SYSTEMERROR", "INVALID_REQUEST"):
        #     del kwargs['sign']
        #     self.pay_to_bank(**kwargs)

        return json
Пример #17
0
def test_message_crypt():
    encoding_aes_key = generate_token(32) + generate_token(11)
    token = generate_token()
    timestamp = to_text(int(time.time()))
    nonce = generate_token(5)
    app_id = generate_token(18)
    crypt = MessageCrypt(
        token=token, encoding_aes_key=encoding_aes_key, app_id=app_id
    )

    message = crypt.encrypt_message('hello', timestamp, nonce)
    assert message is not None
    message = parse_xml(message)
    assert message is not None
    message = crypt.decrypt_message(
        message['TimeStamp'], message['Nonce'], message['MsgSignature'],
        message['Encrypt']
    )
    assert message == to_binary('hello')
Пример #18
0
def test_bottle(wsgi_tester, hello_robot):
    from werobot.contrib.bottle import make_view
    from bottle import Bottle

    token = generate_token()
    endpoint = '/werobot_bottle'

    hello_robot.token = token

    bottle_app = Bottle()
    bottle_app.route(endpoint, ['GET', 'POST'], make_view(hello_robot))

    wsgi_tester(bottle_app, token=token, endpoint=endpoint)
Пример #19
0
def test_bottle(wsgi_tester, hello_robot):
    from werobot.contrib.bottle import make_view
    from bottle import Bottle

    token = generate_token()
    endpoint = '/werobot_bottle'

    hello_robot.token = token

    bottle_app = Bottle()
    bottle_app.route(endpoint, ['GET', 'POST'], make_view(hello_robot))

    wsgi_tester(bottle_app, token=token, endpoint=endpoint)
Пример #20
0
def test_tornado(wsgi_tester, hello_robot):
    from tornado.wsgi import WSGIAdapter
    import tornado.web
    from werobot.contrib.tornado import make_handler

    token = generate_token()
    endpoint = r'/werobot_tornado'
    hello_robot.token = token

    tornado_app = tornado.web.Application([
        (endpoint, make_handler(hello_robot)),
    ], debug=True)
    wsgi_tester(WSGIAdapter(tornado_app), token=token, endpoint=endpoint)
Пример #21
0
    def promotion_transfers(self, **kwargs):
        """
        提现到零钱
        """
        xml_data = """
            <xml>
            <mch_appid>{mch_appid}</mch_appid>
            <mchid>{mchid}</mchid>
            <nonce_str>{nonce_str}</nonce_str>
            <partner_trade_no>{partner_trade_no}</partner_trade_no>
            <openid>{openid}</openid>
            <check_name>{check_name}</check_name>
            <re_user_name>{re_user_name}</re_user_name>
            <amount>{amount}</amount>
            <desc>{desc}</desc>
            <spbill_create_ip>{spbill_create_ip}</spbill_create_ip>
            <sign>{sign}</sign>
            </xml>
        """
        kwargs.update({
                "mch_appid": self.appid,
                "mchid": self.partner_id,
                "nonce_str": generate_token(),
            })

        # kwargs['partner_trade_no'] = str(self._now_time)
        # kwargs['openid'] = 'oANoEwGS99wH34zfu-dYaCzoV0cM'
        # kwargs['check_name'] = 'NO_CHECK'
        # kwargs['re_user_name'] = '向进'
        # kwargs['amount'] = 100
        # kwargs['desc'] = 'desc'
        # kwargs['spbill_create_ip'] = '139.227.252.215'

        sign, _ = get_sign(kwargs, pay_sign_key=self.pay_sign_key)
        kwargs['sign'] = sign

        logger.info("Wechat Pay Arguments: {}".format(kwargs))

        xml_data = xml_data.format(**kwargs).encode("utf-8")

        json = self.post(PROMOTION_TRANSFERS_URI, data=xml_data, cert=(APICLIENT_CERT, APICLIENT_KEY), verify=True)

        result_code = json.get("result_code")
        if result_code == "FAIL":
            err_code = json.get("err_code")
            if err_code in ("SYSTEMERROR", "INVALID_REQUEST"):
                # 使用原订单号请求
                del kwargs['sign']
                self.promotion_transfers(**kwargs)

        return json
Пример #22
0
def test_signature_checker():
    token = generate_token()

    robot = WeRoBot(token, SESSION_STORAGE=False)

    timestamp = str(int(time.time()))
    nonce = '12345678'

    sign = [token, timestamp, nonce]
    sign.sort()
    sign = ''.join(sign)
    sign = sign.encode()
    sign = hashlib.sha1(sign).hexdigest()

    assert robot.check_signature(timestamp, nonce, sign)
Пример #23
0
def test_signature_checker():
    token = generate_token()

    robot = WeRoBot(token, enable_session=False)

    timestamp = str(int(time.time()))
    nonce = "12345678"

    sign = [token, timestamp, nonce]
    sign.sort()
    sign = "".join(sign)
    if six.PY3:
        sign = sign.encode()
    sign = hashlib.sha1(sign).hexdigest()

    assert robot.check_signature(timestamp, nonce, sign)
Пример #24
0
def test_signature_checker():
    token = generate_token()

    robot = WeRoBot(token, SESSION_STORAGE=False)

    timestamp = str(int(time.time()))
    nonce = '12345678'

    sign = [token, timestamp, nonce]
    sign.sort()
    sign = ''.join(sign)
    if six.PY3:
        sign = sign.encode()
    sign = hashlib.sha1(sign).hexdigest()

    assert robot.check_signature(timestamp, nonce, sign)
Пример #25
0
 def get_line_url(self, **kw):
     """
     获取线下二维码url
     :return:
     """
     kw.update({
         "appid": self.appid,
         "mch_id": self.partner_id,
         "nonce_str": generate_token(),
         "time_stamp": self._now_time
     })
     # 根据参与签名参数得到签名
     sign, _ = get_sign(kw, pay_sign_key=self.pay_sign_key)
     kw['sign'] = sign
     url = self.line_url.format(**kw)
     return url
Пример #26
0
 def jsconfig(self, **kwargs):
     """
     得到jsconfig 配置信息
     """
     json = {
         "noncestr": generate_token(),
         "jsapi_ticket": self.jsticket,
         "timestamp": self._now_time,
         "url": kwargs.pop("url", JSPARAMS_URI)
     }
     # 根据参与签名参数得到签名
     sign_type = 'SHA1'
     sign, _ = get_sign(json, sign_type=sign_type, is_upper=False)
     json['sign'] = sign
     json["appid"] = self.appid
     return json, sign, sign_type
Пример #27
0
    def test_tornado(self):
        token = self.token
        timestamp = str(time.time())
        nonce = str(random.randint(0, 10000))
        signature = get_signature(token, timestamp, nonce)
        echostr = generate_token()

        params = "?timestamp=%s&nonce=%s&signature=%s&echostr=%s" % (
            timestamp, nonce, signature, echostr
        )

        response = self.fetch(path=self.endpoint + params)
        assert response.code == 200
        assert response.body.decode('utf-8') == echostr

        response = self.fetch(path=self.endpoint, )
        assert response.code == 403
        assert response.body.decode('utf-8') == u'喵'

        xml = """
        <xml>
            <ToUserName><![CDATA[toUser]]></ToUserName>
            <FromUserName><![CDATA[fromUser]]></FromUserName>
            <CreateTime>1348831860</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[this is a test]]></Content>
            <MsgId>1234567890123456</MsgId>
        </xml>"""

        response = self.fetch(
            path=self.endpoint + params,
            method='POST',
            body=xml,
            headers={'Content-Type': 'text/xml'}
        )
        self.assertEqual(response.code, 200)
        self.assertEqual(
            process_message(parse_xml(response.body)).content, 'hello'
        )

        response = self.fetch(
            path=self.endpoint,
            method='POST',
            body=xml,
            headers={'Content-Type': 'text/xml'}
        )
        self.assertEqual(response.code, 403)
Пример #28
0
        def test_tornado(self):
            token = self.token
            timestamp = str(time.time())
            nonce = str(random.randint(0, 10000))
            signature = get_signature(token, timestamp, nonce)
            echostr = generate_token()

            params = "?timestamp=%s&nonce=%s&signature=%s&echostr=%s" % (
                timestamp, nonce, signature, echostr
            )

            response = self.fetch(path=self.endpoint + params)
            assert response.code == 200
            assert response.body.decode('utf-8') == echostr

            response = self.fetch(path=self.endpoint, )
            assert response.code == 403
            assert response.body.decode('utf-8') == u'喵'

            xml = """
            <xml>
                <ToUserName><![CDATA[toUser]]></ToUserName>
                <FromUserName><![CDATA[fromUser]]></FromUserName>
                <CreateTime>1348831860</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[this is a test]]></Content>
                <MsgId>1234567890123456</MsgId>
            </xml>"""

            response = self.fetch(
                path=self.endpoint + params,
                method='POST',
                body=xml,
                headers={'Content-Type': 'text/xml'}
            )
            self.assertEqual(response.code, 200)
            self.assertEqual(
                process_message(parse_xml(response.body)).content, 'hello'
            )

            response = self.fetch(
                path=self.endpoint,
                method='POST',
                body=xml,
                headers={'Content-Type': 'text/xml'}
            )
            self.assertEqual(response.code, 403)
Пример #29
0
def test_flask(wsgi_tester, hello_robot):
    from flask import Flask
    from werobot.contrib.flask import make_view

    token = generate_token()
    endpoint = '/werobot_flask'

    hello_robot.token = token
    flask_app = Flask(__name__)
    flask_app.debug = True

    flask_app.add_url_rule(rule=endpoint,
                           endpoint='werobot',
                           view_func=make_view(hello_robot),
                           methods=['GET', 'POST'])

    wsgi_tester(flask_app, token=token, endpoint=endpoint)
Пример #30
0
    def tester(app, token, endpoint):
        test_app = webtest.TestApp(app)

        response = test_app.get(endpoint, expect_errors=True)
        assert response.status_code == 403

        timestamp = str(time.time())
        nonce = str(random.randint(0, 10000))
        signature = get_signature(token, timestamp, nonce)
        echostr = generate_token()

        params = "?timestamp=%s&nonce=%s&signature=%s&echostr=%s" % (
            timestamp, nonce, signature, echostr
        )
        response = test_app.get(endpoint + params)

        assert response.status_code == 200
        assert response.body.decode('utf-8') == echostr

        response = test_app.get(endpoint, expect_errors=True)

        assert response.status_code == 403
        assert response.body.decode('utf-8') == u'喵'

        xml = """
                <xml>
                    <ToUserName><![CDATA[toUser]]></ToUserName>
                    <FromUserName><![CDATA[fromUser]]></FromUserName>
                    <CreateTime>1348831860</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
                    <Content><![CDATA[this is a test]]></Content>
                    <MsgId>1234567890123456</MsgId>
                </xml>
                """
        with pytest.raises(AppError):
            # WebTest will raise an AppError
            # if the status_code is not >= 200 and < 400.
            test_app.post(endpoint, xml, content_type="text/xml")

        response = test_app.post(
            endpoint + params, xml, content_type="text/xml"
        )

        assert response.status_code == 200
        response = process_message(parse_xml(response.body))
        assert response.content == 'hello'
Пример #31
0
    def tester(app, token, endpoint):
        test_app = webtest.TestApp(app)

        response = test_app.get(endpoint, expect_errors=True)
        assert response.status_code == 403

        timestamp = str(time.time())
        nonce = str(random.randint(0, 10000))
        signature = get_signature(token, timestamp, nonce)
        echostr = generate_token()

        params = "?timestamp=%s&nonce=%s&signature=%s&echostr=%s" % (
            timestamp, nonce, signature, echostr
        )
        response = test_app.get(endpoint + params)

        assert response.status_code == 200
        assert response.body.decode('utf-8') == echostr

        response = test_app.get(endpoint, expect_errors=True)

        assert response.status_code == 403
        assert response.body.decode('utf-8') == u'喵'

        xml = """
                <xml>
                    <ToUserName><![CDATA[toUser]]></ToUserName>
                    <FromUserName><![CDATA[fromUser]]></FromUserName>
                    <CreateTime>1348831860</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
                    <Content><![CDATA[this is a test]]></Content>
                    <MsgId>1234567890123456</MsgId>
                </xml>
                """
        with pytest.raises(AppError):
            # WebTest will raise an AppError
            # if the status_code is not >= 200 and < 400.
            test_app.post(endpoint, xml, content_type="text/xml")

        response = test_app.post(
            endpoint + params, xml, content_type="text/xml"
        )

        assert response.status_code == 200
        response = process_message(parse_xml(response.body))
        assert response.content == 'hello'
Пример #32
0
    def wap_h5_pay(self, **kwargs):
        """
        H5支付
        """
        xml_data = """
            <xml>
            <appid>{appid}</appid>
            <body><![CDATA[{body}]]></body>
            <mch_id>{mch_id}</mch_id>
            <nonce_str>{nonce_str}</nonce_str>
            <notify_url>{notify_url}</notify_url>
            <out_trade_no>{out_trade_no}</out_trade_no>
            <spbill_create_ip>{spbill_create_ip}</spbill_create_ip>
            <total_fee>{total_fee}</total_fee>
            <trade_type>{trade_type}</trade_type>
            <scene_info>{scene_info}</scene_info>
            <sign><![CDATA[{sign}]]></sign>
            </xml>
        """
        wap_url = kwargs.pop("wap_url", "")
        wap_name = kwargs.pop("wap_name", "")
        scene_info = {
            "h5_info": {
                "type": "Wap",
                "wap_url": wap_url,
                "wap_name": wap_name
            }
        }
        kwargs['scene_info'] = json_pkg.dumps(scene_info)
        # 更新默认参与签名参数
        kwargs.update({
            "appid": self.appid,
            "mch_id": self.partner_id,
            "nonce_str": generate_token(),
            "trade_type": "MWEB"
        })
        logger.info("sign before kwargs: {}".format(kwargs))
        sign, _ = get_sign(kwargs, pay_sign_key=self.pay_sign_key)
        kwargs['sign'] = sign
        logger.info("sign after kwargs: {}".format(kwargs))
        xml_data = xml_data.format(**kwargs).encode("utf-8")

        json = self.post(JSPAY_URI, data=xml_data)
        logger.info("wechat response json data: {}".format(json))
        return json
Пример #33
0
 def js_pay_package(self, **kwargs):
     """
     chooseWXPay 参数
     timestamp: {{ wxpay.timestamp }}, // 参与签名key为timeStamp,必须与wxconfig中的时间戳一致
     nonceStr: '{{ wxpay.nonceStr }}', // 支付签名随机串,不长于 32 位
     package: '{{ wxpay.package }}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
     signType: '{{ wxpay.signType }}', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
     """
     # 更新默认参与签名参数
     kwargs.update({
         "appId": self.appid,
         "nonceStr": generate_token(),
         "signType": "MD5"
     })
     # 根据参与签名参数得到签名
     sign, _ = get_sign(kwargs, pay_sign_key=self.pay_sign_key)
     kwargs['paySign'] = sign
     return kwargs
Пример #34
0
def test_flask(wsgi_tester, hello_robot):
    from flask import Flask
    from werobot.contrib.flask import make_view

    token = generate_token()
    endpoint = '/werobot_flask'

    hello_robot.token = token
    flask_app = Flask(__name__)
    flask_app.debug = True

    flask_app.add_url_rule(
        rule=endpoint,
        endpoint='werobot',
        view_func=make_view(hello_robot),
        methods=['GET', 'POST']
    )

    wsgi_tester(flask_app, token=token, endpoint=endpoint)
Пример #35
0
    def encrypt_message(self, reply, timestamp=None, nonce=None):
        """
        加密微信回复
        :param reply: 加密前的回复
        :type reply: WeChatReply 或 XML 文本
        :return: 加密后的回复文本
        """
        if hasattr(reply, "render"):
            reply = reply.render()

        timestamp = timestamp or to_text(int(time.time()))
        nonce = nonce or generate_token(5)
        encrypt = to_text(self.prp_crypto.encrypt(reply, self.app_id))
        signature = get_signature(self.token, timestamp, nonce, encrypt)
        return to_text(
            self.ENCRYPTED_MESSAGE_XML.format(encrypt=encrypt,
                                              signature=signature,
                                              timestamp=timestamp,
                                              nonce=nonce))
Пример #36
0
    def encrypt_message(self, reply, timestamp=None, nonce=None):
        """
        加密微信回复
        :param reply: 加密前的回复
        :type reply: WeChatReply 或 XML 文本
        :return: 加密后的回复文本
        """
        if hasattr(reply, "render"):
            reply = reply.render()

        timestamp = timestamp or to_text(int(time.time()))
        nonce = nonce or generate_token(5)
        encrypt = to_text(self.prp_crypto.encrypt(reply, self.app_id))
        signature = get_signature(self.token, timestamp, nonce, encrypt)
        return to_text(self.ENCRYPTED_MESSAGE_XML.format(
            encrypt=encrypt,
            signature=signature,
            timestamp=timestamp,
            nonce=nonce
        ))
Пример #37
0
    def get_prepay_id_by_native_pay(self, **package):
        """
        扫码支付
        得到二维码code_url
        """
        xml_data = """
            <xml>
            <appid>{appid}</appid>
            <body><![CDATA[{body}]]></body>
            <mch_id>{mch_id}</mch_id>
            <nonce_str>{nonce_str}</nonce_str>
            <notify_url>{notify_url}</notify_url>
            <out_trade_no>{out_trade_no}</out_trade_no>
            <spbill_create_ip>{spbill_create_ip}</spbill_create_ip>
            <total_fee>{total_fee}</total_fee>
            <trade_type>{trade_type}</trade_type>
            <product_id>{product_id}</product_id>
            <sign><![CDATA[{sign}]]></sign>
            </xml>
        """
        package.update({
            "appid": self.appid,
            "mch_id": self.partner_id,
            "nonce_str": generate_token(),
        })
        # 根据参与签名参数得到签名
        sign, _ = get_sign(package, pay_sign_key=self.pay_sign_key)
        package['sign'] = sign
        # 转换xml数据
        xml_data = xml_data.format(**package)


        # 请求统一支付下单接口
        json = self.post(JSPAY_URI, data=xml_data.encode("utf-8").decode("latin1"))
        if json["return_code"] == "SUCCESS" and json['result_code'] == "SUCCESS":
            return json['prepay_id'], json['code_url']
        # 返回正常字符,后面需要拼接
        return "prepay_id", ""
Пример #38
0
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from werobot import WeRoBot
from werobot.contrib.django import make_view
from werobot.utils import generate_token

robot = WeRoBot(enable_session=False,
                token="TestDjango",
                app_id="9998877",
                encoding_aes_key=generate_token(32))


@robot.text
def text_handler():
    return 'hello'


@robot.error_page
def make_error_page(url):
    return '喵'


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^robot/', make_view(robot))
Пример #39
0
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from werobot import WeRoBot
from werobot.contrib.django import make_view
from werobot.utils import generate_token

robot = WeRoBot(
    SESSION_STORAGE=False,
    token="TestDjango",
    app_id="9998877",
    encoding_aes_key=generate_token(32)
)


@robot.text
def text_handler():
    return 'hello'


@robot.error_page
def make_error_page(url):
    return '喵'


urlpatterns = [
    url(r'^admin/', admin.site.urls),
Пример #40
0
def test_werobot_wsgi(wsgi_tester, hello_robot):
    token = generate_token()
    endpoint = r'/rand'
    hello_robot.token = token

    wsgi_tester(hello_robot.wsgi, token=token, endpoint=endpoint)
Пример #41
0
def test_werobot_wsgi(wsgi_tester, hello_robot):
    token = generate_token()
    endpoint = r'/rand'
    hello_robot.token = token

    wsgi_tester(hello_robot.wsgi, token=token, endpoint=endpoint)
Пример #42
0
 def get_random_string(self):
     """
     :return: 长度为16的随即字符串
     """
     return generate_token(16)
Пример #43
0
def test_make_error_page():
    rand_string = generate_token()
    content = make_error_page(rand_string)
    assert rand_string in content
Пример #44
0
 def get_random_string(self):
     """
     :return: 长度为16的随即字符串
     """
     return generate_token(16)
Пример #45
0
def test_token_generator():
    assert not check_token('AA C')
    assert check_token(generate_token())