Exemplo n.º 1
0
    def test_dataclasses_todict(self):
        a = 1
        b = random_string()
        c = {random_string(): random_string()}

        a1 = self.A(a=a, b=b, c=c)
        self.assertDictEqual(a1.dict(), {"a": a, "b": b, "c": c, "d": self.A.d})
Exemplo n.º 2
0
    def test_dataclasses_init(self):
        a = 1
        b = random_string()
        c = {random_string(): random_string()}

        a1 = self.A(a=a, b=b, c=c)
        self.assertEqual(a1.a, a)
        self.assertEqual(a1.b, b)
        self.assertEqual(a1.c, c)
        self.assertEqual(a1.d, self.A.d)
Exemplo n.º 3
0
    def test_unexpected_key(self):
        with warnings.catch_warnings(record=True) as w:
            warnings.simplefilter("always")
            random_key = random_string()

            self.A(a=2, b="asd", c={}, **{random_key: random_string()})
            self.assertEqual(f"Got an unexpected key {random_key}", str(w[-1].message))

        with warnings.catch_warnings(record=True) as w:
            warnings.simplefilter("always")
            random_key = random_string()

            a1 = self.A(a=2, b="asd", c={})
            setattr(a1, random_key, random_string())
            self.assertEqual(f"Got an unexpected key {random_key}", str(w[-1].message))
Exemplo n.º 4
0
    def _request(self, method, url_or_endpoint, **kwargs):
        if not url_or_endpoint.startswith(("http://", "https://")):
            api_base_url = kwargs.pop("api_base_url", self.API_BASE_URL)
            url = "{base}{endpoint}".format(base=api_base_url, endpoint=url_or_endpoint)
        else:
            url = url_or_endpoint

        if isinstance(kwargs.get("data", ""), dict):
            data = optionaldict(kwargs["data"])
            if "mchid" not in data:
                # F**k Tencent
                data.setdefault("mch_id", self.mch_id)
            data.setdefault("sub_mch_id", self.sub_mch_id)
            data.setdefault("nonce_str", random_string(32))
            sign = calculate_signature(data, self.api_key)
            body = dict_to_xml(data, sign)
            body = body.encode("utf-8")
            kwargs["data"] = body

        # 商户证书
        if self.mch_cert and self.mch_key:
            kwargs["cert"] = (self.mch_cert, self.mch_key)

        res = requests.request(method=method, url=url, **kwargs)
        try:
            res.raise_for_status()
        except requests.RequestException as reqe:
            raise WeChatPayException(return_code=None, client=self, request=reqe.request, response=reqe.response)

        return self._handle_result(res)
Exemplo n.º 5
0
    def get_subscribe_authorize_url(self, scene, template_id, redirect_url, reserved=None):
        """
        构造请求用户授权的url
        详情请参阅:
        https://mp.weixin.qq.com/wiki?id=mp1500374289_66bvB

        :param scene: 订阅场景值,开发者可以填0-10000的整形值,用来标识订阅场景值
        :type scene: int
        :param template_id: 订阅消息模板ID,登录公众平台后台,在接口权限列表处可查看订阅模板ID
        :param redirect_url: 授权后重定向的回调地址
        :param reserved: 用于保持请求和回调的状态,授权请后原样带回给第三方。该参数可用于防止csrf攻击。若不指定则随机生成。
        """
        if reserved is None:
            reserved = random_string()
        base_url = "https://mp.weixin.qq.com/mp/subscribemsg"
        params = [
            ("action", "get_confirm"),
            ("appid", self.appid),
            ("scene", scene),
            ("template_id", template_id),
            ("redirect_url", redirect_url),
            ("reserved", reserved),
        ]
        encoded_params = urlencode(params)
        return f"{base_url}?{encoded_params}#wechat_redirect"
Exemplo n.º 6
0
    def get_subscribe_authorize_url(self,
                                    scene,
                                    template_id,
                                    redirect_url,
                                    reserved=None):
        """
        构造请求用户授权的url
        详情请参阅:
        https://mp.weixin.qq.com/wiki?id=mp1500374289_66bvB

        :param scene: 订阅场景值,开发者可以填0-10000的整形值,用来标识订阅场景值
        :type scene: int
        :param template_id: 订阅消息模板ID,登录公众平台后台,在接口权限列表处可查看订阅模板ID
        :param redirect_url: 授权后重定向的回调地址
        :param reserved: 用于保持请求和回调的状态,授权请后原样带回给第三方。该参数可用于防止csrf攻击。若不指定则随机生成。
        """
        if reserved is None:
            reserved = random_string()
        base_url = 'https://mp.weixin.qq.com/mp/subscribemsg'
        params = [
            ('action', 'get_confirm'),
            ('appid', self.appid),
            ('scene', scene),
            ('template_id', template_id),
            ('redirect_url', redirect_url),
            ('reserved', reserved),
        ]
        encoded_params = urlencode(params)
        url = '{base}?{params}#wechat_redirect'.format(base=base_url,
                                                       params=encoded_params)
        return url
