In 8.0 private fields have been recently set as visible only to employees
at commit b226510840.
However between v9 and v10 two new payment acquirers have been implemented
payumoney and stripe. Those addons now have their credential set as private.
Methods using the acquirers have been sudoed accordingly to avoid access
issues when rendering the buttons. Other payment modules will be updated when
the forward port from 8 to 9 and pre-10-master will be done.
86 lines
4.4 KiB
Python
86 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import http, _
|
|
from odoo.http import request
|
|
|
|
|
|
class WebsitePayment(http.Controller):
|
|
@http.route(['/my/payment_method'], type='http', auth="user", website=True)
|
|
def payment_method(self, **kwargs):
|
|
acquirers = list(request.env['payment.acquirer'].search([('website_published', '=', True), ('registration_view_template_id', '!=', False)]))
|
|
partner = request.env.user.partner_id
|
|
payment_tokens = partner.payment_token_ids
|
|
payment_tokens |= partner.commercial_partner_id.sudo().payment_token_ids
|
|
values = {
|
|
'pms': payment_tokens,
|
|
'acquirers': acquirers
|
|
}
|
|
return_url = request.params.get('redirect', '/my/payment_method')
|
|
for acquirer in acquirers:
|
|
acquirer.form = acquirer.sudo()._registration_render(request.env.user.partner_id.id, {'error': {}, 'error_message': [], 'return_url': return_url, 'json': False, 'bootstrap_formatting': True})
|
|
return request.render("website_payment.pay_methods", values)
|
|
|
|
@http.route(['/website_payment/delete/'], methods=['POST'], type='http', auth="user", website=True)
|
|
def delete(self, delete_pm_id=None):
|
|
if delete_pm_id:
|
|
pay_meth = request.env['payment.token'].browse(int(delete_pm_id))
|
|
pay_meth.unlink()
|
|
return request.redirect('/my/payment_method')
|
|
|
|
@http.route(['/website_payment/pay'], type='http', auth='public', website=True)
|
|
def pay(self, reference='', amount=False, currency_id=None, acquirer_id=None, **kw):
|
|
env = request.env
|
|
user = env.user.sudo()
|
|
|
|
currency_id = currency_id and int(currency_id) or user.company_id.currency_id.id
|
|
currency = env['res.currency'].browse(currency_id)
|
|
|
|
# Try default one then fallback on first
|
|
acquirer_id = acquirer_id and int(acquirer_id) or \
|
|
env['ir.values'].get_default('payment.transaction', 'acquirer_id', company_id=user.company_id.id) or \
|
|
env['payment.acquirer'].search([('website_published', '=', True), ('company_id', '=', user.company_id.id)])[0].id
|
|
|
|
acquirer = env['payment.acquirer'].with_context(submit_class='btn btn-primary pull-right',
|
|
submit_txt=_('Pay Now')).browse(acquirer_id)
|
|
# auto-increment reference with a number suffix if the reference already exists
|
|
reference = request.env['payment.transaction'].get_next_reference(reference)
|
|
|
|
partner_id = user.partner_id.id if user.partner_id.id != request.website.partner_id.id else False
|
|
|
|
payment_form = acquirer.sudo().render(reference, float(amount), currency.id, values={'return_url': '/website_payment/confirm', 'partner_id': partner_id})
|
|
values = {
|
|
'reference': reference,
|
|
'acquirer': acquirer,
|
|
'currency': currency,
|
|
'amount': float(amount),
|
|
'payment_form': payment_form,
|
|
}
|
|
return request.render('website_payment.pay', values)
|
|
|
|
@http.route(['/website_payment/transaction'], type='json', auth="public", website=True)
|
|
def transaction(self, reference, amount, currency_id, acquirer_id):
|
|
partner_id = request.env.user.partner_id.id if request.env.user.partner_id != request.website.partner_id else False
|
|
values = {
|
|
'acquirer_id': int(acquirer_id),
|
|
'reference': reference,
|
|
'amount': float(amount),
|
|
'currency_id': int(currency_id),
|
|
'partner_id': partner_id,
|
|
}
|
|
|
|
tx = request.env['payment.transaction'].sudo().create(values)
|
|
request.session['website_payment_tx_id'] = tx.id
|
|
return tx.id
|
|
|
|
@http.route(['/website_payment/confirm'], type='http', auth='public', website=True)
|
|
def confirm(self, **kw):
|
|
tx_id = request.session.pop('website_payment_tx_id', False)
|
|
if tx_id:
|
|
tx = request.env['payment.transaction'].browse(tx_id)
|
|
status = (tx.state == 'done' and 'success') or 'danger'
|
|
message = (tx.state == 'done' and 'Your payment was successful! It may take some time to be validated on our end.') or 'OOps! There was a problem with your payment.'
|
|
return request.render('website_payment.confirm', {'tx': tx, 'status': status, 'message': message})
|
|
else:
|
|
return request.redirect('/my/home')
|