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(),同时确保关键字段的正确性:
触发后处理流程
修改状态更新代码,在_set_done()后添加_post_process_after_done()调用。该方法是Stripe、PayPal等标准提供商完成交易后自动执行的核心逻辑,会负责:- 创建关联的
account.payment记录 - 标记销售订单/发票为已支付状态
- 将
tx.is_post_processed设置为True
- 创建关联的
确保交易参考号已赋值
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