Exemplo n.º 7
0
    def get_jssdk_config(self, request, debug=None):
        import time
        from wechatpy.utils import random_string, to_text
        from wechatpy.client.api import WeChatJSAPI
        jsapi = WeChatJSAPI(self.get_wechat_client())
        ticket = jsapi.get_jsapi_ticket()
        nonce_str = random_string(32)
        timestamp = to_text(int(time.time()))
        url = request.META.get('HTTP_REFERER')
        signature = jsapi.get_jsapi_signature(nonce_str, ticket, timestamp,
                                              url)
        debug = bool(request.GET.get('debug')) if debug is None else debug

        return dict(
            debug=debug,
            appId=self.app_id,
            timestamp=timestamp,
            nonceStr=nonce_str,
            signature=signature,
            jsApiList=[
                'checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage',
                'onMenuShareQQ', 'onMenuShareWeibo', 'hideMenuItems',
                'showMenuItems', 'hideAllNonBaseMenuItem',
                'showAllNonBaseMenuItem', 'translateVoice', 'startRecord',
                'stopRecord', 'onRecordEnd', 'playVoice', 'pauseVoice',
                'stopVoice', 'uploadVoice', 'downloadVoice', 'chooseImage',
                'previewImage', 'uploadImage', 'downloadImage',
                'getNetworkType', 'openLocation', 'getLocation',
                'hideOptionMenu', 'showOptionMenu', 'closeWindow',
                'scanQRCode', 'chooseWXPay', 'openProductSpecificView',
                'addCard', 'chooseCard', 'openCard'
            ],
        )
Exemplo n.º 8
0
    def _request(self, method, url_or_endpoint, **kwargs):
        if not url_or_endpoint.startswith(('http://', 'https://')):
            api_base_url = kwargs.pop('api_base_url', self.API_BASE_URL)
            url = '{base}{endpoint}'.format(base=api_base_url,
                                            endpoint=url_or_endpoint)
        else:
            url = url_or_endpoint

        if isinstance(kwargs.get('data', ''), dict):
            data = optionaldict(kwargs['data'])
            if 'mchid' not in data:
                # F**k Tencent
                data.setdefault('mch_id', self.mch_id)
            data.setdefault('sub_mch_id', self.sub_mch_id)
            data.setdefault('nonce_str', random_string(32))
            sign = calculate_signature(data, self.api_key)
            body = dict_to_xml(data, sign)
            body = body.encode('utf-8')
            kwargs['data'] = body

        # 商户证书
        if self.mch_cert and self.mch_key:
            kwargs['cert'] = (self.mch_cert, self.mch_key)

        res = requests.request(method=method, url=url, **kwargs)
        try:
            res.raise_for_status()
        except requests.RequestException as reqe:
            raise WeChatPayException(return_code=None,
                                     client=self,
                                     request=reqe.request,
                                     response=reqe.response)

        return self._handle_result(res)
Exemplo n.º 9
0
    def get_jsapi_params(self, prepay_id, timestamp=None, nonce_str=None, jssdk=False):
        """
        获取 JSAPI 参数

        :param prepay_id: 统一下单接口返回的 prepay_id 参数值
        :param timestamp: 可选,时间戳,默认为当前时间戳
        :param nonce_str: 可选,随机字符串,默认自动生成
        :param jssdk: 前端调用方式,默认使用 WeixinJSBridge
                      使用 jssdk 调起支付的话,timestamp 的 s 为小写
                      使用 WeixinJSBridge 调起支付的话,timeStamp 的 S 为大写
        :return: 参数
        """
        data = {
            'appId': self.sub_appid or self.appid,
            'timeStamp': timestamp or to_text(int(time.time())),
            'nonceStr': nonce_str or random_string(32),
            'signType': 'MD5',
            'package': 'prepay_id={0}'.format(prepay_id),
        }
        sign = calculate_signature(
            data,
            self._client.api_key if not self._client.sandbox else self._client.sandbox_api_key
        )
        logger.debug('JSAPI payment parameters: data = %s, sign = %s', data, sign)
        data['paySign'] = sign
        if jssdk:
            data['timestamp'] = data.pop('timeStamp')
        return data
Exemplo n.º 10
0
    def get_subscribe_authorize_url(self, scene, template_id, redirect_url, reserved=None):
        """
        构造请求用户授权的url
        详情请参阅:
        https://mp.weixin.qq.com/wiki?id=mp1500374289_66bvB

        :param scene: 订阅场景值,开发者可以填0-10000的整形值,用来标识订阅场景值
        :type scene: int
        :param template_id: 订阅消息模板ID,登录公众平台后台,在接口权限列表处可查看订阅模板ID
        :param redirect_url: 授权后重定向的回调地址
        :param reserved: 用于保持请求和回调的状态,授权请后原样带回给第三方。该参数可用于防止csrf攻击。若不指定则随机生成。
        """
        if reserved is None:
            reserved = random_string()
        base_url = 'https://mp.weixin.qq.com/mp/subscribemsg'
        params = [
            ('action', 'get_confirm'),
            ('appid', self.appid),
            ('scene', scene),
            ('template_id', template_id),
            ('redirect_url', redirect_url),
            ('reserved', reserved),
        ]
        encoded_params = six.moves.urllib.parse.urlencode(params)
        url = '{base}?{params}#wechat_redirect'.format(base=base_url, params=encoded_params)
        return url
