Как создать Stripe Invoice для учетной записи подключения на общем клиенте
Я успешно создал клиента на моей учетной записи на платформе Stripe. Теперь я хочу создать счет для этого клиента с одной из моих учетных записей подключения.
Учетная запись Connect доставила услугу клиенту и теперь будет выставлять счет клиенту для оплаты - я использую возможность Stripe Invoice.
Однако я получаю сообщение об ошибке "Нет такого клиента: cus_XXXX" даже после следующих примеров, чтобы связать учетную запись подключения с учетной записью клиента.
Я следовал за https://stripe.com/docs/connect/shared-customers, чтобы создать токен для клиента моей платформы, а затем использую этот токен для создания клиента учетной записи подключения, как указано на https://lorenzosfarra.com/2017/09/19/stripe-shared-customers/ но я получаю то же сообщение об ошибке. Несмотря на то, что кажется, что ссылка на учетную запись подключения создана успешно - поскольку ошибок не возвращено, полученный идентификатор клиента не найден.
Вот мой метод создания счета
public static async Task<string> CreateCustomerInvoice(string secretKey, string customerId, TenantBillHeaderModel billHeader)
{
StripeConfiguration.ApiKey = secretKey;
var fees = await Database.GetAdminFees();
var salesTax = await Database.GetCountrySalesTax(13);// Hardcoded for launch
var billLines = await Database.GetTenantBillDetailForHeaderId(billHeader.TenantBillHeaderId);
var stripeContact = await Database.GetStripeContact(UserInfo.Instance.Organisation.OrganisationId);
InvoiceItemCreateOptions invoiceItemOptions = null;
// Find Fee Percentage
var tFee = billHeader.GrossAmount * (fees.FirstOrDefault(f => f.AdminFeeId == (int)Persistence.Enums.AdminFeeEnum.ConnectCut)).Percentage / 100;
// Create token so that customer can be shared with Connect account - See https://stripe.com/docs/connect/shared-customers
var customerTokenId = await CreateCustomerToken(secretKey, customerId, stripeContact.StripeConnectToken);
//Associates customer with connect account so that it is shared with platform account
var connectCustId = await CreateCustomerInConnectAccount(secretKey, customerTokenId, stripeContact.StripeConnectToken);
foreach (var l in billLines)
{
invoiceItemOptions = new InvoiceItemCreateOptions
{
Quantity = l.Quantity,
UnitAmount = Convert.ToInt64(l.Amount * 100), // Converting to cents for Stripe
Currency = "aud", // Hardcoded for launch
CustomerId = connectCustId,
Description = l.Name + " (" + l.Description + ")",
TaxRates = new List<string> {
salesTax.StripeTaxRateId
},
};
var itemService = new InvoiceItemService();
InvoiceItem invoiceItem = await itemService.CreateAsync(invoiceItemOptions);
}
var invoiceOptions = new InvoiceCreateOptions
{
CustomerId = connectCustId,
AutoAdvance = false, // do not auto-finalize this draft after ~1 hour
CollectionMethod = "send_invoice", // Stripe will progress the a send state. However it will not email as this is trurned off in portal https://stripe.com/docs/billing/invoices/customizing
ApplicationFeeAmount = Convert.ToInt64(tFee),
Description = "Invoice for Advizr Bill: " + billHeader.BillNumber,
DueDate = billHeader.DueDate
};
var service = new InvoiceService();
Invoice invoice = await service.CreateAsync(invoiceOptions);
return invoice.Id;
}
Здесь я создаю токен клиента
public static async Task<string> CreateCustomerToken(string secretKey, string customerId, string stripeContactId)
{
StripeConfiguration.ApiKey = secretKey;
RequestOptions requestOptions = null;
var options = new TokenCreateOptions
{
CustomerId = customerId,
};
if (stripeContactId != null)
{
requestOptions = new RequestOptions
{
StripeAccount = stripeContactId
};
}
var service = new TokenService();
Token token = await service.CreateAsync(options, requestOptions);
return token.Id;
}
и вот я создаю / связываю клиента с подключенной учетной записью
public static async Task<string> CreateCustomerInConnectAccount(string secretKey, string customerToken, string connectAccount)
{
StripeConfiguration.ApiKey = secretKey;
var options = new CustomerCreateOptions
{
Source = customerToken
};
var requestOptions = new RequestOptions
{
StripeAccount = connectAccount
};
var service = new CustomerService();
Customer customer = await service.CreateAsync(options, requestOptions);
return customer.Id;
}
Будем благодарны за любые рекомендации о том, как создать счет для общего клиента (существует в учетной записи платформы и связан с учетной записью подключения).
Затем клиент оплатит счет, и я буду использовать пункт назначения для оплаты учетной записи подключения после вычета сбора за подачу заявления.
Спасибо
1 ответ
После входа в систему и проблем со службой поддержки Stripe мне предоставили ответ.
Чтобы решить эту проблему, подключите учетную запись
var requestOptions = new RequestOptions
{
StripeAccount = stripeContact.StripeConnectToken
};
необходимо указать при создании позиции счета-фактуры
var itemService = new InvoiceItemService();
InvoiceItem invoiceItem = await itemService.CreateAsync(invoiceItemOptions, requestOptions);
и при создании счета.
var service = new InvoiceService();
Invoice invoice = await service.CreateAsync(invoiceOptions, requestOptions);
Надеюсь, это кому-нибудь поможет.