Пример #1
0
    def get(self, request, *args, **kwargs):
        product = kwargs.pop('product', None)  # type: str
        currency = kwargs.pop('currency', None)  # type: str

        if product is None or product.lower() not in ('lite', 'premium',
                                                      'ultimate'):
            log.error('pricing_view: invalid product: %s' % product)
            return HttpResponseBadRequest("Invalid product")

        if currency is None or currency.upper(
        ) not in settings.SUPPORTED_CURRENCIES:
            log.error('pricing_view: invalid currency: %s' % currency)
            return HttpResponseBadRequest("Unsupported currency")

        user = None
        if 'HTTP_AUTHORIZATION' in request.META:
            token_in_header = request.META['HTTP_AUTHORIZATION'].replace(
                'Token ', '')
            token = Token.objects.get(key=token_in_header)
            user = token.user

        return self.render_json_response({
            'fullPrice':
            PricingService.get_full_price(product.lower(), currency.upper()),
            'discount':
            PricingService.get_discount_amount(product.lower(),
                                               currency.upper(),
                                               user=user),
            'price':
            PricingService.get_price(product.lower(),
                                     currency.upper(),
                                     user=user)
        })
Пример #2
0
    def get(self, request, *args, **kwargs):
        product = kwargs.pop('product', None)  # type: str
        currency = kwargs.pop('currency', None)  # type: str

        if product is None or product.lower() not in ('lite', 'premium', 'ultimate'):
            log.error('pricing_view: invalid product: %s' % product)
            return HttpResponseBadRequest("Invalid product")

        if currency is None or currency.upper() not in settings.SUPPORTED_CURRENCIES:
            log.error('pricing_view: invalid currency: %s' % currency)
            return HttpResponseBadRequest("Unsupported currency")

        return self.render_json_response({
            'price': PricingService.get_price(product.lower(), currency.upper())
        })
Пример #3
0
 def test_eur_with_50c_rounding_up(self):
     self.assertEqual(22.5, PricingService.get_price('lite', 'EUR'))
     self.assertEqual(44.5, PricingService.get_price('premium', 'EUR'))
     self.assertEqual(66.5, PricingService.get_price('ultimate', 'EUR'))
Пример #4
0
 def test_usd(self):
     self.assertEqual(22.0, PricingService.get_price('lite', 'USD'))
     self.assertEqual(44.0, PricingService.get_price('premium', 'USD'))
     self.assertEqual(66.0, PricingService.get_price('ultimate', 'USD'))
Пример #5
0
 def test_chf(self):
     self.assertEqual(20, PricingService.get_price('lite', 'CHF'))
     self.assertEqual(40, PricingService.get_price('premium', 'CHF'))
     self.assertEqual(60, PricingService.get_price('ultimate', 'CHF'))