Exemplo n.º 11
0
    def get_jsapi_params(self, prepay_id, timestamp=None, nonce_str=None, jssdk=False):
        """
        获取 JSAPI 参数

        :param prepay_id: 统一下单接口返回的 prepay_id 参数值
        :param timestamp: 可选,时间戳,默认为当前时间戳
        :param nonce_str: 可选,随机字符串,默认自动生成
        :param jssdk: 前端调用方式,默认使用 WeixinJSBridge
                      使用 jssdk 调起支付的话,timestamp 的 s 为小写
                      使用 WeixinJSBridge 调起支付的话,timeStamp 的 S 为大写
        :return: 参数
        """
        data = {
            "appId": self.sub_appid or self.appid,
            "timeStamp": timestamp or to_text(int(time.time())),
            "nonceStr": nonce_str or random_string(32),
            "signType": "MD5",
            "package": f"prepay_id={prepay_id}",
        }
        sign = calculate_signature(
            data, self._client.api_key if not self._client.sandbox else self._client.sandbox_api_key,
        )
        logger.debug("JSAPI payment parameters: data = %s, sign = %s", data, sign)
        data["paySign"] = sign
        if jssdk:
            data["timestamp"] = data.pop("timeStamp")
        return data
Exemplo n.º 12
0
 def _fetch_sandbox_api_key(self):
     nonce_str = random_string(32)
     sign = calculate_signature({"mch_id": self.mch_id, "nonce_str": nonce_str}, self.api_key)
     payload = dict_to_xml({"mch_id": self.mch_id, "nonce_str": nonce_str,}, sign=sign)
     headers = {"Content-Type": "text/xml"}
     api_url = f"{self.API_BASE_URL}sandboxnew/pay/getsignkey"
     response = self._http.post(api_url, data=payload, headers=headers)
     return xmltodict.parse(response.text)["xml"].get("sandbox_signkey")
Exemplo n.º 13
0
 def get_jsapi_ticket(self, url):
     us_client = self.wechatpy_client
     jsapi = WeChatJSAPI(us_client)
     tick = jsapi.get_jsapi_ticket()
     noncestr = random_string()
     timestamp = str(int(time.time()))
     signature = jsapi.get_jsapi_signature(noncestr, tick, timestamp, url)
     return self.wx_appid, timestamp, noncestr, signature
Exemplo n.º 14
0
def upload_again(request):
    print("开始重新上传")
    user = request.session["user"]
    if request.method == "POST":
        punch_id = request.POST.get("punch_id")
        base_64 = request.POST.get("base_64")
        goal_id = request.POST.get('goal', ' ')
        # mediaid = request.POST.get('serverId', ' ')
        document = request.POST.get("document", " ")
        distance = request.POST.get("distance", " ")
        # apiLink = mediaApiClient.get_url(mediaid)
        # response = requests.get(apiLink)
        # user_wechat_id = user.wechat_id
        # User 名字加随机字符串
        fileName = user.wechat_id + "_" + "{}".format(
            user.user_id) + "_" + random_string(16) + ".jpg"
        # 文件存储的实际路径
        filePath = os.path.join(settings.MEDIA_DIR,
                                timezone.now().strftime("%Y-%m-%d") + "/")
        # 引用所使用的路径
        refPath = os.path.join(settings.MEDIA_ROOT,
                               timezone.now().strftime("%Y-%m-%d") + "/")
        bash_str = "".join(base_64).split(",")[1]
        imgdata = base64.b64decode(bash_str)
        file_filepath = filePath + fileName
        print('原本的文件路径', file_filepath)
        file_refpath = refPath + fileName
        print("引用文件的路径", file_refpath)
        # 写入文件内容
        with open(filePath + fileName, 'wb') as f:
            f.write(imgdata)
        record = RunningPunchRecord.objects.get(punch_id=punch_id)
        record.reload += 1
        record.voucher_ref = file_refpath
        record.document = document
        record.voucher_store = file_filepath
        record.record_time = timezone.now()
        record.save()
        print("重新上传成功")
        goal = RunningGoal.objects.get(user_id=user.user_id)
        # 自由模式剩余距离
        left_distance = goal.left_distance
        if goal.goal_type == 0:
            # 重写之前还剩下的距离
            killo = record.distance + left_distance
            # 重写累计距离
            goal.add_distance = float(goal.add_distance) - float(
                record.distance) + float(distance)
            goal.left_distance = float(killo) - float(distance)
            goal.save()
            record.distance = distance
            record.save()
        else:
            print("success")
        # record.save()
        return JsonResponse({'status': 201})
    else:
        return HttpResponseNotFound
