chargebee / chargebee-dotnet

.NET library for the Chargebee API.
https://apidocs.chargebee.com/docs/api?lang=dotnet
MIT License
20 stars 24 forks source link

Serializing error on subscription update fails #72

Closed thePmr closed 1 week ago

thePmr commented 1 month ago

Description of the Bug

When getting error from API, it seems that response now contains nested object and SDK fails to serialize it:

An unhandled exception has occurred while executing the request.
System.ArgumentException: Sorry, something went wrong when trying to process the request. If this problem persists, contact us at support@chargebee.com.
 type: internal_error,
 http_status_code: 500,
 error_code: internal_error,
 content: {"message":"Subscription cannot be updated as we are not able to collect INR 29.00 from your card on file. Error message: (amount_too_small) Amount must convert to at least 50 cents. \u20b929.00 converts to approximately $0.35.","type":"payment","api_error_code":"payment_processing_failed","error_cause":{"id":"gateway.transaction_processing.amount_invalid","customer_message":"The authorized amount is set to zero, unreadable, or exceeds the allowable amount. Please verify the amount and format it correctly before attempting the transaction again.","merchant_message":"We were unable to process your transaction because the authorized amount is set to zero, unreadable, or exceeds the allowable amount. Please verify the amount and format it correctly before attempting the transaction again."},"error_code":"payment_error_during_update","error_msg":"Subscription cannot be updated as we are not able to collect INR 29.00 from your card on file. Error message: (amount_too_small) Amount must convert to at least 50 cents. \u20b929.00 converts to approximately $0.35.","http_status_code":400}
 ---> Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: {. Path 'error_cause', line 1, position 306.
   at Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType)
   at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateDictionary(IDictionary dictionary, JsonReader reader, JsonDictionaryContract contract, JsonProperty containerProperty, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
   at ChargeBee.Api.ApiUtil.HandleException(HttpResponseMessage response)
   --- End of inner exception stack trace ---
   at ChargeBee.Api.ApiUtil.HandleException(HttpResponseMessage response)
   at ChargeBee.Api.ApiUtil.GetEntityResultAsync(String url, Params parameters, Dictionary`2 headers, ApiConfig env, HttpMethod meth, Boolean supportsFilter)

Steps to reproduce

  1. Create subscription with plan_unit_price less than minimum allowed by payment gateway (e.g. 29 INR with Stripe)
  2. Increase plan quantity by one with end_of_term==false
  3. Update Subscription
  4. Observe JsonReaderException trhown

Expected Behavior

PaymentException is thrown

Code Snippets (if applicable)

result = await ChargeBee.Models.Subscription.Update(subscription.ExternalSubscriptionId)
    .AddUnitCount(newUnitCount)
    .Prorate(true)
    .EndOfTerm(false)
    .RequestAsync();

Operating System

Windows 11

Language version

.NET 8.0

Library version

v3.24.0

Additional context

No response

cb-alish commented 1 month ago

Hi @thePmr, we're actively looking into the issue and will keep you updated.

cb-alish commented 1 week ago

Hi @thePmr, this has been resolved. I’ll close this, but feel free to reopen if the issue persists.