[FIX] payment_stripe: Correct Afterpay shipping info

Resolves an issue with Afterpay via Stripe not receiving correct
shipping address details, causing transaction failures. Now,
ensures shipping address from the order or invoice is accurately
sent to Stripe if we have it.

opw-3419984

closes odoo/odoo#160300

Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
This commit is contained in:
mathysPaul
2024-04-08 07:35:54 +00:00
parent e9a8baf95e
commit d9b6faea4d
2 changed files with 41 additions and 0 deletions
@@ -10,6 +10,7 @@ from odoo.exceptions import UserError, ValidationError
from odoo.addons.payment import utils as payment_utils
from odoo.addons.payment_stripe import const
from odoo.addons.payment_stripe import utils as stripe_utils
from odoo.addons.payment_stripe.controllers.main import StripeController
@@ -151,6 +152,7 @@ class PaymentTransaction(models.Model):
payment_method_type, payment_method_type
),
'expand[]': 'payment_method',
**stripe_utils.include_shipping_address(self),
}
if self.operation in ['online_token', 'offline']:
if not self.token_id.stripe_payment_method: # Pre-SCA token, migrate it.
+39
View File
@@ -37,3 +37,42 @@ def get_webhook_secret(provider_sudo):
:rtype: str
"""
return provider_sudo.stripe_webhook_secret
def include_shipping_address(tx_sudo):
""" Include the shipping address of the related sales order or invoice to the payload of the API
request. If no related sales order or invoice exists, the addres is not included.
Note: `self.ensure_one()`
:param payment.transaction tx_sudo: The sudoed transaction of the payment.
:return: The subset of the API payload that includes the billing and delivery addresses.
:rtype: dict
"""
tx_sudo.ensure_one()
if 'sale_order_ids' in tx_sudo._fields and tx_sudo.sale_order_ids:
order = tx_sudo.sale_order_ids[:1]
return format_shipping_address(order.partner_shipping_id)
elif 'invoice_ids' in tx_sudo._fields and tx_sudo.invoice_ids:
invoice = tx_sudo.invoice_ids[:1]
return format_shipping_address(invoice.partner_shipping_id)
return {}
def format_shipping_address(shipping_partner):
""" Format the shipping address to comply with the payload structure of the API request.
:param res.partner shipping_partner: The shipping partner.
:return: The formatted shipping address.
:rtype: dict
"""
return {
'shipping[address][city]': shipping_partner.city,
'shipping[address][country]': shipping_partner.country_id.code,
'shipping[address][line1]': shipping_partner.street,
'shipping[address][line2]': shipping_partner.street2,
'shipping[address][postal_code]': shipping_partner.zip,
'shipping[address][state]': shipping_partner.state_id.name,
'shipping[name]': shipping_partner.name or shipping_partner.parent_id.name,
}