Exemplo n.º 15
0
    def get_jsapi_add_card_params(
        self,
        card_id: str,
        code: str = "",
        openid: str = "",
        fixed_begintimestamp: int = 0,
        outer_str: str = "",
        nonce_str: str = "",
        timestamp: int = 0,
        card_ticket: str = "",
    ) -> JsapiCardExt:
        """
        用于生成 jsapi 批量添加卡券接口的 cardList 参数中的 cardExt 参数
        参数意义见微信文档地址:
            https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#65 和
            https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/WeChat_Coupon_Interface.html#4
        :param card_id: 卡券ID. 一个卡券ID对应一类卡券, 包含了相应库存数量的Code码.
        :param code: 卡券Code码. 一张卡券的唯一标识, 核销卡券时使用此串码, 支持商户自定义.
        :param openid: 用户在该公众号下的唯一身份.
        :param fixed_begintimestamp: 卡券在第三方系统的实际领取时间, 为东八区时间戳 (UTC+8,精确到秒) . 当卡券的有效期类型为
                                     DATE_TYPE_FIX_TERM 时专用, 标识卡券的实际生效时间,
                                     用于解决商户系统内起始时间和领取时间不同步的问题.
        :param outer_str: 领取渠道参数, 用于标识本次领取的渠道值.  支持商户自定义场景值填入card_ext进行卡券投放,
                          当用户领取时会将相应场景值通过事件通知商户.
        :param nonce_str: 随机字符串, 由开发者设置传入, 加强安全性 (若不填写可能被重放请求).
        :param timestamp: unix 时间戳, 不同添加请求的时间戳须动态生成, 若重复将会导致领取失败.
        :param card_ticket: 用于卡券的微信 api_ticket

        :return: 卡券的附加信息 card_ext 的 dict
        """
        nonce_str = nonce_str or random_string()
        timestamp = timestamp or int(time.time())
        card_ticket = card_ticket or self.get_jsapi_card_ticket()

        card_signature_dict = {
            "nonce_str": nonce_str,
            "api_ticket": card_ticket,
            "timestamp": str(timestamp),
            "code": code,
            "openid": openid,
            "card_id": card_id,
        }
        list_before_sign = sorted(
            [str(x) for x in card_signature_dict.values()])
        str_to_sign = "".join(list_before_sign).encode()
        print(str_to_sign)
        card_ext = JsapiCardExt(
            code=code,
            openid=openid,
            timestamp=str(timestamp),
            fixed_begintimestamp=fixed_begintimestamp,
            outer_str=outer_str,
            nonce_str=nonce_str,
            signature=hashlib.sha1(str_to_sign).hexdigest(),
        )

        return card_ext
Exemplo n.º 16
0
    def get_jssdk_config(self, request, debug=None):
        import time
        from wechatpy.utils import random_string, to_text
        from wechatpy.client.api import WeChatJSAPI
        jsapi = WeChatJSAPI(self.get_wechat_client())
        ticket = jsapi.get_jsapi_ticket()
        nonce_str = random_string(32)
        timestamp = to_text(int(time.time()))
        url = request.META.get('HTTP_REFERER')
        signature = jsapi.get_jsapi_signature(nonce_str, ticket, timestamp, url)
        debug = bool(request.GET.get('debug')) if debug is None else debug

        return dict(
            debug=debug,
            appId=self.app_id,
            timestamp=timestamp,
            nonceStr=nonce_str,
            signature=signature,
            jsApiList=[
                'checkJsApi',
                'onMenuShareTimeline',
                'onMenuShareAppMessage',
                'onMenuShareQQ',
                'onMenuShareWeibo',
                'hideMenuItems',
                'showMenuItems',
                'hideAllNonBaseMenuItem',
                'showAllNonBaseMenuItem',
                'translateVoice',
                'startRecord',
                'stopRecord',
                'onRecordEnd',
                'playVoice',
                'pauseVoice',
                'stopVoice',
                'uploadVoice',
                'downloadVoice',
                'chooseImage',
                'previewImage',
                'uploadImage',
                'downloadImage',
                'getNetworkType',
                'openLocation',
                'getLocation',
                'hideOptionMenu',
                'showOptionMenu',
                'closeWindow',
                'scanQRCode',
                'chooseWXPay',
                'openProductSpecificView',
                'addCard',
                'chooseCard',
                'openCard'
            ],
        )
Exemplo n.º 17
0
 def get_jsapi_params(self, prepay_id):
     """ 返回 jsapi 的付款对象 """
     import time
     from wechatpy.pay import api
     from wechatpy.utils import random_string, to_text
     jsapi = api.WeChatJSAPI(self.wechat_pay())
     return jsapi.get_jsapi_params(
         prepay_id=prepay_id,
         nonce_str=random_string(32),
         timestamp=to_text(int(time.time())),
     )
Exemplo n.º 18
0
 def _fetch_sanbox_api_key(self):
     nonce_str = random_string(32)
     sign = calculate_signature({'mch_id': self.mch_id, 'nonce_str': nonce_str}, self.api_key)
     payload = dict_to_xml({
         'mch_id': self.mch_id,
         'nonce_str': nonce_str,
     }, sign=sign)
     headers = {'Content-Type': 'text/xml'}
     api_url = '{base}sandboxnew/pay/getsignkey'.format(base=self.API_BASE_URL)
     response = self._http.post(api_url, data=payload, headers=headers)
     return xmltodict.parse(response.text)['xml'].get('sandbox_signkey')
