2018-01-16 06:58:15 +01:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import logging
|
|
|
|
import pprint
|
|
|
|
import werkzeug
|
|
|
|
|
2018-01-16 11:34:37 +01:00
|
|
|
from flectra import http
|
|
|
|
from flectra.http import request
|
2018-01-16 06:58:15 +01:00
|
|
|
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
class StripeController(http.Controller):
|
|
|
|
|
|
|
|
@http.route(['/payment/stripe/s2s/create_json'], type='json', auth='public')
|
|
|
|
def stripe_s2s_create_json(self, **kwargs):
|
|
|
|
acquirer_id = int(kwargs.get('acquirer_id'))
|
|
|
|
acquirer = request.env['payment.acquirer'].browse(acquirer_id)
|
2018-04-05 10:25:40 +02:00
|
|
|
if not kwargs.get('partner_id'):
|
|
|
|
kwargs = dict(kwargs, partner_id=request.env.user.partner_id.id)
|
2018-01-16 06:58:15 +01:00
|
|
|
return acquirer.s2s_process(kwargs).id
|
|
|
|
|
|
|
|
@http.route(['/payment/stripe/s2s/create'], type='http', auth='public')
|
|
|
|
def stripe_s2s_create(self, **post):
|
|
|
|
acquirer_id = int(post.get('acquirer_id'))
|
|
|
|
acquirer = request.env['payment.acquirer'].browse(acquirer_id)
|
|
|
|
error = None
|
|
|
|
try:
|
|
|
|
acquirer.s2s_process(post)
|
|
|
|
except Exception as e:
|
|
|
|
error = e.message
|
|
|
|
|
|
|
|
return_url = post.get('return_url', '/')
|
|
|
|
if error:
|
|
|
|
separator = '?' if werkzeug.urls.url_parse(return_url).query == '' else '&'
|
|
|
|
return_url += '{}{}'.format(separator, werkzeug.urls.url_encode({'error': error}))
|
|
|
|
|
|
|
|
return werkzeug.utils.redirect(return_url)
|
|
|
|
|
|
|
|
@http.route(['/payment/stripe/s2s/create_json_3ds'], type='json', auth='public', csrf=False)
|
|
|
|
def stripe_s2s_create_json_3ds(self, verify_validity=False, **kwargs):
|
2018-04-05 10:25:40 +02:00
|
|
|
if not kwargs.get('partner_id'):
|
|
|
|
kwargs = dict(kwargs, partner_id=request.env.user.partner_id.id)
|
2018-01-16 06:58:15 +01:00
|
|
|
token = request.env['payment.acquirer'].browse(int(kwargs.get('acquirer_id'))).s2s_process(kwargs)
|
|
|
|
|
|
|
|
if not token:
|
|
|
|
res = {
|
|
|
|
'result': False,
|
|
|
|
}
|
|
|
|
return res
|
|
|
|
|
|
|
|
res = {
|
|
|
|
'result': True,
|
|
|
|
'id': token.id,
|
|
|
|
'short_name': token.short_name,
|
|
|
|
'3d_secure': False,
|
|
|
|
'verified': False,
|
|
|
|
}
|
|
|
|
|
|
|
|
if verify_validity != False:
|
|
|
|
token.validate()
|
|
|
|
res['verified'] = token.verified
|
|
|
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
@http.route(['/payment/stripe/create_charge'], type='json', auth='public')
|
|
|
|
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')
|
|
|
|
return post.pop('return_url', '/')
|