def ogone_s2s_create(self, **post): error = '' acq = request.env['payment.acquirer'].browse( int(post.get('acquirer_id'))) try: token = acq.s2s_process(post) except Exception as e: # synthax error: 'CHECK ERROR: |Not a valid date\n\n50001111: None' token = False error = str(e).splitlines()[0].split('|')[-1] or '' if token and post.get('verify_validity'): baseurl = request.env['ir.config_parameter'].sudo().get_param( 'web.base.url') params = { 'accept_url': baseurl + '/payment/ogone/validate/accept', 'decline_url': baseurl + '/payment/ogone/validate/decline', 'exception_url': baseurl + '/payment/ogone/validate/exception', 'return_url': post.get('return_url', baseurl) } tx = token.validate(**params) if tx and tx.html_3ds: return tx.html_3ds # add the payment transaction into the session to let the page /payment/process to handle it PaymentProcessing.add_payment_transaction(tx) return werkzeug.utils.redirect("/payment/process")
def invoice_pay_form(self, acquirer_id, invoice_id, save_token=False, access_token=None, **kwargs): """ Json method that creates a payment.transaction, used to create a transaction when the user clicks on 'pay now' button on the payment form. :return html: form containing all values related to the acquirer to redirect customers to the acquirer website """ invoice_sudo = request.env['account.invoice'].sudo().browse(invoice_id) if not invoice_sudo: return False try: acquirer_id = int(acquirer_id) except: return False if request.env.user._is_public(): save_token = False # we avoid to create a token for the public user success_url = kwargs.get( 'success_url', "%s?%s" % (invoice_sudo.access_url, url_encode( {'access_token': access_token}) if access_token else '')) vals = { 'acquirer_id': acquirer_id, 'return_url': success_url, } if save_token: vals['type'] = 'form_save' transaction = invoice_sudo._create_payment_transaction(vals) PaymentProcessing.add_payment_transaction(transaction) return transaction.render_invoice_button( invoice_sudo, submit_txt=_('Pay & Confirm'), render_values={ 'type': 'form_save' if save_token else 'form', 'alias_usage': _('If we store your payment information on our server, subscription payments will be made automatically.' ), })
def payment_transaction_token(self, acquirer_id, order_id, save_token=False, access_token=None, **kwargs): """ Json method that creates a payment.transaction, used to create a transaction when the user clicks on 'pay now' button. After having created the transaction, the event continues and the user is redirected to the acquirer website. :param int acquirer_id: id of a payment.acquirer record. If not set the user is redirected to the checkout page """ # Ensure a payment acquirer is selected if not acquirer_id: return False try: acquirer_id = int(acquirer_id) except: return False order = request.env['sale.order'].sudo().browse(order_id) if not order or not order.order_line or not order.has_to_be_paid(): return False # Create transaction vals = { 'acquirer_id': acquirer_id, 'type': order._get_payment_type(), 'return_url': order.get_portal_url(), } transaction = order._create_payment_transaction(vals) PaymentProcessing.add_payment_transaction(transaction) return transaction.render_sale_button( order, submit_txt=_('Pay & Confirm'), render_values={ 'type': order._get_payment_type(), 'alias_usage': _('If we store your payment information on our server, subscription payments will be made automatically.' ), })
def stripe_create_charge(self, **post): """ Create a payment transaction Expects the result from the user input from checkout.js popup""" TX = request.env['payment.transaction'] tx = None if post.get('tx_ref'): tx = TX.sudo().search([('reference', '=', post['tx_ref'])]) if not tx: tx_id = (post.get('tx_id') or request.session.get('sale_transaction_id') or request.session.get('website_payment_tx_id')) tx = TX.sudo().browse(int(tx_id)) if not tx: raise werkzeug.exceptions.NotFound() stripe_token = post['token'] response = None if tx.type == 'form_save' and tx.partner_id: payment_token_id = request.env['payment.token'].sudo().create({ 'acquirer_id': tx.acquirer_id.id, 'partner_id': tx.partner_id.id, 'stripe_token': stripe_token }) tx.payment_token_id = payment_token_id response = tx._create_stripe_charge( acquirer_ref=payment_token_id.acquirer_ref, email=stripe_token['email']) else: response = tx._create_stripe_charge(tokenid=stripe_token['id'], email=stripe_token['email']) _logger.info('Stripe: entering form_feedback with post data %s', pprint.pformat(response)) if response: request.env['payment.transaction'].sudo().with_context( lang=None).form_feedback(response, 'stripe') # add the payment transaction into the session to let the page /payment/process to handle it PaymentProcessing.add_payment_transaction(tx) return "/payment/process"
def invoice_pay_token(self, invoice_id, pm_id=None, **kwargs): """ Use a token to perform a s2s transaction """ error_url = kwargs.get('error_url', '/my') access_token = kwargs.get('access_token') params = {} if access_token: params['access_token'] = access_token invoice_sudo = request.env['account.invoice'].sudo().browse( invoice_id).exists() if not invoice_sudo: params['error'] = 'pay_invoice_invalid_doc' return request.redirect(_build_url_w_params(error_url, params)) success_url = kwargs.get( 'success_url', "%s?%s" % (invoice_sudo.access_url, url_encode( {'access_token': access_token}) if access_token else '')) try: token = request.env['payment.token'].sudo().browse(int(pm_id)) except (ValueError, TypeError): token = False token_owner = invoice_sudo.partner_id if request.env.user._is_public( ) else request.env.user.partner_id if not token or token.partner_id != token_owner: params['error'] = 'pay_invoice_invalid_token' return request.redirect(_build_url_w_params(error_url, params)) vals = { 'payment_token_id': token.id, 'type': 'server2server', 'return_url': _build_url_w_params(success_url, params), } tx = invoice_sudo._create_payment_transaction(vals) PaymentProcessing.add_payment_transaction(tx) params['success'] = 'pay_invoice' return request.redirect('/payment/process')
def portal_my_invoice_detail(self, invoice_id, access_token=None, report_type=None, download=False, **kw): try: invoice_sudo = self._document_check_access('account.invoice', invoice_id, access_token) except (AccessError, MissingError): return request.redirect('/my') if report_type in ('html', 'pdf', 'text'): return self._show_report(model=invoice_sudo, report_type=report_type, report_ref='account.account_invoices', download=download) values = self._invoice_get_page_view_values(invoice_sudo, access_token, **kw) PaymentProcessing.remove_payment_transaction( invoice_sudo.transaction_ids) return request.render("account.portal_invoice_page", values)
def payment_token(self, order_id, pm_id=None, **kwargs): order = request.env['sale.order'].sudo().browse(order_id) if not order: return request.redirect("/my/orders") if not order.order_line or pm_id is None or not order.has_to_be_paid(): return request.redirect(order.get_portal_url()) # try to convert pm_id into an integer, if it doesn't work redirect the user to the quote try: pm_id = int(pm_id) except ValueError: return request.redirect(order.get_portal_url()) # Create transaction vals = { 'payment_token_id': pm_id, 'type': 'server2server', 'return_url': order.get_portal_url(), } tx = order._create_payment_transaction(vals) PaymentProcessing.add_payment_transaction(tx) return request.redirect('/payment/process')