Exemplo n.º 19
0
 def get_jsapi_params(self, prepay_id):
     """ 返回 jsapi 的付款对象 """
     import time
     from wechatpy.pay import api
     from wechatpy.utils import random_string, to_text
     jsapi = api.WeChatJSAPI(self.wechat_pay())
     return jsapi.get_jsapi_params(
         prepay_id=prepay_id,
         nonce_str=random_string(32),
         timestamp=to_text(int(time.time())),
     )
Exemplo n.º 20
0
    def get_context_data(self, **kwargs):
        ctx = super(IndexView, self).get_context_data(**kwargs)
        timestamp = time.time()
        nonce_str = random_string(32)
        ticket = wechat_client.jsapi.get_jsapi_ticket()

        ctx['appId'] = settings.WX_APPID
        ctx['nonce_str'] = nonce_str
        ctx['timestamp'] = timestamp
        ctx['signature'] = wechat_client.jsapi.get_jsapi_signature(
            nonce_str, ticket, timestamp, self.request.build_absolute_uri())
        return ctx
Exemplo n.º 21
0
    def _request(self, method, url_or_endpoint, **kwargs):
        if not url_or_endpoint.startswith(('http://', 'https://')):
            api_base_url = kwargs.pop('api_base_url', self.API_BASE_URL)
            if self.sandbox:
                api_base_url = '{url}sandboxnew/'.format(url=api_base_url)
            url = '{base}{endpoint}'.format(
                base=api_base_url,
                endpoint=url_or_endpoint
            )
        else:
            url = url_or_endpoint

        if isinstance(kwargs.get('data', ''), dict):
            data = kwargs['data']
            if 'mchid' not in data:
                # F**k Tencent
                data.setdefault('mch_id', self.mch_id)
            data.setdefault('sub_mch_id', self.sub_mch_id)
            data.setdefault('nonce_str', random_string(32))
            data = optionaldict(data)

            if data.get('sign_type', 'MD5') == 'HMAC-SHA256':
                sign = calculate_signature_hmac(data, self.sandbox_api_key if self.sandbox else self.api_key)
            else:
                sign = calculate_signature(data, self.sandbox_api_key if self.sandbox else self.api_key)
            body = dict_to_xml(data, sign)
            body = body.encode('utf-8')
            kwargs['data'] = body

        # 商户证书
        if self.mch_cert and self.mch_key:
            kwargs['cert'] = (self.mch_cert, self.mch_key)

        kwargs['timeout'] = kwargs.get('timeout', self.timeout)
        logger.debug('Request to WeChat API: %s %s\n%s', method, url, kwargs)
        res = self._http.request(
            method=method,
            url=url,
            **kwargs
        )
        try:
            res.raise_for_status()
        except requests.RequestException as reqe:
            raise WeChatPayException(
                return_code=None,
                client=self,
                request=reqe.request,
                response=reqe.response
            )

        return self._handle_result(res)
Exemplo n.º 22
0
    def _request(self, method, url_or_endpoint, **kwargs):
        if not url_or_endpoint.startswith(('http://', 'https://')):
            api_base_url = kwargs.pop('api_base_url', self.API_BASE_URL)
            if self.sandbox:
                api_base_url = '{url}sandboxnew/'.format(url=api_base_url)
            url = '{base}{endpoint}'.format(
                base=api_base_url,
                endpoint=url_or_endpoint
            )
        else:
            url = url_or_endpoint

        if isinstance(kwargs.get('data', ''), dict):
            data = kwargs['data']
            if 'mchid' not in data:
                # F**k Tencent
                data.setdefault('mch_id', self.mch_id)
            data.setdefault('sub_mch_id', self.sub_mch_id)
            data.setdefault('nonce_str', random_string(32))
            data = optionaldict(data)

            if data.get('sign_type', 'MD5') == 'HMAC-SHA256':
                sign = calculate_signature_hmac(data, self.sandbox_api_key if self.sandbox else self.api_key)
            else:
                sign = calculate_signature(data, self.sandbox_api_key if self.sandbox else self.api_key)
            body = dict_to_xml(data, sign)
            body = body.encode('utf-8')
            kwargs['data'] = body

        # 商户证书
        if self.mch_cert and self.mch_key:
            kwargs['cert'] = (self.mch_cert, self.mch_key)

        kwargs['timeout'] = kwargs.get('timeout', self.timeout)
        logger.debug('Request to WeChat API: %s %s\n%s', method, url, kwargs)
        res = self._http.request(
            method=method,
            url=url,
            **kwargs
        )
        try:
            res.raise_for_status()
        except requests.RequestException as reqe:
            raise WeChatPayException(
                return_code=None,
                client=self,
                request=reqe.request,
                response=reqe.response
            )

        return self._handle_result(res)