Пример #6
0
def create_checkout_session(request, user_pk, product, currency):
    stripe.api_key = settings.STRIPE_SECRET_KEY

    try:
        user = User.objects.get(pk=user_pk)
    except User.DoesNotExist:
        log.error("create_checkout_session: %d, %s, %s: %s" %
                  (user_pk, product, currency, "Invalid user"))
        raise Http404

    if currency.upper() not in settings.SUPPORTED_CURRENCIES:
        log.error("create_checkout_session: %d, %s, %s: %s" %
                  (user.pk, product, currency, "Invalid currency"))
        return HttpResponseBadRequest()

    if product not in ('lite', 'premium', 'ultimate'):
        log.error("create_checkout_session: %d, %s, %s: %s" %
                  (user.pk, product, currency, "Invalid product"))
        return HttpResponseBadRequest()

    stripe_products = {
        'lite': settings.STRIPE_PRODUCT_LITE,
        'premium': settings.STRIPE_PRODUCT_PREMIUM,
        'ultimate': settings.STRIPE_PRODUCT_ULTIMATE
    }

    price = PricingService.get_full_price(product, currency.upper())

    log.info("create_checkout_session: %d, %s, %s %.2f" %
             (user.pk, product, currency, price))

    try:
        customer = PricingService.get_stripe_customer(user)
        customer_id = None
        if customer:
            customer_id = customer['id']

        discounts = PricingService.get_stripe_discounts(user)

        if currency.upper() == 'EUR':
            payment_method_types = ['card', 'sepa_debit']
        elif currency.upper() == 'CNY':
            payment_method_types = ['card', 'alipay']
        else:
            payment_method_types = ['card']

        kwargs = {
            'success_url':
            AppRedirectionService.redirect(
                '/subscriptions/success?product=' + product +
                '&session_id={CHECKOUT_SESSION_ID}'),
            'cancel_url':
            AppRedirectionService.redirect('/subscriptions/cancelled/'),
            'mode':
            'payment',
            'payment_method_types':
            payment_method_types,
            'client_reference_id':
            user.pk,
            'customer':
            customer_id if customer_id else None,
            'customer_email':
            user.email if not customer_id else None,
            'submit_type':
            'pay',
            'line_items': [{
                'quantity': 1,
                'price_data': {
                    'currency': currency.lower(),
                    'product': stripe_products[product],
                    'unit_amount_decimal': price * 100,  # Stripe uses cents
                }
            }],
            'metadata': {
                'product': product
            },
        }

        if discounts != []:
            kwargs['discounts'] = discounts
        else:
            kwargs['allow_promotion_codes'] = True

        checkout_session = stripe.checkout.Session.create(**kwargs)

        return JsonResponse({'sessionId': checkout_session['id']})
    except Exception as e:
        log.exception("create_checkout_session: %d, %s, %s: %s" %
                      (user.pk, product, currency, str(e)))
        return JsonResponse({'error': 'Internal error: %s' % str(e)})
Пример #7
0
def create_checkout_session(request, user_pk, product, currency):
    stripe.api_key = settings.STRIPE_SECRET_KEY

    try:
        user = User.objects.get(pk=user_pk)
    except User.DoesNotExist:
        log.error("create_checkout_session: %d, %s, %s: %s" %
                  (user_pk, product, currency, "Invalid user"))
        raise Http404

    if currency.upper() not in settings.SUPPORTED_CURRENCIES:
        log.error("create_checkout_session: %d, %s, %s: %s" %
                  (user.pk, product, currency, "Invalid currency"))
        return HttpResponseBadRequest()

    if product not in ('lite', 'premium', 'ultimate'):
        log.error("create_checkout_session: %d, %s, %s: %s" %
                  (user.pk, product, currency, "Invalid product"))
        return HttpResponseBadRequest()

    stripe_products = {
        'lite': settings.STRIPE_PRODUCT_LITE,
        'premium': settings.STRIPE_PRODUCT_PREMIUM,
        'ultimate': settings.STRIPE_PRODUCT_ULTIMATE
    }

    price = PricingService.get_price(product, currency.upper())

    log.info("create_checkout_session: %d, %s, %s %.2f" %
             (user.pk, product, currency, price))

    try:
        customer_result = stripe.Customer.list(email=user.email, limit=1)
        customer = None
        if len(customer_result['data']) == 1:
            customer = customer_result['data'][0]['id']

        checkout_session = stripe.checkout.Session.create(
            success_url=AppRedirectionService.redirect(
                request, '/subscriptions/success?product=' + product +
                '&session_id={CHECKOUT_SESSION_ID}'),
            cancel_url=AppRedirectionService.redirect(
                request, '/subscriptions/cancelled/'),
            mode='payment',
            payment_method_types=['card'],
            client_reference_id=user.pk,
            customer=customer if customer else None,
            customer_email=user.email if not customer else None,
            allow_promotion_codes=True,
            submit_type='pay',
            line_items=[{
                'quantity': 1,
                'price_data': {
                    'currency': currency.lower(),
                    'product': stripe_products[product],
                    'unit_amount_decimal': price * 100,  # Stripe uses cents
                }
            }],
            metadata={'product': product})
        return JsonResponse({'sessionId': checkout_session['id']})
    except Exception as e:
        log.exception("create_checkout_session: %d, %s, %s: %s" %
                      (user.pk, product, currency, str(e)))
        return JsonResponse({'error': 'Internal error: %s' % str(e)})