You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xero API:updateOrCreateInvoices接口覆盖联系人详情问题求助

Xero API updateOrCreateInvoices接口联系人字段覆盖问题解决

问题背景

使用PHP(OAuth2)对接Xero Accounting API,通过updateOrCreateInvoices接口同步交易数据时,每次调用接口都会导致联系人详情中的**"additional persons"字段**被覆盖或清空。

接口行为逻辑

Xero的updateOrCreateInvoices接口处理发票关联联系人时,遵循全量覆盖逻辑:

  • 若请求中传入完整的联系人对象(包含ContactID外的其他字段),接口会用传入的对象信息覆盖Xero已有的联系人记录,而非增量更新。
  • 当你从Xero获取完整联系人对象传入接口时,若该对象未包含"additional persons"字段(比如API返回数据默认不携带、或获取时遗漏),接口会判定为需要清空该字段的值。

解决方案

要避免联系人信息被修改,只需在发票的联系人关联中仅传入ContactID,而非完整的联系人对象。这样Xero只会完成发票与已有联系人的关联,不会修改联系人的任何详情字段。

修改前的代码片段

public function create_or_update_invoice($xero_tenant_id, $api_instance, $invoice_list = array()){
    $arr_invoices = array();
    foreach ($invoice_list as $invoice) {
        // 获取完整联系人详情
        $contact = $this->get_contact_by_id($xero_tenant_id, $api_instance, $xero_contact_id, $contact_name);
    
        // 组装发票数据
        $new_invoice = new XeroAPI\XeroPHP\Models\Accounting\Invoice;
        $new_invoice->setType(XeroAPI\XeroPHP\Models\Accounting\Invoice::TYPE_ACCREC)
        ->setContact($contact)
        ...
        ...
        ->setStatus(XeroAPI\XeroPHP\Models\Accounting\Invoice::STATUS_AUTHORISED);
    
        $arr_invoices[] = $new_invoice;
    }

    $invoices = new XeroAPI\XeroPHP\Models\Accounting\Invoices;
    $invoices->setInvoices($arr_invoices);

    try{
        $result = $api_instance->updateOrCreateInvoices($xero_tenant_id, $invoices); 
        return $result;
    }catch(Exception $e){
        return $e;
    }
}

修改后的代码片段

public function create_or_update_invoice($xero_tenant_id, $api_instance, $invoice_list = array()){
    $arr_invoices = array();
    foreach ($invoice_list as $invoice) {
        // 仅创建包含ContactID的联系人对象
        $contact = new XeroAPI\XeroPHP\Models\Accounting\Contact;
        $contact->setContactID($xero_contact_id);
    
        // 组装发票数据
        $new_invoice = new XeroAPI\XeroPHP\Models\Accounting\Invoice;
        $new_invoice->setType(XeroAPI\XeroPHP\Models\Accounting\Invoice::TYPE_ACCREC)
        ->setContact($contact)
        ...
        ...
        ->setStatus(XeroAPI\XeroPHP\Models\Accounting\Invoice::STATUS_AUTHORISED);
    
        $arr_invoices[] = $new_invoice;
    }

    $invoices = new XeroAPI\XeroPHP\Models\Accounting\Invoices;
    $invoices->setInvoices($arr_invoices);

    try{
        $result = $api_instance->updateOrCreateInvoices($xero_tenant_id, $invoices); 
        return $result;
    }catch(Exception $e){
        return $e;
    }
}

效果说明

仅传入ContactID后,接口仅完成发票与联系人的关联操作,不会对联系人的任何字段(包括"additional persons")进行修改,确保了联系人信息的完整性。

内容的提问来源于stack exchange,提问作者Sebastian Cheong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:29:58