Exemplo n.º 23
0
    def _request(self, method, url_or_endpoint, **kwargs):
        http_client = AsyncHTTPClient()
        if not url_or_endpoint.startswith(('http://', 'https://')):
            api_base_url = kwargs.pop('api_base_url', self.API_BASE_URL)
            url = '{base}{endpoint}'.format(
                base=api_base_url,
                endpoint=url_or_endpoint
            )
        else:
            url = url_or_endpoint

        headers = {}
        params = kwargs.pop('params', {})

        params = urlencode(dict((k, to_binary(v)) for k, v in params.items()))
        url = '{0}?{1}'.format(url, params)
        
        data = kwargs.get('data')
        if isinstance(data, dict):
            data = optionaldict(data)
            if 'mchid' not in data:
                # F**k Tencent
                data.setdefault('mch_id', self.mch_id)
            data.setdefault('sub_mch_id', self.sub_mch_id)
            data.setdefault('nonce_str', random_string(32))
            sign = calculate_signature(data, self.api_key)
            body = dict_to_xml(data, sign)
            body = body.encode('utf-8')
        else:
            body = data

        req = HTTPRequest(
            url=url,
            method=method.upper(),
            headers=headers,
            body=body
        )
        res = yield http_client.fetch(req)
        if res.error is not None:
            raise WeChatClientException(
                errcode=None,
                errmsg=None,
                client=self,
                request=req,
                response=res
            )

        result = self._handle_result(res)
        raise Return(result)
Exemplo n.º 24
0
    def _request(self, method, url_or_endpoint, **kwargs):
        if not url_or_endpoint.startswith(("http://", "https://")):
            api_base_url = kwargs.pop("api_base_url", self.API_BASE_URL)
            if self.sandbox:
                api_base_url = "{url}sandboxnew/".format(url=api_base_url)
            url = "{base}{endpoint}".format(base=api_base_url,
                                            endpoint=url_or_endpoint)
        else:
            url = url_or_endpoint

        if isinstance(kwargs.get("data", ""), dict):
            data = kwargs["data"]
            if "mchid" not in data:
                # F**k Tencent
                data.setdefault("mch_id", self.mch_id)
            data.setdefault("sub_mch_id", self.sub_mch_id)
            data.setdefault("nonce_str", random_string(32))
            data = optionaldict(data)

            if data.get("sign_type", "MD5") == "HMAC-SHA256":
                sign = calculate_signature_hmac(
                    data,
                    self.sandbox_api_key if self.sandbox else self.api_key)
            else:
                sign = calculate_signature(
                    data,
                    self.sandbox_api_key if self.sandbox else self.api_key)
            body = dict_to_xml(data, sign)
            body = body.encode("utf-8")
            kwargs["data"] = body

        # 商户证书
        if self.mch_cert and self.mch_key:
            kwargs["cert"] = (self.mch_cert, self.mch_key)

        kwargs["timeout"] = kwargs.get("timeout", self.timeout)
        logger.debug("Request to WeChat API: %s %s\n%s", method, url, kwargs)
        res = self._http.request(method=method, url=url, **kwargs)
        try:
            res.raise_for_status()
        except requests.RequestException as reqe:
            raise WeChatPayException(
                return_code=None,
                client=self,
                request=reqe.request,
                response=reqe.response,
            )

        return self._handle_result(res)
Exemplo n.º 25
0
async def jssdk_config(request):
    url = request.headers.get("referer")
    ticket = client.jsapi.get_jsapi_ticket()
    timestamp = int(time.time())
    nonce_str = random_string()
    signature = client.jsapi.get_jsapi_signature(nonce_str, ticket, timestamp,
                                                 url)

    return json({
        "appid": appid,
        "timestamp": timestamp,
        "noncestr": nonce_str,
        "signature": signature,
        "url": url
    })
Exemplo n.º 26
0
    def get_context_data(self, **kwargs):
        ctx = super(IndexView, self).get_context_data(**kwargs)
        timestamp = time.time()
        nonce_str = random_string(32)
        ticket = wechat_client.jsapi.get_jsapi_ticket()

        ctx['appId'] = settings.WX_APPID
        ctx['nonce_str'] = nonce_str
        ctx['timestamp'] = timestamp
        ctx['signature'] = wechat_client.jsapi.get_jsapi_signature(
            nonce_str, ticket, timestamp, self.request.build_absolute_uri())

        ctx['EOS_ACCOUNT'] = EOS_ACCOUNT
        ctx['eosram_profile'] = Profile.objects.filter(
            owner_id=self.request.user.pk).first()
        return ctx
Exemplo n.º 27
0
    def get_jsapi_signature(self, prepay_id, timestamp=None, nonce_str=None):
        """
        获取 JSAPI 签名

        :param prepay_id: 统一下单接口返回的 prepay_id 参数值
        :param timestamp: 可选,时间戳,默认为当前时间戳
        :param nonce_str: 可选,随机字符串,默认自动生成
        :return: 签名
        """
        data = {
            'appId': self.appid,
            'timeStamp': timestamp or to_text(int(time.time())),
            'nonceStr': nonce_str or random_string(32),
            'signType': 'MD5',
            'package': 'prepay_id={0}'.format(prepay_id),
        }
        return calculate_signature(data, self._client.api_key)
