示例#1
0
 def test_create_checkout(self):
     client = Client(api_key, api_secret)
     # Start with none of the required arguments, and slowly make requests with
     # an additional required argument, expecting failure until all arguments
     # are present.
     send_kwargs = {}
     required_kwargs = {'name': 'bar', 'amount': '1.0', 'currency': 'USD'}
     while required_kwargs:
         with self.assertRaises(ValueError):
             client.create_checkout(**send_kwargs)
         for key in required_kwargs:
             send_kwargs[key] = required_kwargs.pop(key)
             break
     checkout = client.create_checkout(**send_kwargs)
     self.assertIsInstance(checkout, Checkout)
     self.assertEqual(checkout, mock_item)
示例#2
0
 def test_create_checkout(self):
   client = Client(api_key, api_secret)
   # Start with none of the required arguments, and slowly make requests with
   # an additional required argument, expecting failure until all arguments
   # are present.
   send_kwargs = {}
   required_kwargs = {'name': 'bar', 'amount': '1.0', 'currency': 'USD'}
   while required_kwargs:
     with self.assertRaises(ValueError):
       client.create_checkout(**send_kwargs)
     for key in required_kwargs:
       send_kwargs[key] = required_kwargs.pop(key)
       break
   checkout = client.create_checkout(**send_kwargs)
   self.assertIsInstance(checkout, Checkout)
   self.assertEqual(checkout, mock_item)
示例#3
0
def createCheckoutCallback(amount=0.000101,
                           currency="BTC",
                           metadata={"test": 42},
                           hook=WEBHOOK_URL):

    client = Client(API_KEY, API_SECRET, base_api_uri=API_BACKEND_URL)

    parameters = {
        "amount": "%s" % amount,
        "currency": currency,
        "name": "test",
        "type": "order",
        "style": "buy_now_large",
        "customer_defined_amount": "false",
        "collect_email": "false",
        "metadata": metadata,
        "notifications_url": hook
    }

    checkout = client.create_checkout(**parameters)

    embed_code = checkout["embed_code"]
    print embed_code

    payment_url = '%s/checkouts/%s' % (API_FRONTEND_URL, embed_code)
    print payment_url
示例#4
0
def cbCheckoutUrl(webhook, amount="0.000101", currency="BTC", dbg=True):
  """get payment URL from coinbase"""
  
  client = Client(API_KEY, API_SECRET, base_api_uri=API_BACKEND_URL)
  parameters={"amount": amount, "currency": currency, "name": "test", 
             "notifications_url" : webhook }
  checkout = client.create_checkout(**parameters)
  embed_code=checkout["embed_code"] # print embed_code 
  payment_url='%s/checkouts/%s' % (API_FRONTEND_URL, embed_code)
  if dbg: print "checkout created, with notifications_url=%s" % webhook
  return payment_url
示例#5
0
def createCoinbaseCheckout(amount=59,
                           metadata={
                               "id": 42,
                               "product": "8 hours"
                           },
                           hook=None,
                           amount_presets=None,
                           dbg=DEBUG_MESSAGES):
    """Access the Coinbase API, 
     to create a 'checkout', 
     and be given an 'embed_code'
  """

    client = Client(API_KEY, API_SECRET, base_api_uri=API_BACKEND_URL)

    # ONLY called if the customer presses the "Back to ..." button after payment
    success_url = "%s/%s/thankyou/" % (SERVER, APPNAME
                                       )  # after successful payment
    cancel_url = "%s/%s/cancel/" % (SERVER, APPNAME
                                    )  # after timeout (15 minutes)

    parameters = {
        "amount": "%.2f" % amount,
        "currency": CURRENCY,
        "name": PRODUCTNAME,
        "description": PRODUCTDESCRIPTION,
        "type": "order",
        "style": "buy_now_large",
        "customer_defined_amount": "false",
        "amount_presets": amount_presets,
        "collect_email": "false",
        "metadata": metadata,
        "success_url": success_url,
        "cancel_url": cancel_url,
    }

    if amount_presets != None:
        parameters["amount_presets"] = amount_presets

    if hook != None:
        notifications_url = "%s/%s/hook/%s/" % (SERVER, APPNAME, hook)
        if dbg:
            print "Callback: Using notifications_url='%s' for callback." % notifications_url
        parameters["notifications_url"] = notifications_url
    else:
        if dbg:
            print "Callback: using default from API-key definition."  ## Coinbase Bug: Not working

    checkout = client.create_checkout(**parameters)
    return checkout
