You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Odoo18自定义支付网关调用_set_done()未生成支付及更新状态问题

Odoo18自定义支付提供商:交易标记Done后未生成Account Payment的解决方法

问题核心

调用tx._set_done()仅更新了交易状态为done,但未触发Odoo内置的后处理流程——生成account.payment、更新订单/发票支付状态、设置tx.is_post_processed = True。这是因为_set_done()本身只负责状态变更,不包含后续业务逻辑。

解决方案

在调用_set_done()后,手动触发Odoo的交易后处理方法_post_process_after_done(),同时确保关键字段的正确性:

  1. 触发后处理流程
    修改状态更新代码,在_set_done()后添加_post_process_after_done()调用。该方法是Stripe、PayPal等标准提供商完成交易后自动执行的核心逻辑,会负责:

    • 创建关联的account.payment记录
    • 标记销售订单/发票为已支付状态
    • tx.is_post_processed设置为True
  2. 确保交易参考号已赋值
    Odoo的后处理流程依赖provider_reference字段(支付网关返回的唯一交易ID)来避免重复处理,需在调用_set_done()前完成赋值。

修改后的完整代码片段

if self.state != 'done':
    if status == 'COMPLETED':
        # 替换为支付网关返回的唯一交易ID
        self.provider_reference = "PAYMENT_GATEWAY_TRANSACTION_ID"
        self._set_done()
        # 触发交易后处理逻辑
        self._post_process_after_done()
    elif status in ('FAILED', 'CANCELED'):
        self._set_error("Square Payment Failed or Cancelled.")
    else:
        self._set_pending()

额外检查项

  • 确认关联的销售订单处于sale状态,或发票处于posted状态,否则后处理流程无法正常创建支付记录
  • 检查支付提供商的配置中,是否开启了自动对账相关的选项(若涉及)

内容的提问来源于stack exchange,提问作者Syed Mushahid

火山引擎 最新活动