Exemplo n.º 28
0
def jsapi_signature(request):
    noncestr = random_string()
    timestamp = int(time.time())
    url = request.POST['url']

    client = WeChatClient(settings.WECHAT_APPID, settings.WECHAT_SECRET)
    ticket_response = client.jsapi.get_ticket()
    signature = client.jsapi.get_jsapi_signature(noncestr,
                                                 ticket_response['ticket'],
                                                 timestamp, url)
    ret_dict = {
        'noncestr': noncestr,
        'timestamp': timestamp,
        'url': url,
        'signature': signature,
    }
    return JsonResponse(ret_dict)
Exemplo n.º 29
0
def getJsApiSign(request):
    """
    微信JSAPI支付
    """
    client = wxClient()
    ticket = client.jsapi.get_jsapi_ticket()
    noncestr = random_string(15)
    timestamp = int(time.time())
    url = request.build_absolute_uri()
    signature = client.jsapi.get_jsapi_signature(noncestr, ticket, timestamp, url)
    sign_package = {
        "appId": settings.WECHAT_APPID,
        "nonceStr": noncestr,
        "timestamp": timestamp,
        "signature": signature
    }
    return sign_package
Exemplo n.º 30
0
    def get_jsapi_signature(self, prepay_id, timestamp=None, nonce_str=None):
        """
        获取 JSAPI 签名

        :param prepay_id: 统一下单接口返回的 prepay_id 参数值
        :param timestamp: 可选,时间戳,默认为当前时间戳
        :param nonce_str: 可选,随机字符串,默认自动生成
        :return: 签名
        """
        data = {
            'appId': self.appid,
            'timeStamp': timestamp or to_text(int(time.time())),
            'nonceStr': nonce_str or random_string(32),
            'signType': 'MD5',
            'package': 'prepay_id={0}'.format(prepay_id),
        }
        return calculate_signature(data, self._client.api_key)
Exemplo n.º 31
0
def get_jsapi_params(appid, secret, url, noncestr=None, timestamp=None):
    """获取调用 JS API 时需要的参数"""
    client = WeChatClient(appid, secret)
    jsapi_client = WeChatJSAPI(client=client)
    timestamp = timestamp or to_text(int(time.time()))
    noncestr = noncestr or random_string(32)
    jsapi_ticket = jsapi_client.get_jsapi_ticket()
    signature = jsapi_client.get_jsapi_signature(noncestr, jsapi_ticket,
                                                 timestamp, url)

    params = {
        'appId': appid,
        'timestamp': timestamp,
        'nonceStr': noncestr,
        'signature': signature,
    }

    return params
Exemplo n.º 32
0
    def get_jsapi_signature(self, prepay_id, timestamp=None, nonce_str=None):
        """
        获取 JSAPI 签名

        :param prepay_id: 统一下单接口返回的 prepay_id 参数值
        :param timestamp: 可选,时间戳,默认为当前时间戳
        :param nonce_str: 可选,随机字符串,默认自动生成
        :return: 签名
        """
        data = {
            "appId": self.sub_appid or self.appid,
            "timeStamp": timestamp or to_text(int(time.time())),
            "nonceStr": nonce_str or random_string(32),
            "signType": "MD5",
            "package": f"prepay_id={prepay_id}",
        }
        return calculate_signature(
            data, self._client.api_key if not self._client.sandbox else self._client.sandbox_api_key,
        )
Exemplo n.º 33
0
 def get_jsapi_card_params(self, card_ticket, card_type, **kwargs):
     """
     参数意义见微信文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
     :param card_ticket: 用于卡券的微信 api_ticket
     :param card_type: 
     :param kwargs: 非必须参数:noncestr, timestamp, code, openid, fixed_begintimestamp, outer_str
     :return: 包含调用jssdk所有所需参数的 dict
     """
     card_signature_dict = {
         'card_type': card_type,
         'noncestr': kwargs.get('noncestr', random_string()),
         'api_ticket': card_ticket,
         'appid': self.appid,
         'timestamp': kwargs.get('timestamp', str(int(time.time()))),
     }
     list_before_sign = sorted([str(x) for x in card_signature_dict.values()])
     str_to_sign = "".join(list_before_sign).encode()
     card_signature_dict['sign'] = hashlib.sha1(str_to_sign).hexdigest()
     return card_signature_dict
Exemplo n.º 34
0
    def get_appapi_params(self, prepay_id, timestamp=None, nonce_str=None):
        """
        获取 APP 支付参数

        :param prepay_id: 统一下单接口返回的 prepay_id 参数值
        :param timestamp: 可选,时间戳,默认为当前时间戳
        :param nonce_str: 可选,随机字符串,默认自动生成
        :return: 签名
        """
        data = {
            "appId": self.appid,
            "package": "prepay_id={}".format(prepay_id),
            "timeStamp": timestamp or to_text(int(time.time())),
            "nonceStr": nonce_str or random_string(32),
            "signType": "MD5",
        }
        sign = calculate_signature(data, self._client.api_key)
        data["paySign"] = sign
        return data