示例#6
0
def createCoinbaseCheckout(amount=59, metadata={"id": 42, "product" : "8 hours"}, 
                           hook=None, amount_presets=None, dbg=DEBUG_MESSAGES):
  """Access the Coinbase API, 
     to create a 'checkout', 
     and be given an 'embed_code'
  """
  
  client = Client(API_KEY, API_SECRET, base_api_uri=API_BACKEND_URL)
  
  # ONLY called if the customer presses the "Back to ..." button after payment
  success_url="%s/%s/thankyou/" % (SERVER, APPNAME) # after successful payment
  cancel_url= "%s/%s/cancel/"   % (SERVER, APPNAME)   # after timeout (15 minutes)
  
  parameters={ "amount": "%.2f" % amount,
               "currency": CURRENCY,
               "name": PRODUCTNAME,
               "description": PRODUCTDESCRIPTION,
               "type": "order",
               "style": "buy_now_large",
               "customer_defined_amount": "false",
               "amount_presets": amount_presets,
               "collect_email": "false",
               "metadata": metadata,
               "success_url" : success_url,
               "cancel_url" : cancel_url,
               }
  
  if amount_presets!=None:
    parameters["amount_presets"]=amount_presets

  if hook!=None:
    notifications_url = "%s/%s/hook/%s/" % (SERVER, APPNAME, hook)
    if dbg: print "Callback: Using notifications_url='%s' for callback." % notifications_url
    parameters["notifications_url"]=notifications_url
  else:
    if dbg: print "Callback: using default from API-key definition."  ## Coinbase Bug: Not working
    
  checkout = client.create_checkout(**parameters)
  return checkout
def createCheckoutCallback(amount=0.000101, currency="BTC",
                           metadata={"test": 42}, 
                           hook=WEBHOOK_URL):
  
  client = Client(API_KEY, API_SECRET, base_api_uri=API_BACKEND_URL)

  parameters={ "amount": "%s" % amount,
             "currency": currency,
             "name": "test",
             "type": "order",
             "style": "buy_now_large",
             "customer_defined_amount": "false",
             "collect_email": "false",
             "metadata": metadata,
             "notifications_url" : hook     
             }
  
  checkout = client.create_checkout(**parameters)
  
  embed_code=checkout["embed_code"]
  print embed_code 
      
  payment_url='%s/checkouts/%s' % (API_FRONTEND_URL, embed_code)
  print payment_url
示例#8
0
class CoinbaseBackend(BackendBase):
    backend_id = 'coinbase'
    backend_verbose_name = _("Coinbase")
    backend_display_name = _("Bitcoin with CoinBase")

    def __init__(self, settings):
        self.sandbox = settings.get('SANDBOX', False)
        if self.sandbox:
            default_site = 'https://sandbox.coinbase.com/'
            default_base = 'https://api.sandbox.coinbase.com/'
        else:
            default_site = 'https://www.coinbase.com/'
            default_base = 'https://api.coinbase.com/'

        self.currency = settings.get('CURRENCY', 'EUR')
        self.key = settings.get('KEY')
        self.secret = settings.get('SECRET')
        self.base = settings.get('BASE_URL', default_base)
        self.site = settings.get('SITE_URL', default_site)

        self.callback_secret = settings.get('CALLBACK_SECRET')
        self.callback_source_ip = settings.get('CALLBACK_SOURCE', '54.175.255.192/27')

        if not self.key or not self.secret or not self.callback_secret:
            return

        from coinbase.wallet.client import Client
        self.client = Client(self.key, self.secret, self.base)
        self.backend_enabled = True

    def new_payment(self, payment):
        ROOT_URL = project_settings.ROOT_URL

        months = int(payment.time.days / 30)
        username = payment.user.username

        amount_str = '%.2f' % (payment.amount / 100)
        name = "%d months for %s" % (months, username)
        checkout = self.client.create_checkout(
            amount=amount_str,
            currency=self.currency,
            name=name,
            success_url=ROOT_URL + reverse('payments:view', args=(payment.id,)),
            cancel_url=ROOT_URL + reverse('payments:cancel', args=(payment.id,)),
            metadata={'payment_id': payment.id},
        )
        embed_id = checkout['embed_code']
        payment.backend_data['checkout_id'] = checkout['id']
        payment.backend_data['embed_code'] = checkout['embed_code']
        return redirect(self.site + 'checkouts/' + embed_id
                        + '?custom=' + str(payment.id))

    def callback(self, Payment, request):
        if self.callback_source_ip:
            if ('.' in request.META['REMOTE_ADDR']) != ('.' in self.callback_source_ip):
                print("source IP version")
                print(repr(request.META.get('REMOTE_ADDR')))
                print(repr(self.callback_source_ip))
                return False  # IPv6 TODO
            net = IPv4Network(self.callback_source_ip)
            if IPv4Address(request.META['REMOTE_ADDR']) not in net:
                print("source IP")
                return False

        secret = request.GET.get('secret')
        if secret != self.callback_secret:
            print("secret")
            return False

        data = json.loads(request.body.decode('utf-8'))
        order = data.get('order')

        if not order:
            # OK but we don't care
            print("order")
            return True

        id = order.get('custom')
        try:
            payment = Payment.objects.get(id=id)
        except Payment.DoesNotExist:
            # Wrong ID - Valid request, ignore
            print("wrong payment")
            return True

        button = order.get('button')
        if not button:
            # Wrong structure.
            print("button")
            return False

        payment.status = 'confirmed'
        payment.save()
        payment.user.vpnuser.add_paid_time(payment.time)
        payment.user.vpnuser.on_payment_confirmed(payment)
        payment.user.vpnuser.save()
        return True
