Allow configuring a webhook in Stripe to send s2s notifications to Odoo when a Checkout payment is completed. Note that SetupIntent and PaymentIntent events are not listened to, since they are handled 'live' with the customer actively present; the main use case for Stripe webhooks is a Checkout session that gets interrupted before the customer is redirected to Odoo (e.g. network loss, browser crash, closing the tab, etc.) The webhook should be configured to send its events to <base_url>/payment/stripe/webhook and should only subscribe to checkout.session.completed events to avoid spamming the Odoo server with useless notifications. closes odoo/odoo#52754 Signed-off-by: Damien Bouvy (dbo) <dbo@odoo.com>
62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
import json
|
|
import logging
|
|
import pprint
|
|
import werkzeug
|
|
|
|
from odoo import http
|
|
from odoo.http import request
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class StripeController(http.Controller):
|
|
_success_url = '/payment/stripe/success'
|
|
_cancel_url = '/payment/stripe/cancel'
|
|
|
|
@http.route(['/payment/stripe/success', '/payment/stripe/cancel'], type='http', auth='public')
|
|
def stripe_success(self, **kwargs):
|
|
request.env['payment.transaction'].sudo().form_feedback(kwargs, 'stripe')
|
|
return werkzeug.utils.redirect('/payment/process')
|
|
|
|
@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):
|
|
if not kwargs.get('partner_id'):
|
|
kwargs = dict(kwargs, partner_id=request.env.user.partner_id.id)
|
|
token = request.env['payment.acquirer'].browse(int(kwargs.get('acquirer_id'))).with_context(stripe_manual_payment=True).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/s2s/create_setup_intent', type='json', auth='public', csrf=False)
|
|
def stripe_s2s_create_setup_intent(self, acquirer_id, **kwargs):
|
|
acquirer = request.env['payment.acquirer'].browse(int(acquirer_id))
|
|
res = acquirer.with_context(stripe_manual_payment=True)._create_setup_intent(kwargs)
|
|
return res.get('client_secret')
|
|
|
|
@http.route('/payment/stripe/s2s/process_payment_intent', type='json', auth='public', csrf=False)
|
|
def stripe_s2s_process_payment_intent(self, **post):
|
|
return request.env['payment.transaction'].sudo().form_feedback(post, 'stripe')
|
|
|
|
@http.route('/payment/stripe/webhook', type='json', auth='public', csrf=False)
|
|
def stripe_webhook(self, **kwargs):
|
|
data = json.loads(request.httprequest.data)
|
|
request.env['payment.acquirer'].sudo()._handle_stripe_webhook(data)
|
|
return 'OK' |