mirror of
https://github.com/bitwarden/server.git
synced 2025-01-02 18:47:44 +01:00
webhook fixes
This commit is contained in:
parent
fb21b19490
commit
dee395960a
@ -47,7 +47,7 @@ namespace Bit.Billing.Controllers
|
|||||||
body = await reader.ReadToEndAsync();
|
body = await reader.ReadToEndAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(body == null)
|
if(string.IsNullOrWhiteSpace(body))
|
||||||
{
|
{
|
||||||
return new BadRequestResult();
|
return new BadRequestResult();
|
||||||
}
|
}
|
||||||
|
@ -176,65 +176,79 @@ namespace Bit.Billing.Controllers
|
|||||||
throw new Exception("Charge is null.");
|
throw new Exception("Charge is null.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(charge.InvoiceId == null)
|
var chargeTransaction = await _transactionRepository.GetByGatewayIdAsync(
|
||||||
|
GatewayType.Stripe, charge.Id);
|
||||||
|
if(chargeTransaction != null)
|
||||||
{
|
{
|
||||||
return new OkResult();
|
return new OkResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
var chargeTransaction = await _transactionRepository.GetByGatewayIdAsync(
|
Tuple<Guid?, Guid?> ids = null;
|
||||||
GatewayType.Stripe, charge.Id);
|
Subscription subscription = null;
|
||||||
if(chargeTransaction == null)
|
var subscriptionService = new SubscriptionService();
|
||||||
|
|
||||||
|
if(charge.InvoiceId != null)
|
||||||
{
|
{
|
||||||
var invoiceService = new InvoiceService();
|
var invoiceService = new InvoiceService();
|
||||||
var invoice = await invoiceService.GetAsync(charge.InvoiceId);
|
var invoice = await invoiceService.GetAsync(charge.InvoiceId);
|
||||||
if(invoice == null)
|
if(invoice?.SubscriptionId != null)
|
||||||
|
{
|
||||||
|
subscription = await subscriptionService.GetAsync(invoice.SubscriptionId);
|
||||||
|
ids = GetIdsFromMetaData(subscription?.Metadata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(subscription == null || ids == null || (ids.Item1.HasValue && ids.Item2.HasValue))
|
||||||
|
{
|
||||||
|
var subscriptions = await subscriptionService.ListAsync(new SubscriptionListOptions
|
||||||
|
{
|
||||||
|
CustomerId = charge.CustomerId
|
||||||
|
});
|
||||||
|
foreach(var sub in subscriptions)
|
||||||
|
{
|
||||||
|
ids = GetIdsFromMetaData(sub.Metadata);
|
||||||
|
if(ids.Item1.HasValue || ids.Item2.HasValue)
|
||||||
|
{
|
||||||
|
subscription = sub;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ids.Item1.HasValue || ids.Item2.HasValue)
|
||||||
|
{
|
||||||
|
var tx = new Transaction
|
||||||
|
{
|
||||||
|
Amount = charge.Amount / 100M,
|
||||||
|
CreationDate = charge.Created,
|
||||||
|
OrganizationId = ids.Item1,
|
||||||
|
UserId = ids.Item2,
|
||||||
|
Type = TransactionType.Charge,
|
||||||
|
Gateway = GatewayType.Stripe,
|
||||||
|
GatewayId = charge.Id
|
||||||
|
};
|
||||||
|
|
||||||
|
if(charge.Source is Card card)
|
||||||
|
{
|
||||||
|
tx.PaymentMethodType = PaymentMethodType.Card;
|
||||||
|
tx.Details = $"{card.Brand}, *{card.Last4}";
|
||||||
|
}
|
||||||
|
else if(charge.Source is BankAccount bankAccount)
|
||||||
|
{
|
||||||
|
tx.PaymentMethodType = PaymentMethodType.BankAccount;
|
||||||
|
tx.Details = $"{bankAccount.BankName}, *{bankAccount.Last4}";
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
return new OkResult();
|
return new OkResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
var subscriptionService = new SubscriptionService();
|
try
|
||||||
var subscription = await subscriptionService.GetAsync(invoice.SubscriptionId);
|
|
||||||
if(subscription == null)
|
|
||||||
{
|
{
|
||||||
return new OkResult();
|
await _transactionRepository.CreateAsync(tx);
|
||||||
}
|
|
||||||
|
|
||||||
var ids = GetIdsFromMetaData(subscription.Metadata);
|
|
||||||
if(ids.Item1.HasValue || ids.Item2.HasValue)
|
|
||||||
{
|
|
||||||
var tx = new Transaction
|
|
||||||
{
|
|
||||||
Amount = charge.Amount / 100M,
|
|
||||||
CreationDate = charge.Created,
|
|
||||||
OrganizationId = ids.Item1,
|
|
||||||
UserId = ids.Item2,
|
|
||||||
Type = TransactionType.Charge,
|
|
||||||
Gateway = GatewayType.Stripe,
|
|
||||||
GatewayId = charge.Id
|
|
||||||
};
|
|
||||||
|
|
||||||
if(charge.Source is Card card)
|
|
||||||
{
|
|
||||||
tx.PaymentMethodType = PaymentMethodType.Card;
|
|
||||||
tx.Details = $"{card.Brand}, *{card.Last4}";
|
|
||||||
}
|
|
||||||
else if(charge.Source is BankAccount bankAccount)
|
|
||||||
{
|
|
||||||
tx.PaymentMethodType = PaymentMethodType.BankAccount;
|
|
||||||
tx.Details = $"{bankAccount.BankName}, *{bankAccount.Last4}";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return new OkResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await _transactionRepository.CreateAsync(tx);
|
|
||||||
}
|
|
||||||
// Catch foreign key violations because user/org could have been deleted.
|
|
||||||
catch(SqlException e) when(e.Number == 547) { }
|
|
||||||
}
|
}
|
||||||
|
// Catch foreign key violations because user/org could have been deleted.
|
||||||
|
catch(SqlException e) when(e.Number == 547) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(parsedEvent.Type.Equals("charge.refunded"))
|
else if(parsedEvent.Type.Equals("charge.refunded"))
|
||||||
@ -317,7 +331,7 @@ namespace Bit.Billing.Controllers
|
|||||||
|
|
||||||
private Tuple<Guid?, Guid?> GetIdsFromMetaData(IDictionary<string, string> metaData)
|
private Tuple<Guid?, Guid?> GetIdsFromMetaData(IDictionary<string, string> metaData)
|
||||||
{
|
{
|
||||||
if(metaData == null)
|
if(metaData == null || !metaData.Any())
|
||||||
{
|
{
|
||||||
return new Tuple<Guid?, Guid?>(null, null);
|
return new Tuple<Guid?, Guid?>(null, null);
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
},
|
},
|
||||||
"billingSettings": {
|
"billingSettings": {
|
||||||
"payPal": {
|
"payPal": {
|
||||||
"production": false
|
"production": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user