示例#9
0
class CoinbaseBackend(BackendBase):
    backend_id = 'coinbase'
    backend_verbose_name = _("Coinbase")
    backend_display_name = _("Bitcoin with CoinBase")

    def __init__(self, settings):
        self.sandbox = settings.get('SANDBOX', False)
        if self.sandbox:
            default_site = 'https://sandbox.coinbase.com/'
            default_base = 'https://api.sandbox.coinbase.com/'
        else:
            default_site = 'https://www.coinbase.com/'
            default_base = 'https://api.coinbase.com/'

        self.currency = settings.get('CURRENCY', 'EUR')
        self.key = settings.get('KEY')
        self.secret = settings.get('SECRET')
        self.base = settings.get('BASE_URL', default_base)
        self.site = settings.get('SITE_URL', default_site)

        self.callback_secret = settings.get('CALLBACK_SECRET')
        self.callback_source_ip = settings.get('CALLBACK_SOURCE',
                                               '54.175.255.192/27')

        if not self.key or not self.secret or not self.callback_secret:
            return

        from coinbase.wallet.client import Client
        self.client = Client(self.key, self.secret, self.base)
        self.backend_enabled = True

    def new_payment(self, payment):
        ROOT_URL = project_settings.ROOT_URL

        months = int(payment.time.days / 30)
        username = payment.user.username

        amount_str = '%.2f' % (payment.amount / 100)
        name = "%d months for %s" % (months, username)
        checkout = self.client.create_checkout(
            amount=amount_str,
            currency=self.currency,
            name=name,
            success_url=ROOT_URL +
            reverse('payments:view', args=(payment.id, )),
            cancel_url=ROOT_URL +
            reverse('payments:cancel', args=(payment.id, )),
            metadata={'payment_id': payment.id},
        )
        embed_id = checkout['embed_code']
        payment.backend_data['checkout_id'] = checkout['id']
        payment.backend_data['embed_code'] = checkout['embed_code']
        return redirect(self.site + 'checkouts/' + embed_id + '?custom=' +
                        str(payment.id))

    def callback(self, Payment, request):
        if self.callback_source_ip:
            if ('.' in request.META['REMOTE_ADDR']) != (
                    '.' in self.callback_source_ip):
                print("source IP version")
                print(repr(request.META.get('REMOTE_ADDR')))
                print(repr(self.callback_source_ip))
                return False  # IPv6 TODO
            net = IPv4Network(self.callback_source_ip)
            if IPv4Address(request.META['REMOTE_ADDR']) not in net:
                print("source IP")
                return False

        secret = request.GET.get('secret')
        if secret != self.callback_secret:
            print("secret")
            return False

        data = json.loads(request.body.decode('utf-8'))
        order = data.get('order')

        if not order:
            # OK but we don't care
            print("order")
            return True

        id = order.get('custom')
        try:
            payment = Payment.objects.get(id=id)
        except Payment.DoesNotExist:
            # Wrong ID - Valid request, ignore
            print("wrong payment")
            return True

        button = order.get('button')
        if not button:
            # Wrong structure.
            print("button")
            return False

        payment.status = 'confirmed'
        payment.save()
        payment.user.vpnuser.add_paid_time(payment.time)
        payment.user.vpnuser.on_payment_confirmed(payment)
        payment.user.vpnuser.save()
        return True