def execute_payment(self, request: HttpRequest, payment: OrderPayment): self._init_api() try: source = self._create_source(request, payment) except stripe.error.StripeError as e: if e.json_body and 'err' in e.json_body: err = e.json_body['error'] logger.exception('Stripe error: %s' % str(err)) else: err = {'message': str(e)} logger.exception('Stripe error: %s' % str(e)) payment.info_data = { 'error': True, 'message': err['message'], } payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.save() payment.order.log_action('pretix.event.order.payment.failed', { 'local_id': payment.local_id, 'provider': payment.provider, 'message': err['message'] }) raise PaymentException(_('We had trouble communicating with Stripe. Please try again and get in touch ' 'with us if this problem persists.')) ReferencedStripeObject.objects.get_or_create( reference=source.id, defaults={'order': payment.order, 'payment': payment} ) payment.info = str(source) payment.state = OrderPayment.PAYMENT_STATE_PENDING payment.save() request.session['payment_stripe_order_secret'] = payment.order.secret return self.redirect(request, source.redirect.url)
def execute_payment(self, request: HttpRequest, payment: OrderPayment): try: req = requests.post('https://api.mollie.com/v2/payments', json=self._get_payment_body(payment), headers=self.request_headers) req.raise_for_status() except HTTPError: logger.exception('Mollie error: %s' % req.text) try: payment.info_data = req.json() except: payment.info_data = {'error': True, 'detail': req.text} payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.save() payment.order.log_action( 'pretix.event.order.payment.failed', { 'local_id': payment.local_id, 'provider': payment.provider, 'data': payment.info_data }) raise PaymentException( _('We had trouble communicating with Mollie. Please try again and get in touch ' 'with us if this problem persists.')) data = req.json() payment.info = json.dumps(data) payment.state = OrderPayment.PAYMENT_STATE_CREATED payment.save() request.session['payment_mollie_order_secret'] = payment.order.secret return self.redirect(request, data.get('_links').get('checkout').get('href'))
def execute_payment(self, request: HttpRequest, payment: OrderPayment): try: req = self._post('Payment/v1/PaymentPage/Initialize', json=self._get_payment_page_init_body(payment)) req.raise_for_status() except HTTPError: logger.exception('Saferpay error: %s' % req.text) try: payment.info_data = req.json() except: payment.info_data = {'error': True, 'detail': req.text} payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.save() payment.order.log_action( 'pretix.event.order.payment.failed', { 'local_id': payment.local_id, 'provider': payment.provider, 'data': payment.info_data }) raise PaymentException( _('We had trouble communicating with Saferpay. Please try again and get in touch ' 'with us if this problem persists.')) data = req.json() payment.info = json.dumps(data) payment.state = OrderPayment.PAYMENT_STATE_CREATED payment.save() request.session['payment_saferpay_order_secret'] = payment.order.secret return self.redirect(request, data.get('RedirectUrl'))
def execute_payment(self, request: HttpRequest, payment: OrderPayment): self._init_api() try: source = self._create_source(request, payment) except stripe.error.StripeError as e: if e.json_body: err = e.json_body['error'] logger.exception('Stripe error: %s' % str(err)) else: err = {'message': str(e)} logger.exception('Stripe error: %s' % str(e)) payment.info_data = { 'error': True, 'message': err['message'], } payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.save() payment.order.log_action('pretix.event.order.payment.failed', { 'local_id': payment.local_id, 'provider': payment.provider, 'message': err['message'] }) raise PaymentException(_('We had trouble communicating with Stripe. Please try again and get in touch ' 'with us if this problem persists.')) ReferencedStripeObject.objects.get_or_create( reference=source.id, defaults={'order': payment.order, 'payment': payment} ) payment.info = str(source) payment.state = OrderPayment.PAYMENT_STATE_PENDING payment.save() request.session['payment_stripe_order_secret'] = payment.order.secret return self.redirect(request, source.redirect.url)
def execute_payment(self, request: HttpRequest, payment: OrderPayment): pay_data = { "NotificationURL": build_absolute_uri(self.event, 'plugins:pretix_tinkoff:webhook', kwargs={ 'payment': payment.pk }), "SuccessURL": build_absolute_uri(self.event, 'plugins:pretix_tinkoff:return', kwargs={ 'order': payment.order.code, 'payment': payment.pk, 'hash': hashlib.sha1(payment.order.secret.lower().encode()).hexdigest(), 'action': 'success' }), "FailURL": build_absolute_uri(self.event, 'plugins:pretix_tinkoff:return', kwargs={ 'order': payment.order.code, 'payment': payment.pk, 'hash': hashlib.sha1(payment.order.secret.lower().encode()).hexdigest(), 'action': 'fail' }), 'Amount': int(payment.amount * 100), 'OrderId': "{}-{}".format(self.event.slug.upper(), payment.order.code), 'Description': "Order {}-{}".format(self.event.slug.upper(), payment.order.code), 'DATA': { 'organizer': self.event.organizer.slug, 'event': self.event.slug, 'order': payment.order.code, 'payment': payment.local_id, 'order-full-code': payment.order.full_code }, 'PayType': "O" } try: req = self._init(pay_data) except HTTPError: logger.exception('Tinkoff error: %s' % req) if req['Success'] == False: logger.exception('Tinkoff error: %s' % req) payment.info_data = { 'error': True, 'detail': req } payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.save() payment.order.log_action('pretix.event.order.payment.failed', { 'local_id': payment.local_id, 'provider': payment.provider, 'data': payment.info_data }) raise PaymentException(_('We had trouble communicating with Tinkoff. Please try again and get in touch ' 'with us if this problem persists. Detail: {}'.format(req['Details']))) ReferencedTinkoffTransaction.objects.get_or_create(order=payment.order, payment=payment, reference=req['PaymentId']) LogTransaction(paymentid=req['PaymentId'], order=payment.order, payment=payment, method='get', meta_info=json.dumps(req)) payment.info = json.dumps(req) payment.state = OrderPayment.PAYMENT_STATE_CREATED logger.info('pay_request: {}'.format(pay_data)) logger.info('pay_response: {}'.format(payment.info)) payment.save(update_fields=['info']) return self.redirect(request, req['PaymentURL'])
def execute_payment(self, request: HttpRequest, payment: OrderPayment): try: # Get the correct endpoint to consume x_endpoint = self.get_settings_key('x_endpoint') if x_endpoint == 'live': url = 'https://payments.qpaypro.com/checkout/api_v1' else: url = 'https://sandbox.qpaypro.com/payment/api_v1' # Get the message body payment_body = self._get_payment_body(request, payment) # # To save the information befor send # # TO DO: to delete this action because of security issues # payment.order.log_action('pretix.event.order.payment.started', { # 'local_id': payment.local_id, # 'provider': payment.provider, # 'data': payment_body # }) # Perform the call to the endpoint req = requests.post( url, json=payment_body, ) req.raise_for_status() # Load the response to be read data = req.json() # The result is evaluated to determine the next step if not (data['result'] == 1 and data['responseCode'] == 100): raise PaymentException(data['responseText']) # To save the result payment.info = req.json() payment.confirm() except (HTTPError, PaymentException, Quota.QuotaExceededException): logger.exception('QPayPro error: %s' % req.text) try: payment.info_data = req.json() except Exception: payment.info_data = {'error': True, 'detail': req.text} payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.save() payment.order.log_action( 'pretix.event.order.payment.failed', { 'local_id': payment.local_id, 'provider': payment.provider, 'data': payment.info_data }) raise PaymentException( _('We had trouble communicating with QPayPro. Please try again and get in touch ' 'with us if this problem persists.')) return None
def execute_payment(self, request: HttpRequest, payment: OrderPayment, retry=True): try: if '_links' in payment.info_data: if request: return self.redirect( request, payment.info_data.get('_links').get('checkout').get( 'href')) else: return except: pass try: req = requests.post('https://api.mollie.com/v2/payments', json=self._get_payment_body(payment), headers=self.request_headers) req.raise_for_status() except HTTPError: logger.exception('Mollie error: %s' % req.text) try: d = req.json() if d.get('status') == 401 and retry: # Token might be expired, let's retry! if refresh_mollie_token(self.event, False): return self.execute_payment(request, payment, retry=False) except: d = {'error': True, 'detail': req.text} payment.fail(info=d) raise PaymentException( _('We had trouble communicating with Mollie. Please try again and get in touch ' 'with us if this problem persists.')) data = req.json() payment.info = json.dumps(data) payment.state = OrderPayment.PAYMENT_STATE_CREATED payment.save() if request: request.session[ 'payment_mollie_order_secret'] = payment.order.secret return self.redirect( request, data.get('_links').get('checkout').get('href')) else: return
def _handle_resultcode(self, payment: OrderPayment): payment_info = json.loads(payment.info) if payment_info['resultCode'] in [ 'AuthenticationFinished', 'ChallengeShopper', 'IdentifyShopper', 'PresentToShopper', 'Received', 'RedirectShopper', ]: # At this point, the payment has already been created - so no need to set the status or log it again # payment.state = OrderPayment.PAYMENT_STATE_CREATED pass elif payment_info['resultCode'] in ['Error', 'Refused']: payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.save(update_fields=['state']) payment.order.log_action('pretix.event.order.payment.failed', { 'local_id': payment.local_id, 'provider': payment.provider }) elif payment_info['resultCode'] == 'Cancelled': payment.state = OrderPayment.PAYMENT_STATE_CANCELED payment.save(update_fields=['state']) payment.order.log_action('pretix.event.order.payment.canceled', { 'local_id': payment.local_id, 'provider': payment.provider }) elif payment_info['resultCode'] == 'Pending': payment.state = OrderPayment.PAYMENT_STATE_PENDING payment.save(update_fields=['state']) # Nothing we can log here... elif payment_info['resultCode'] == 'Authorised': payment.confirm() return payment.state
def execute_payment(self, request: HttpRequest, payment: OrderPayment): self._init_api() if request.session['payment_stripe_token'].startswith('src_'): try: src = stripe.Source.retrieve(request.session['payment_stripe_token'], **self.api_kwargs) if src.type == 'card' and src.card and self._use_3ds(src.card): request.session['payment_stripe_order_secret'] = payment.order.secret source = stripe.Source.create( type='three_d_secure', amount=self._get_amount(payment), currency=self.event.currency.lower(), three_d_secure={ 'card': src.id }, statement_descriptor=ugettext('{event}-{code}').format( event=self.event.slug.upper(), code=payment.order.code )[:22], metadata={ 'order': str(payment.order.id), 'event': self.event.id, 'code': payment.order.code }, redirect={ 'return_url': build_absolute_uri(self.event, 'plugins:stripe:return', kwargs={ 'order': payment.order.code, 'payment': payment.pk, 'hash': hashlib.sha1(payment.order.secret.lower().encode()).hexdigest(), }) }, **self.api_kwargs ) ReferencedStripeObject.objects.get_or_create( reference=source.id, defaults={'order': payment.order, 'payment': payment} ) if source.status == "pending": payment.info = str(source) payment.state = OrderPayment.PAYMENT_STATE_PENDING payment.save() return self.redirect(request, source.redirect.url) except stripe.error.StripeError as e: if e.json_body: err = e.json_body['error'] logger.exception('Stripe error: %s' % str(err)) else: err = {'message': str(e)} logger.exception('Stripe error: %s' % str(e)) payment.info_data = { 'error': True, 'message': err['message'], } payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.save() raise PaymentException(_('We had trouble communicating with Stripe. Please try again and get in touch ' 'with us if this problem persists.')) try: self._charge_source(request, request.session['payment_stripe_token'], payment) finally: del request.session['payment_stripe_token']
def execute_payment(self, request: HttpRequest, payment: OrderPayment): self._init_api() if request.session['payment_stripe_token'].startswith('src_'): try: src = stripe.Source.retrieve(request.session['payment_stripe_token'], **self.api_kwargs) if src.type == 'card' and src.card and self._use_3ds(src.card): request.session['payment_stripe_order_secret'] = payment.order.secret source = stripe.Source.create( type='three_d_secure', amount=self._get_amount(payment), currency=self.event.currency.lower(), three_d_secure={ 'card': src.id }, statement_descriptor=ugettext('{event}-{code}').format( event=self.event.slug.upper(), code=payment.order.code )[:22], metadata={ 'order': str(payment.order.id), 'event': self.event.id, 'code': payment.order.code }, redirect={ 'return_url': build_absolute_uri(self.event, 'plugins:stripe:return', kwargs={ 'order': payment.order.code, 'payment': payment.pk, 'hash': hashlib.sha1(payment.order.secret.lower().encode()).hexdigest(), }) }, **self.api_kwargs ) ReferencedStripeObject.objects.get_or_create( reference=source.id, defaults={'order': payment.order, 'payment': payment} ) if source.status == "pending": payment.info = str(source) payment.state = OrderPayment.PAYMENT_STATE_PENDING payment.save() return self.redirect(request, source.redirect.url) except stripe.error.StripeError as e: if e.json_body: err = e.json_body['error'] logger.exception('Stripe error: %s' % str(err)) else: err = {'message': str(e)} logger.exception('Stripe error: %s' % str(e)) payment.info_data = { 'error': True, 'message': err['message'], } payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.save() payment.order.log_action('pretix.event.order.payment.failed', { 'local_id': payment.local_id, 'provider': payment.provider, 'message': err['message'] }) raise PaymentException(_('We had trouble communicating with Stripe. Please try again and get in touch ' 'with us if this problem persists.')) try: self._charge_source(request, request.session['payment_stripe_token'], payment) finally: del request.session['payment_stripe_token']
def execute_payment(self, request: HttpRequest, payment: OrderPayment): self._init_api() try: payment_method_data = json.loads(request.session['{}-{}'.format( 'payment_adyen_paymentMethodData', self.method)]) rqdata = { 'amount': { 'value': self._get_amount(payment), 'currency': self.event.currency, }, 'merchantOrderReference': '{event}-{code}'.format(event=self.event.slug.upper(), code=payment.order.code), 'reference': '{event}-{code}-P-{payment}'.format( event=self.event.slug.upper(), code=payment.order.code, payment=payment.local_id), 'shopperStatement': self.statement_descriptor(payment), 'paymentMethod': payment_method_data['paymentMethod'], 'returnUrl': build_absolute_uri( self.event, 'plugins:pretix_adyen:return', kwargs={ 'order': payment.order.code, 'payment': payment.pk, 'hash': hashlib.sha1( payment.order.secret.lower().encode()).hexdigest(), }), 'channel': 'Web', 'origin': settings.SITE_URL, 'captureDelayHours': 0, 'shopperInteraction': 'Ecommerce', **self.api_kwargs } if self.method == "scheme": rqdata['additionalData'] = {'allow3DS2': 'true'} rqdata['browserInfo'] = payment_method_data['browserInfo'] # Since we do not have the IP-address of the customer, we cannot pass rqdata['shopperIP']. try: result = self.adyen.checkout.payments(rqdata) except AdyenError as e: logger.exception('Adyen error: %s' % str(e)) payment.state = OrderPayment.PAYMENT_STATE_FAILED payment.info = json.dumps({ 'refusalReason': json.loads(e.raw_response or {}).get('message', '') }) payment.save() payment.order.log_action( 'pretix.event.order.payment.failed', { 'local_id': payment.local_id, 'provider': payment.provider, 'message': json.loads(e.raw_response or {}).get('message', '') }) raise PaymentException( _('We had trouble communicating with Adyen. Please try again and get in touch ' 'with us if this problem persists.')) if 'action' in result.message: payment.info = json.dumps(result.message) payment.state = OrderPayment.PAYMENT_STATE_CREATED payment.save() payment.order.log_action('pretix.event.order.payment.started', { 'local_id': payment.local_id, 'provider': payment.provider }) return build_absolute_uri( self.event, 'plugins:pretix_adyen:sca', kwargs={ 'order': payment.order.code, 'payment': payment.pk, 'hash': hashlib.sha1( payment.order.secret.lower().encode()).hexdigest(), }) else: payment.info = json.dumps(result.message) payment.save() self._handle_resultcode(payment) finally: del request.session['{}-{}'.format( 'payment_adyen_paymentMethodData', self.method)]