def make_payment_transaction(self, payment_profile_id, membership=None): """ Make a payment transaction. This includes: 1) Make an API call createCustomerProfileTransactionRequest 2) Create a payment transaction entry 3) Create a payment entry 4) If the transaction is successful, populate payment entry with the direct response and mark payment as paid """ amount = self.invoice.balance # tender the invoice self.invoice.tender(self.recurring_payment.user) # create a payment record payment = Payment() payment.payments_pop_by_invoice_user(self.recurring_payment.user, self.invoice, self.invoice.guid) if self.billing_cycle_start_dt and self.billing_cycle_end_dt: description = self.recurring_payment.description description += '(billing cycle from {0} to {1})'.format( self.billing_cycle_start_dt.strftime('%m/%d/%Y'), self.billing_cycle_end_dt.strftime('%m/%d/%Y')) else: description = payment.description # charge user if self.recurring_payment.platform == "stripe": stripe.api_key = getattr(settings, 'STRIPE_SECRET_KEY', '') params = { 'amount': math.trunc(amount * 100), # amount in cents, again 'currency': get_setting('site', 'global', 'currency'), 'description': description, 'customer': self.recurring_payment.customer_profile_id } success = False response_d = { 'status_detail': 'not approved', 'response_code': '0', 'response_reason_code': '0', 'result_code': 'Error', # Error, Ok 'message_code': '', # I00001, E00027 } try: charge_response = stripe.Charge.create(**params) success = True response_d['status_detail'] = 'approved' response_d['response_code'] = '1' response_d['response_subcode'] = '1' response_d['response_reason_code'] = '1' response_d[ 'response_reason_text'] = 'This transaction has been approved. (Created# %s)' % charge_response.created response_d['trans_id'] = charge_response.id response_d['result_code'] = 'Ok' response_d['message_text'] = 'Successful.' except stripe.error.CardError as e: # it's a decline json_body = e.json_body err = json_body and json_body['error'] code = err and err['code'] message = err and err['message'] charge_response = '{message} status={status}, code={code}'.format( message=message, status=e.http_status, code=code) response_d['response_reason_text'] = charge_response response_d['message_code'] = code response_d['message_text'] = charge_response except Exception as e: charge_response = e.message response_d['response_reason_text'] = charge_response response_d['message_text'] = charge_response[:200] # update payment for key in response_d: if hasattr(payment, key): setattr(payment, key, response_d[key]) else: # make a transaction using CIM d = { 'amount': amount, 'order': { 'invoice_number': str(payment.invoice_num), 'description': description, 'recurring_billing': 'true' } } cpt = CIMCustomerProfileTransaction( self.recurring_payment.customer_profile_id, payment_profile_id) success, response_d = cpt.create(**d) # update the payment entry with the direct response returned from payment gateway payment = payment_update_from_response( payment, response_d['direct_response']) if success: payment.mark_as_paid() payment.save() payment.invoice.make_payment(self.recurring_payment.user, Decimal(payment.amount)) # approve membership if membership: membership.approve() # send notification to user self.payment_received_dt = datetime.now() else: if payment.status_detail == '': payment.status_detail = 'not approved' payment.save() self.last_payment_failed_dt = datetime.now() self.save() # create a payment transaction record payment_transaction = PaymentTransaction( recurring_payment=self.recurring_payment, recurring_payment_invoice=self, payment_profile_id=payment_profile_id, trans_type='auth_capture', amount=amount, status=success) payment_transaction.payment = payment payment_transaction.result_code = response_d['result_code'] payment_transaction.message_code = response_d['message_code'] payment_transaction.message_text = response_d['message_text'] payment_transaction.save() return payment_transaction
def make_payment_transaction(self, payment_profile_id): """ Make a payment transaction. This includes: 1) Make an API call createCustomerProfileTransactionRequest 2) Create a payment transaction entry 3) Create a payment entry 4) If the transaction is successful, populate payment entry with the direct response and mark payment as paid """ amount = self.invoice.balance # tender the invoice self.invoice.tender(self.recurring_payment.user) # create a payment record payment = Payment() payment.payments_pop_by_invoice_user(self.recurring_payment.user, self.invoice, self.invoice.guid) # make a transaction using CIM d = {'amount': amount, 'order': { 'invoice_number': str(payment.invoice_num), 'description': '%s (billing cycle from %s to %s)' % ( self.recurring_payment.description, self.billing_cycle_start_dt.strftime('%m/%d/%Y'), self.billing_cycle_end_dt.strftime('%m/%d/%Y')), 'recurring_billing': 'true' } } cpt = CIMCustomerProfileTransaction(self.recurring_payment.customer_profile_id, payment_profile_id) success, response_d = cpt.create(**d) # create a payment transaction record payment_transaction = PaymentTransaction( recurring_payment = self.recurring_payment, recurring_payment_invoice = self, payment_profile_id = payment_profile_id, trans_type='auth_capture', amount=amount, status=success) # update the payment entry with the direct response returned from payment gateway #print success, response_d payment = payment_update_from_response(payment, response_d['direct_response']) if success: payment.mark_as_paid() payment.save() self.invoice.make_payment(self.recurring_payment.user, Decimal(payment.amount)) self.invoice.save() self.payment_received_dt = datetime.now() else: if payment.status_detail == '': payment.status_detail = 'not approved' payment.save() self.last_payment_failed_dt = datetime.now() self.save() payment_transaction.payment = payment payment_transaction.result_code = response_d['result_code'] payment_transaction.message_code = response_d['message_code'] payment_transaction.message_text = response_d['message_text'] payment_transaction.save() return payment_transaction
def make_payment_transaction(self, payment_profile_id, membership=None): """ Make a payment transaction. This includes: 1) Make an API call createCustomerProfileTransactionRequest 2) Create a payment transaction entry 3) Create a payment entry 4) If the transaction is successful, populate payment entry with the direct response and mark payment as paid """ amount = self.invoice.balance # tender the invoice self.invoice.tender(self.recurring_payment.user) # create a payment record payment = Payment() payment.payments_pop_by_invoice_user(self.recurring_payment.user, self.invoice, self.invoice.guid) if self.billing_cycle_start_dt and self.billing_cycle_end_dt: description = self.recurring_payment.description description += '(billing cycle from {0} to {1})'.format( self.billing_cycle_start_dt.strftime('%m/%d/%Y'), self.billing_cycle_end_dt.strftime('%m/%d/%Y')) else: description = payment.description # charge user if self.recurring_payment.platform == "stripe": stripe.api_key = getattr(settings, 'STRIPE_SECRET_KEY', '') params = { 'amount': math.trunc(amount * 100), # amount in cents, again 'currency': get_setting('site', 'global', 'currency'), 'description': description, 'customer': self.recurring_payment.customer_profile_id } success = False response_d = { 'status_detail': 'not approved', 'response_code': '0', 'response_reason_code': '0', 'result_code': 'Error', # Error, Ok 'message_code': '', # I00001, E00027 } try: charge_response = stripe.Charge.create(**params) success = True response_d['status_detail'] = 'approved' response_d['response_code'] = '1' response_d['response_subcode'] = '1' response_d['response_reason_code'] = '1' response_d['response_reason_text'] = 'This transaction has been approved. (Created# %s)' % charge_response.created response_d['trans_id'] = charge_response.id response_d['result_code'] = 'Ok' response_d['message_text'] = 'Successful.' except stripe.error.CardError as e: # it's a decline json_body = e.json_body err = json_body and json_body['error'] code = err and err['code'] message = err and err['message'] charge_response = '{message} status={status}, code={code}'.format( message=message, status=e.http_status, code=code) response_d['response_reason_text'] = charge_response response_d['message_code'] = code response_d['message_text'] = charge_response except Exception as e: charge_response = e.message response_d['response_reason_text'] = charge_response response_d['message_text'] = charge_response[:200] # update payment for key in response_d: if hasattr(payment, key): setattr(payment, key, response_d[key]) else: # make a transaction using CIM d = {'amount': amount, 'order': { 'invoice_number': str(payment.invoice_num), 'description': description, 'recurring_billing': 'true' } } cpt = CIMCustomerProfileTransaction(self.recurring_payment.customer_profile_id, payment_profile_id) success, response_d = cpt.create(**d) # update the payment entry with the direct response returned from payment gateway payment = payment_update_from_response(payment, response_d['direct_response']) if success: payment.mark_as_paid() payment.save() payment.invoice.make_payment(self.recurring_payment.user, Decimal(payment.amount)) # approve membership if membership: membership.approve() # send notification to user self.payment_received_dt = datetime.now() else: if payment.status_detail == '': payment.status_detail = 'not approved' payment.save() self.last_payment_failed_dt = datetime.now() self.save() # create a payment transaction record payment_transaction = PaymentTransaction( recurring_payment = self.recurring_payment, recurring_payment_invoice = self, payment_profile_id = payment_profile_id, trans_type='auth_capture', amount=amount, status=success) payment_transaction.payment = payment payment_transaction.result_code = response_d['result_code'] payment_transaction.message_code = response_d['message_code'] payment_transaction.message_text = response_d['message_text'] payment_transaction.save() return payment_transaction