使用Xero API创建外币批量支付时的验证错误问题
Xero API 外币批量支付验证错误解决方案
问题核心
英国本土企业(本位币GBP)使用Xero API NPM包创建外币(如AUD)批量支付时,收到错误:
Invoice's currency must match the organisation's base currency
已确认境外供应商发票、账户币种一致,且设置了汇率,但仍失败。
错误原因
Xero的批量支付(BatchPayment)有严格的币种匹配规则:
- 同一批量支付下的所有支付项必须与所使用的银行账户币种完全一致
- 若支付外币发票,必须使用对应外币的银行账户,而非本位币账户
- 代码中可能误将本位币银行账户用于外币支付,导致系统强制要求发票币种匹配本位币
修正方案
1. 确认并使用对应外币的银行账户
确保代码中传入的account是目标外币(如AUD)的银行账户,而非GBP本位币账户。可通过Xero后台或API查询账户的currencyCode字段验证。
2. 调整批量支付代码结构
移除支付项中冗余的bankAccountNumber(该字段属于批次级账户信息,无需在单个支付项中重复),并确保批次账户与发票币种一致:
// Get payment id const paymentId = (await flowElement.getPropertyStringValue('paymentId')) as string; // Create the payments for the batch const payments: Payment[] = []; const records = (await connection.query( `SELECT invoice_id, amount_due FROM finance_bills WHERE payment_id = '${paymentId}'`, )) as InvoiceAndAmount[]; records.forEach((record) => { payments.push({ invoice: { invoiceID: record.invoice_id, // 确保此处币种与发票实际币种一致,且与批次银行账户币种匹配 currencyCode: CurrencyCode.AUD }, amount: record.amount_due, currencyRate: 1.93 // 确保汇率对应支付当日的正确汇率 }); }); // Get the date for the batch payment const date = (await flowElement.getPropertyStringValue('date')) as string; // 先获取对应外币的银行账户(示例为AUD) const foreignCurrencyBankAccounts = await xero.accountingApi.getAccounts('', 'WHERE CurrencyCode="AUD"'); const targetAccount = foreignCurrencyBankAccounts.body.accounts[0]; // Build batch payment const batchPayments: BatchPayments = { batchPayments: [ { date, account: { accountID: targetAccount.accountID, currencyCode: targetAccount.currencyCode // 显式指定账户币种,增强兼容性 }, payments, }, ], }; // Create Xero client (Live) const xero = new XeroClient({ clientId: (await flowElement.getPropertyStringValue('clientId')) as string, clientSecret: (await flowElement.getPropertyStringValue('clientSecret')) as string, scopes: scopes.split(' '), grantType: 'client_credentials', }); // Get token for Xero await xero.getClientCredentialsToken(); // Make batch payment await xero.accountingApi.createBatchPayment('', batchPayments);
3. 额外验证点
- 确认发票的
currencyCode确实为目标外币,可通过API查询验证:const invoice = await xero.accountingApi.getInvoice('', record.invoice_id); console.log(invoice.body.invoices[0].currencyCode); - 汇率
currencyRate需符合Xero的规则:表示1单位外币兑换多少本位币(如1 AUD = 0.518 GBP,对应rate为0.518)
内容的提问来源于stack exchange,提问作者John Kuzma
相关产品推荐
相关产品推荐

