| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  | import stripe | 
					
						
							|  |  |  | from django.conf import settings | 
					
						
							| 
									
										
										
										
											2016-05-01 14:13:12 +02:00
										 |  |  | stripe.api_key = settings.STRIPE_API_PRIVATE_KEY | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | def handleStripeError(f): | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |     def handleProblems(*args, **kwargs): | 
					
						
							|  |  |  |         response = { | 
					
						
							|  |  |  |             'paid': False, | 
					
						
							|  |  |  |             'response_object': None, | 
					
						
							|  |  |  |             'error': None | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         common_message = "Currently its not possible to make payments." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             response_object = f(*args, **kwargs) | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |             response = { | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |                 'response_object': response_object, | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |                 'error': None | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |             return response | 
					
						
							|  |  |  |         except stripe.error.CardError as e: | 
					
						
							|  |  |  |             # Since it's a decline, stripe.error.CardError will be caught | 
					
						
							|  |  |  |             body = e.json_body | 
					
						
							|  |  |  |             err = body['error'] | 
					
						
							|  |  |  |             response.update({'error': err['message']}) | 
					
						
							|  |  |  |             return response | 
					
						
							|  |  |  |         except stripe.error.RateLimitError as e: | 
					
						
							|  |  |  |             response.update({'error': "Too many requests made to the API too quickly"}) | 
					
						
							|  |  |  |             return response | 
					
						
							|  |  |  |         except stripe.error.InvalidRequestError as e: | 
					
						
							|  |  |  |             response.update({'error': "Invalid parameters"}) | 
					
						
							|  |  |  |             return response | 
					
						
							|  |  |  |         except stripe.error.AuthenticationError as e: | 
					
						
							|  |  |  |             # Authentication with Stripe's API failed | 
					
						
							|  |  |  |             # (maybe you changed API keys recently) | 
					
						
							|  |  |  |             response.update({'error': common_message}) | 
					
						
							|  |  |  |             return response | 
					
						
							|  |  |  |         except stripe.error.APIConnectionError as e: | 
					
						
							|  |  |  |             response.update({'error': common_message}) | 
					
						
							|  |  |  |             return response | 
					
						
							|  |  |  |         except stripe.error.StripeError as e: | 
					
						
							|  |  |  |             # maybe send email | 
					
						
							|  |  |  |             response.update({'error': common_message}) | 
					
						
							|  |  |  |             return response | 
					
						
							|  |  |  |         except Exception as e: | 
					
						
							|  |  |  |             # maybe send email | 
					
						
							|  |  |  |             response.update({'error': common_message}) | 
					
						
							|  |  |  |             return response | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |     return handleProblems | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-01 14:13:12 +02:00
										 |  |  | class StripeUtils(object): | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  |     CURRENCY = 'chf' | 
					
						
							|  |  |  |     INTERVAL = 'month' | 
					
						
							|  |  |  |     SUCCEEDED_STATUS = 'succeeded' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self): | 
					
						
							|  |  |  |         self.stripe = stripe | 
					
						
							| 
									
										
										
										
											2016-05-01 14:13:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |     def check_customer(self, id, user, token): | 
					
						
							| 
									
										
										
										
											2016-05-01 14:13:12 +02:00
										 |  |  |         customers = self.stripe.Customer.all() | 
					
						
							|  |  |  |         if not customers.get('data'): | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |             customer = self.create_customer(token, user.email) | 
					
						
							| 
									
										
										
										
											2016-05-01 14:13:12 +02:00
										 |  |  |         else: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 customer = stripe.Customer.retrieve(id) | 
					
						
							|  |  |  |             except stripe.InvalidRequestError: | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |                 customer = self.create_customer(token, user.email) | 
					
						
							| 
									
										
										
										
											2016-05-05 01:03:35 -05:00
										 |  |  |                 user.stripecustomer.stripe_id = customer.get('response_object').get('id') | 
					
						
							| 
									
										
										
										
											2016-05-01 14:13:12 +02:00
										 |  |  |                 user.stripecustomer.save() | 
					
						
							|  |  |  |         return customer | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |     @handleStripeError | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |     def create_customer(self, token, email): | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |         customer = self.stripe.Customer.create( | 
					
						
							| 
									
										
										
										
											2016-05-01 14:13:12 +02:00
										 |  |  |             source=token, | 
					
						
							|  |  |  |             description='description for testing', | 
					
						
							|  |  |  |             email=email | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |         ) | 
					
						
							|  |  |  |         return customer | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |     @handleStripeError | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |     def make_charge(self, amount=None, customer=None): | 
					
						
							|  |  |  |         amount = int(amount * 100)  # stripe amount unit, in cents | 
					
						
							| 
									
										
										
										
											2016-05-01 14:13:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |         charge = self.stripe.Charge.create( | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |             amount=amount,  # in cents | 
					
						
							|  |  |  |             currency=self.CURRENCY, | 
					
						
							|  |  |  |             customer=customer | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |         ) | 
					
						
							|  |  |  |         return charge | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |     @handleStripeError | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  |     def create_plan(self, amount, name, id): | 
					
						
							|  |  |  |         self.stripe.Plan.create( | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |             amount=amount, | 
					
						
							|  |  |  |             interval=self.INTERVAL, | 
					
						
							|  |  |  |             name=name, | 
					
						
							|  |  |  |             currency=self.CURRENCY, | 
					
						
							|  |  |  |             id=id) | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |     @handleStripeError | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |     def make_payment(self, user, amount, token): | 
					
						
							| 
									
										
										
										
											2016-05-04 17:36:54 +02:00
										 |  |  |         charge = self.stripe.Charge.create( | 
					
						
							|  |  |  |             amount=amount,  # in cents | 
					
						
							|  |  |  |             currency=self.CURRENCY, | 
					
						
							|  |  |  |             customer=customer | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         return charge | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @handleStripeError | 
					
						
							| 
									
										
										
										
											2016-05-01 14:13:12 +02:00
										 |  |  |     def create_plan(self, amount, name, id): | 
					
						
							|  |  |  |         self.stripe.Plan.create( | 
					
						
							|  |  |  |             amount=amount, | 
					
						
							|  |  |  |             interval=self.INTERVAL, | 
					
						
							|  |  |  |             name=name, | 
					
						
							|  |  |  |             currency=self.CURRENCY, | 
					
						
							|  |  |  |             id=id) | 
					
						
							| 
									
										
										
										
											2016-05-07 23:05:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |