如何在Odoo 15中高效从ASP.NET电商网站采集发票数据并创建日记账?
解决方案:ASP.NET 电商网站同步发票至 Odoo 15 会计模块
针对你提到的 ASP.NET 电商网站向 Odoo 15 会计模块同步发票并创建对应日记账的需求,以下是几个高效简便的实现方案,避开官方文档提到的 XML-RPC 对 ASP.NET 的支持问题:
方案一:使用 Odoo REST API(推荐)
Odoo 15 支持 REST API 接口,这对 ASP.NET 来说是更友好的选择,无需依赖特定的 XML-RPC 库,直接用 HttpClient 即可完成交互:
- 认证方式:使用 Basic Auth,将 Odoo 用户名和 API 密钥(在用户设置中生成)进行 Base64 编码后放入请求头
- 核心步骤:
- 先创建日记账(如果需要自定义而非使用默认日记账):调用
account.journal模型的create方法,传入名称、类型等参数 - 创建发票:调用
account.move模型的create方法,关联刚创建的日记账 ID,同时传入发票的客户、金额、明细等数据
- 先创建日记账(如果需要自定义而非使用默认日记账):调用
- 示例代码片段:
using System.Net.Http; using System.Text; using System.Text.Json; var httpClient = new HttpClient(); var authToken = Convert.ToBase64String(Encoding.ASCII.GetBytes("your-odoo-username:your-api-key")); httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", authToken); // 创建日记账 var journalPayload = new { name = "电商订单日记账", type = "sale", code = "ECOM-SALE", company_id = 1 // 替换为你的公司ID }; var journalContent = new StringContent(JsonSerializer.Serialize(journalPayload), Encoding.UTF8, "application/json"); var journalResponse = await httpClient.PostAsync("https://your-odoo-instance/api/v2/object/account.journal/create", journalContent); var journalResult = await journalResponse.Content.ReadFromJsonAsync<Dictionary<string, object>>(); var journalId = (int)journalResult["id"]; // 创建发票 var invoicePayload = new { partner_id = 23, // 替换为对应客户ID journal_id = journalId, move_type = "out_invoice", invoice_line_ids = new[] { new { product_id = 45, // 替换为对应产品ID quantity = 1, price_unit = 99.99 } } }; var invoiceContent = new StringContent(JsonSerializer.Serialize(invoicePayload), Encoding.UTF8, "application/json"); var invoiceResponse = await httpClient.PostAsync("https://your-odoo-instance/api/v2/object/account.move/create", invoiceContent);
方案二:使用第三方 XML-RPC 库
Odoo 官方未提供 ASP.NET 的 XML-RPC SDK,但 XML-RPC 是标准协议,可通过第三方 NuGet 库实现交互,推荐使用 CookComputing.XmlRpcV2:
- 步骤:
- 安装 NuGet 包:
Install-Package CookComputing.XmlRpcV2 - 定义 Odoo XML-RPC 接口的代理类,对应 Odoo 的
execute_kw方法 - 实例化代理类,传入 Odoo 实例地址,调用方法完成发票和日记账的创建
- 安装 NuGet 包:
- 示例代码片段:
using CookComputing.XmlRpc; public interface IOdooXmlRpc : IXmlRpcProxy { [XmlRpcMethod("execute_kw")] object ExecuteKw(string db, int uid, string password, string model, string method, object[] args, Dictionary<string, object> kwargs); } // 初始化代理 var proxy = XmlRpcProxyGen.Create<IOdooXmlRpc>(); proxy.Url = "https://your-odoo-instance/xmlrpc/2/object"; // 认证获取UID(如果未提前获取) var authProxy = XmlRpcProxyGen.Create<IOdooXmlRpc>(); authProxy.Url = "https://your-odoo-instance/xmlrpc/2/common"; var uid = (int)authProxy.ExecuteKw("your-db-name", null, null, "authenticate", new object[] { "your-db-name", "username", "password", new Dictionary<string, object>() }, null); // 创建日记账 var journalArgs = new object[] { new Dictionary<string, object> { { "name", "电商订单日记账" }, { "type", "sale" }, { "code", "ECOM-SALE" }, { "company_id", 1 } } }; var journalId = (int)proxy.ExecuteKw("your-db-name", uid, "password", "account.journal", "create", journalArgs, null); // 创建发票 var invoiceArgs = new object[] { new Dictionary<string, object> { { "partner_id", 23 }, { "journal_id", journalId }, { "move_type", "out_invoice" }, { "invoice_line_ids", new[] { new object[] { 0, 0, new Dictionary<string, object> { { "product_id", 45 }, { "quantity", 1 }, { "price_unit", 99.99 } } } } } } }; var invoiceId = (int)proxy.ExecuteKw("your-db-name", uid, "password", "account.move", "create", invoiceArgs, null);
方案三:中间层服务(适合复杂场景)
如果上述两种方案不符合你的需求,可搭建一个轻量中间层(比如用 Python),作为 ASP.NET 和 Odoo 的桥梁:
- ASP.NET 通过 REST 请求将发票数据发送到中间层服务
- 中间层服务使用 Odoo 官方支持的 Python XML-RPC 库与 Odoo 交互,完成日记账和发票的创建
- 优势:隔离 ASP.NET 与 Odoo 的直接交互,便于后续扩展和维护
内容的提问来源于stack exchange,提问作者Mahfujul Hasan
相关产品推荐
相关产品推荐

