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)
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)
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
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
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 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
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
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