Exemplo n.º 35
0
 def get_jsapi_card_params(self, card_ticket, card_type, **kwargs):
     """
     参数意义见微信文档地址:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62
     :param card_ticket: 用于卡券的微信 api_ticket
     :param card_type:
     :param kwargs: 非必须参数:noncestr, timestamp, code, openid, fixed_begintimestamp, outer_str
     :return: 包含调用jssdk所有所需参数的 dict
     """
     card_signature_dict = {
         "card_type": card_type,
         "noncestr": kwargs.get("noncestr", random_string()),
         "api_ticket": card_ticket,
         "appid": self.appid,
         "timestamp": kwargs.get("timestamp", str(int(time.time()))),
     }
     list_before_sign = sorted([str(x) for x in card_signature_dict.values()])
     str_to_sign = "".join(list_before_sign).encode()
     card_signature_dict["sign"] = hashlib.sha1(str_to_sign).hexdigest()
     return card_signature_dict
Exemplo n.º 36
0
 def get_jsapi_card_params(self, card_ticket, card_type, **kwargs):
     """
     参数意义见微信文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
     :param card_ticket: 用于卡券的微信 api_ticket
     :param card_type: 
     :param kwargs: 非必须参数:noncestr, timestamp, code, openid, fixed_begintimestamp, outer_str
     :return: 包含调用jssdk所有所需参数的 dict
     """
     card_signature_dict = {
         'card_type': card_type,
         'noncestr': kwargs.get('noncestr', random_string()),
         'api_ticket': card_ticket,
         'appid': self.appid,
         'timestamp': kwargs.get('timestamp', str(int(time.time()))),
     }
     list_before_sign = sorted([str(x) for x in card_signature_dict.values()])
     str_to_sign = "".join(list_before_sign).encode()
     card_signature_dict['sign'] = hashlib.sha1(str_to_sign).hexdigest()
     return card_signature_dict
Exemplo n.º 37
0
    def get_appapi_params(self, prepay_id, timestamp=None, nonce_str=None):
        """
        获取 APP 支付参数

        :param prepay_id: 统一下单接口返回的 prepay_id 参数值
        :param timestamp: 可选,时间戳,默认为当前时间戳
        :param nonce_str: 可选,随机字符串,默认自动生成
        :return: 签名
        """
        data = {
            'appId': self.appid,
            'timeStamp': timestamp or to_text(int(time.time())),
            'nonceStr': nonce_str or random_string(32),
            'package': 'prepay_id=%s' % prepay_id,
            'signType': 'MD5',
         }
        sign = calculate_signature(data, self._client.api_key)
        data['paySign'] = sign
        return data
Exemplo n.º 38
0
    def _request(self, method, url_or_endpoint, **kwargs):
        if not url_or_endpoint.startswith(('http://', 'https://')):
            api_base_url = kwargs.pop('api_base_url', self.API_BASE_URL)
            url = '{base}{endpoint}'.format(
                base=api_base_url,
                endpoint=url_or_endpoint
            )
        else:
            url = url_or_endpoint

        if isinstance(kwargs.get('data', ''), dict):
            data = optionaldict(kwargs['data'])
            if 'mchid' not in data:
                # F**k Tencent
                data.setdefault('mch_id', self.mch_id)
            data.setdefault('sub_mch_id', self.sub_mch_id)
            data.setdefault('nonce_str', random_string(32))
            sign = calculate_signature(data, self.api_key)
            body = dict_to_xml(data, sign)
            body = body.encode('utf-8')
            kwargs['data'] = body

        # 商户证书
        if self.mch_cert and self.mch_key:
            kwargs['cert'] = (self.mch_cert, self.mch_key)

        res = requests.request(
            method=method,
            url=url,
            **kwargs
        )
        try:
            res.raise_for_status()
        except requests.RequestException as reqe:
            raise WeChatPayException(
                return_code=None,
                client=self,
                request=reqe.request,
                response=reqe.response
            )

        return self._handle_result(res)
Exemplo n.º 39
0
    def get_appapi_params(self, prepay_id, timestamp=None, nonce_str=None):
        """
        获取 APP 支付参数

        :param prepay_id: 统一下单接口返回的 prepay_id 参数值
        :param timestamp: 可选,时间戳,默认为当前时间戳
        :param nonce_str: 可选,随机字符串,默认自动生成
        :return: 签名
        """
        data = {
            'appid': self.appid,
            'partnerid': self.mch_id,
            'prepayid': prepay_id,
            'package': 'Sign=WXPay',
            'timestamp': timestamp or to_text(int(time.time())),
            'noncestr': nonce_str or random_string(32)
        }
        sign = calculate_signature(data, self._client.api_key)
        data['sign'] = sign
        return data
Exemplo n.º 40
0
 def get_random_string(self):
     return random_string(16)