52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import logging
|
|
import pprint
|
|
|
|
from odoo import _, fields, models
|
|
from odoo.exceptions import ValidationError
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class PaymentToken(models.Model):
|
|
_inherit = 'payment.token'
|
|
|
|
stripe_payment_method = fields.Char(string="Stripe Payment Method ID", readonly=True)
|
|
stripe_mandate = fields.Char(string="Stripe Mandate", readonly=True)
|
|
|
|
def _stripe_sca_migrate_customer(self):
|
|
""" Migrate a token from the old implementation of Stripe to the SCA-compliant one.
|
|
|
|
In the old implementation, it was possible to create a Charge by giving only the customer id
|
|
and let Stripe use the default source (= default payment method). Stripe now requires to
|
|
specify the payment method for each new PaymentIntent. To do so, we fetch the payment method
|
|
associated to a customer and save its id on the token.
|
|
This migration happens once per token created with the old implementation.
|
|
|
|
Note: self.ensure_one()
|
|
|
|
:return: None
|
|
"""
|
|
self.ensure_one()
|
|
|
|
# Fetch the available payment method of type 'card' for the given customer
|
|
response_content = self.provider_id._stripe_make_request(
|
|
'payment_methods',
|
|
payload={
|
|
'customer': self.provider_ref,
|
|
'type': 'card',
|
|
'limit': 1, # A new customer is created for each new token. Never > 1 card.
|
|
},
|
|
method='GET'
|
|
)
|
|
_logger.info("received payment_methods response:\n%s", pprint.pformat(response_content))
|
|
|
|
# Store the payment method ID on the token
|
|
payment_methods = response_content.get('data', [])
|
|
payment_method_id = payment_methods and payment_methods[0].get('id')
|
|
if not payment_method_id:
|
|
raise ValidationError("Stripe: " + _("Unable to convert payment token to new API."))
|
|
self.stripe_payment_method = payment_method_id
|
|
_logger.info("converted token with id %s to new API", self.id)
|