diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index a6652d53..d2bf0e13 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -44,7 +44,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v2
+ uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: security-and-quality
@@ -56,7 +56,7 @@ jobs:
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
- name: Autobuild
- uses: github/codeql-action/autobuild@v2
+ uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
+ uses: github/codeql-action/analyze@v3
diff --git a/src/CheckoutSdk/CheckoutApi.cs b/src/CheckoutSdk/CheckoutApi.cs
index db137cd4..7ce06ba7 100644
--- a/src/CheckoutSdk/CheckoutApi.cs
+++ b/src/CheckoutSdk/CheckoutApi.cs
@@ -15,6 +15,7 @@
using Checkout.Payments.Hosted;
using Checkout.Payments.Links;
using Checkout.Payments.Sessions;
+using Checkout.Payments.Setups;
using Checkout.Reports;
using Checkout.Risk;
using Checkout.Tokens;
@@ -47,6 +48,7 @@ public class CheckoutApi : ICheckoutApi
private readonly IPaymentSessionsClient _paymentSessionsClient;
private readonly IForwardClient _forwardClient;
private readonly INetworkTokensClient _networkTokensClient;
+ private readonly IPaymentSetupsClient _paymentSetupsClient;
public CheckoutApi(CheckoutConfiguration configuration)
{
@@ -78,6 +80,7 @@ public CheckoutApi(CheckoutConfiguration configuration)
_paymentSessionsClient = new PaymentSessionsClient(baseApiClient, configuration);
_forwardClient = new ForwardClient(baseApiClient, configuration);
_networkTokensClient = new NetworkTokensClient(baseApiClient, configuration);
+ _paymentSetupsClient = new PaymentSetupsClient(baseApiClient, configuration);
}
private static ApiClient BaseApiClient(CheckoutConfiguration configuration)
@@ -220,6 +223,11 @@ public INetworkTokensClient NetworkTokensClient()
{
return _networkTokensClient;
}
+
+ public IPaymentSetupsClient PaymentSetupsClient()
+ {
+ return _paymentSetupsClient;
+ }
}
}
diff --git a/src/CheckoutSdk/Common/Phone.cs b/src/CheckoutSdk/Common/Phone.cs
index 38004740..66ad4793 100644
--- a/src/CheckoutSdk/Common/Phone.cs
+++ b/src/CheckoutSdk/Common/Phone.cs
@@ -2,8 +2,16 @@ namespace Checkout.Common
{
public class Phone
{
+ ///
+ /// The international country calling code: https://www.checkout.com/docs/resources/codes/country-codes
+ /// [ 1 .. 7 ] characters
+ ///
public string CountryCode { get; set; }
+ ///
+ /// The phone number
+ /// [ 6 .. 25 ] characters
+ ///
public string Number { get; set; }
}
}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Customer/Customer.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Customer/Customer.cs
new file mode 100644
index 00000000..a3fee431
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Customer/Customer.cs
@@ -0,0 +1,54 @@
+using Checkout.Common;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public class Customer
+ {
+ ///
+ /// Details of the customer's email
+ ///
+ public CustomerEmail Email { get; set; }
+
+ ///
+ /// The customer's full name
+ /// <= 100 characters
+ ///
+ public string Name { get; set; }
+
+ ///
+ /// The customer's phone number
+ ///
+ public Phone Phone { get; set; }
+
+ ///
+ /// The customer's device details
+ ///
+ public CustomerDevice Device { get; set; }
+
+ ///
+ /// Details of the account the customer holds with the merchant
+ ///
+ public MerchantAccount MerchantAccount { get; set; }
+ }
+
+ public class CustomerEmail
+ {
+ ///
+ /// The customer's email address
+ ///
+ public string Address { get; set; }
+
+ ///
+ /// Specifies whether the customer's email address is verified
+ ///
+ public bool? Verified { get; set; }
+ }
+
+ public class CustomerDevice
+ {
+ ///
+ /// The device's locale, as an ISO 639-2 language code
+ ///
+ public string Locale { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Customer/MerchantAccount.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Customer/MerchantAccount.cs
new file mode 100644
index 00000000..bd02f159
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Customer/MerchantAccount.cs
@@ -0,0 +1,47 @@
+using System;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public class MerchantAccount
+ {
+ ///
+ /// The merchant's unique identifier for the customer's account
+ ///
+ public string Id { get; set; }
+
+ ///
+ /// The date the customer registered their account with the merchant
+ ///
+ public DateTime? RegistrationDate { get; set; }
+
+ ///
+ /// The date the customer's account with the merchant was last modified
+ ///
+ public DateTime? LastModified { get; set; }
+
+ ///
+ /// Specifies if the customer is a returning customer
+ ///
+ public bool? ReturningCustomer { get; set; }
+
+ ///
+ /// The date of the customer's first transaction
+ ///
+ public DateTime? FirstTransactionDate { get; set; }
+
+ ///
+ /// The date of the customer's most recent transaction
+ ///
+ public DateTime? LastTransactionDate { get; set; }
+
+ ///
+ /// The total number of orders made by the customer
+ ///
+ public int? TotalOrderCount { get; set; }
+
+ ///
+ /// The payment amount of the customer's most recent transaction
+ ///
+ public long? LastPaymentAmount { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Industry/AirlineData.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Industry/AirlineData.cs
new file mode 100644
index 00000000..171b464e
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Industry/AirlineData.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+using Checkout.Payments.Contexts;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public class AirlineData
+ {
+ ///
+ /// Details about the airline ticket
+ ///
+ public PaymentContextsTicket Ticket { get; set; }
+
+ ///
+ /// Details about the flight passenger(s)
+ ///
+ public IList Passengers { get; set; }
+
+ ///
+ /// Details about the flight leg(s) booked by the customer
+ ///
+ public IList FlightLegDetails { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Industry/Industry.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Industry/Industry.cs
new file mode 100644
index 00000000..758a59db
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Industry/Industry.cs
@@ -0,0 +1,17 @@
+using System.Collections.Generic;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public class Industry
+ {
+ ///
+ /// Details about the airline ticket and flights the customer booked
+ ///
+ public AirlineData AirlineData { get; set; }
+
+ ///
+ /// Contains information about the accommodation booked by the customer
+ ///
+ public IList AccommodationData { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Order/Order.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Order/Order.cs
new file mode 100644
index 00000000..264dd92d
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Order/Order.cs
@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using Checkout.Common;
+using Checkout.Payments.Contexts;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public class Order
+ {
+ ///
+ /// A list of items in the order
+ ///
+ public IList Items { get; set; }
+
+ ///
+ /// The customer's shipping details
+ ///
+ public ShippingDetails Shipping { get; set; }
+
+ ///
+ /// The sub-merchants' details
+ ///
+ public IList SubMerchants { get; set; }
+
+ ///
+ /// The discount amount the merchant applied to the transaction
+ /// >= 0
+ ///
+ public long? DiscountAmount { get; set; }
+ }
+}
+
+
+
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Order/OrderSubMerchant.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Order/OrderSubMerchant.cs
new file mode 100644
index 00000000..8c9ce84c
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Order/OrderSubMerchant.cs
@@ -0,0 +1,27 @@
+using System;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public class OrderSubMerchant
+ {
+ ///
+ /// The unique identifier of the sub-merchant
+ ///
+ public string Id { get; set; }
+
+ ///
+ /// The sub-merchant's product category
+ ///
+ public string ProductCategory { get; set; }
+
+ ///
+ /// The number of orders the sub-merchant has processed
+ ///
+ public int? NumberOfTrades { get; set; }
+
+ ///
+ /// The sub-merchant's registration date
+ ///
+ public DateTime? RegistrationDate { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Bizum/Bizum.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Bizum/Bizum.cs
new file mode 100644
index 00000000..a19b0184
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Bizum/Bizum.cs
@@ -0,0 +1,10 @@
+namespace Checkout.Payments.Setups.Entities
+{
+ public class Bizum : PaymentMethodBase
+ {
+ ///
+ /// Payment method options specific to Bizum
+ ///
+ public PaymentMethodOptions PaymentMethodOptions { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodAction.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodAction.cs
new file mode 100644
index 00000000..e2b2441e
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodAction.cs
@@ -0,0 +1,20 @@
+namespace Checkout.Payments.Setups.Entities
+{
+ public class PaymentMethodAction
+ {
+ ///
+ /// The type of action to be performed with the payment method
+ ///
+ public string Type { get; set; }
+
+ ///
+ /// The client token for payment method authentication
+ ///
+ public string ClientToken { get; set; }
+
+ ///
+ /// The session identifier for the payment method session
+ ///
+ public string SessionId { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodBase.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodBase.cs
new file mode 100644
index 00000000..1e7f4430
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodBase.cs
@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ ///
+ /// Base class for all payment methods with common properties
+ ///
+ public abstract class PaymentMethodBase
+ {
+ ///
+ /// The payment method's status
+ ///
+ public PaymentMethodStatus? Status { get; set; }
+
+ ///
+ /// Configuration flags for the payment method
+ ///
+ public IList Flags { get; set; }
+
+ ///
+ /// Default: "disabled"
+ /// The initialization state of the payment method.
+ /// When you create a Payment Setup, this defaults to disabled.
+ /// Enum: "disabled" "enabled"
+ ///
+ public PaymentMethodInitialization Initialization { get; set; } = PaymentMethodInitialization.Disabled;
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodInitialization.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodInitialization.cs
new file mode 100644
index 00000000..ff493155
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodInitialization.cs
@@ -0,0 +1,11 @@
+
+ using System.Runtime.Serialization;
+
+ public enum PaymentMethodInitialization
+ {
+ [EnumMember(Value = "disabled")]
+ Disabled,
+
+ [EnumMember(Value = "enabled")]
+ Enabled
+ }
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodOption.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodOption.cs
new file mode 100644
index 00000000..73f5d1f7
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodOption.cs
@@ -0,0 +1,27 @@
+using System.Collections.Generic;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public class PaymentMethodOption
+ {
+ ///
+ /// The unique identifier for the payment method option
+ ///
+ public string Id { get; set; }
+
+ ///
+ /// The status of the payment method option
+ ///
+ public string Status { get; set; }
+
+ ///
+ /// Configuration flags for the payment method option
+ ///
+ public IList Flags { get; set; }
+
+ ///
+ /// The action configuration for STC Pay full payment
+ ///
+ public PaymentMethodAction Action { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodOptions.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodOptions.cs
new file mode 100644
index 00000000..4350d6f4
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodOptions.cs
@@ -0,0 +1,25 @@
+namespace Checkout.Payments.Setups.Entities
+{
+ public class PaymentMethodOptions
+ {
+ ///
+ /// Klarna SDK configuration options
+ ///
+ public PaymentMethodOption Sdk { get; set; }
+
+ ///
+ /// STC Pay full payment option configuration
+ ///
+ public PaymentMethodOption PayInFull { get; set; }
+
+ ///
+ /// Tabby installments payment option configuration
+ ///
+ public PaymentMethodOption Installments { get; set; }
+
+ ///
+ /// Bizum immediate payment option configuration
+ ///
+ public PaymentMethodOption PayNow { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodStatus.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodStatus.cs
new file mode 100644
index 00000000..01f83de8
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Common/PaymentMethodStatus.cs
@@ -0,0 +1,17 @@
+using System.Runtime.Serialization;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public enum PaymentMethodStatus
+ {
+ //"available" "requires_action" "unavailable"
+ [EnumMember(Value = "available")]
+ Available,
+
+ [EnumMember(Value = "requires_action")]
+ RequiresAction,
+
+ [EnumMember(Value = "unavailable")]
+ Unavailable
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Klarna/Klarna.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Klarna/Klarna.cs
new file mode 100644
index 00000000..f57f91b9
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Klarna/Klarna.cs
@@ -0,0 +1,15 @@
+namespace Checkout.Payments.Setups.Entities
+{
+ public class Klarna : PaymentMethodBase
+ {
+ ///
+ /// The account holder information for Klarna payments
+ ///
+ public KlarnaAccountHolder AccountHolder { get; set; }
+
+ ///
+ /// Payment method options specific to Klarna
+ ///
+ public PaymentMethodOptions PaymentMethodOptions { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Klarna/KlarnaAccountHolder.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Klarna/KlarnaAccountHolder.cs
new file mode 100644
index 00000000..797c0640
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Klarna/KlarnaAccountHolder.cs
@@ -0,0 +1,12 @@
+using Checkout.Common;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public class KlarnaAccountHolder
+ {
+ ///
+ /// The billing address of the Klarna account holder
+ ///
+ public Address BillingAddress { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/PaymentMethods.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/PaymentMethods.cs
new file mode 100644
index 00000000..3cefef49
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/PaymentMethods.cs
@@ -0,0 +1,27 @@
+using System.Collections.Generic;
+
+namespace Checkout.Payments.Setups.Entities
+{
+ public class PaymentMethods
+ {
+ ///
+ /// The Klarna payment method's details and configuration.
+ ///
+ public Klarna Klarna { get; set; }
+
+ ///
+ /// The stc pay payment method's details and configuration.
+ ///
+ public Stcpay Stcpay { get; set; }
+
+ ///
+ /// The Tabby payment method's details and configuration.
+ ///
+ public Tabby Tabby { get; set; }
+
+ ///
+ /// The Bizum payment method's details and configuration.
+ ///
+ public Bizum Bizum { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Stcpay/Stcpay.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Stcpay/Stcpay.cs
new file mode 100644
index 00000000..cbb7ac9c
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Stcpay/Stcpay.cs
@@ -0,0 +1,15 @@
+namespace Checkout.Payments.Setups.Entities
+{
+ public class Stcpay : PaymentMethodBase
+ {
+ ///
+ /// The one-time password (OTP) for STC Pay authentication
+ ///
+ public string Otp { get; set; }
+
+ ///
+ /// Payment method options specific to STC Pay
+ ///
+ public PaymentMethodOptions PaymentMethodOptions { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Tabby/Tabby.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Tabby/Tabby.cs
new file mode 100644
index 00000000..70cadf0e
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/PaymentMethods/Tabby/Tabby.cs
@@ -0,0 +1,10 @@
+namespace Checkout.Payments.Setups.Entities
+{
+ public class Tabby : PaymentMethodBase
+ {
+ ///
+ /// Payment method options specific to Tabby
+ ///
+ public PaymentMethodOptions PaymentMethodOptions { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Settings/Settings.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Settings/Settings.cs
new file mode 100644
index 00000000..ff8d856a
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Entities/Settings/Settings.cs
@@ -0,0 +1,19 @@
+namespace Checkout.Payments.Setups.Entities
+{
+ public class Settings
+ {
+ ///
+ /// The URL to redirect the customer to, if the payment is successful.
+ /// For payment methods with a redirect, this value overrides the default success redirect URL configured on your account.
+ /// <= 255 characters
+ ///
+ public string SuccessUrl { get; set; }
+
+ ///
+ /// The URL to redirect the customer to, if the payment is unsuccessful.
+ /// For payment methods with a redirect, this value overrides the default failure redirect URL configured on your account.
+ /// <= 255 characters
+ ///
+ public string FailureUrl { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/IPaymentSetupsClient.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/IPaymentSetupsClient.cs
new file mode 100644
index 00000000..307f86b3
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/IPaymentSetupsClient.cs
@@ -0,0 +1,48 @@
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Checkout.Payments.Setups
+{
+ public interface IPaymentSetupsClient
+ {
+ ///
+ /// Creates a Payment Setup.
+ /// To maximize the amount of information the payment setup can use, we recommend that you create a payment
+ /// setup as early as possible in the customer's journey. For example, the first time they land on the basket
+ /// page
+ /// [Beta]
+ ///
+ Task CreatePaymentSetup(
+ PaymentSetupsRequest paymentSetupsCreateRequest,
+ CancellationToken cancellationToken = default);
+
+ ///
+ /// Updates a Payment Setup
+ /// You should update the payment setup whenever there are significant changes in the data relevant to the
+ /// customer's transaction. For example, when the customer makes a change that impacts the total payment amount
+ /// [Beta]
+ ///
+ Task UpdatePaymentSetup(
+ string id,
+ PaymentSetupsRequest paymentSetupsUpdateRequest,
+ CancellationToken cancellationToken = default);
+
+ ///
+ /// Retrieves a Payment Setup
+ /// [Beta]
+ ///
+ Task GetPaymentSetup(
+ string id,
+ CancellationToken cancellationToken = default);
+
+ ///
+ /// Confirm a Payment Setup to begin processing the payment request with your chosen payment method option
+ /// [Beta]
+ ///
+ Task ConfirmPaymentSetup(
+ string id,
+ string paymentMethodOptionId,
+ CancellationToken cancellationToken = default);
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/PaymentSetupsClient.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/PaymentSetupsClient.cs
new file mode 100644
index 00000000..ca2931e3
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/PaymentSetupsClient.cs
@@ -0,0 +1,91 @@
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Checkout.Payments.Setups
+{
+ public class PaymentSetupsClient : AbstractClient, IPaymentSetupsClient
+ {
+ private const string PaymentsPath = "payments";
+ private const string SetupsPath = "setups";
+
+ private const string ConfirmPath = "confirm";
+
+ public PaymentSetupsClient(IApiClient apiClient, CheckoutConfiguration configuration)
+ : base(apiClient, configuration, SdkAuthorizationType.SecretKeyOrOAuth)
+ {
+ }
+
+ ///
+ /// Creates a Payment Setup.
+ /// To maximize the amount of information the payment setup can use, we recommend that you create a payment
+ /// setup as early as possible in the customer's journey. For example, the first time they land on the basket
+ /// page
+ /// [Beta]
+ ///
+ public Task CreatePaymentSetup(
+ PaymentSetupsRequest paymentSetupsCreateRequest,
+ CancellationToken cancellationToken = default)
+ {
+ CheckoutUtils.ValidateParams("paymentSetupsCreateRequest", paymentSetupsCreateRequest);
+ return ApiClient.Post(
+ BuildPath(PaymentsPath, SetupsPath),
+ SdkAuthorization(),
+ paymentSetupsCreateRequest,
+ cancellationToken
+ );
+ }
+
+ ///
+ /// Updates a Payment Setup
+ /// You should update the payment setup whenever there are significant changes in the data relevant to the
+ /// customer's transaction. For example, when the customer makes a change that impacts the total payment amount
+ /// [Beta]
+ ///
+ public Task UpdatePaymentSetup(
+ string id,
+ PaymentSetupsRequest paymentSetupsUpdateRequest,
+ CancellationToken cancellationToken = default)
+ {
+ CheckoutUtils.ValidateParams("id", id, "paymentSetupsUpdateRequest", paymentSetupsUpdateRequest);
+ return ApiClient.Put(
+ BuildPath(PaymentsPath, SetupsPath, id),
+ SdkAuthorization(),
+ paymentSetupsUpdateRequest,
+ cancellationToken
+ );
+ }
+
+ ///
+ /// Retrieves a Payment Setup
+ /// [Beta]
+ ///
+ public Task GetPaymentSetup(
+ string id,
+ CancellationToken cancellationToken = default)
+ {
+ CheckoutUtils.ValidateParams("id", id);
+ return ApiClient.Get(
+ BuildPath(PaymentsPath, SetupsPath, id),
+ SdkAuthorization(),
+ cancellationToken
+ );
+ }
+
+ ///
+ /// Confirm a Payment Setup to begin processing the payment request with your chosen payment method option
+ /// [Beta]
+ ///
+ public Task ConfirmPaymentSetup(
+ string id,
+ string paymentMethodOptionId,
+ CancellationToken cancellationToken = default)
+ {
+ CheckoutUtils.ValidateParams("id", id, "paymentMethodOptionId", paymentMethodOptionId);
+ return ApiClient.Post(
+ BuildPath(PaymentsPath, SetupsPath, id, ConfirmPath, paymentMethodOptionId),
+ SdkAuthorization(),
+ cancellationToken
+ );
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Requests/PaymentSetupsRequest.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Requests/PaymentSetupsRequest.cs
new file mode 100644
index 00000000..996d1b87
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Requests/PaymentSetupsRequest.cs
@@ -0,0 +1,86 @@
+using Checkout.Common;
+using Checkout.Payments.Setups.Entities;
+
+namespace Checkout.Payments.Setups
+{
+ ///
+ /// Creates a Payment Setup.
+ /// To maximize the amount of information the payment setup can use, we recommend that you create a payment setup as
+ /// early as possible in the customer's journey. For example, the first time they land on the basket page.
+ /// [Beta]
+ ///
+ public class PaymentSetupsRequest
+ {
+ ///
+ /// The processing channel to use for the payment.
+ /// [Required]
+ /// ^(pc)_(\w{26})$
+ ///
+ public string ProcessingChannelId { get; set; }
+
+ ///
+ /// The payment amount, in the minor currency unit.
+ /// [Required]
+ ///
+ public long? Amount { get; set; }
+
+ ///
+ /// The currency of the payment, as a three-letter ISO currency code
+ /// [Required]
+ ///
+ public Currency? Currency { get; set; }
+
+ ///
+ /// The type of payment.
+ /// You must provide this field for card payments in which the cardholder is not present. For example, if the
+ /// transaction is a recurring payment, or a mail order/telephone order (MOTO) payment.
+ /// Enum: "Regular" "Recurring" "MOTO" "Installment" "Unscheduled"
+ /// [Optional]
+ ///
+ public PaymentType? PaymentType { get; set; } = Payments.PaymentType.Regular;
+
+ ///
+ /// A reference you can use to identify the payment. For example, an order number
+ /// <= 80 characters
+ /// [Optional]
+ ///
+ public string Reference { get; set; }
+
+ ///
+ /// A description of the payment.
+ /// <= 100 characters
+ /// [Optional]
+ ///
+ public string Description { get; set; }
+
+ ///
+ /// The payment methods that are enabled on your account and available for use
+ /// [Optional]
+ ///
+ public PaymentMethods PaymentMethods { get; set; }
+
+ ///
+ /// Settings for the Payment Setup
+ /// [Optional]
+ ///
+ public Settings Settings { get; set; }
+
+ ///
+ /// The customer's details
+ /// [Optional]
+ ///
+ public Customer Customer { get; set; }
+
+ ///
+ /// The customer's order details
+ /// [Optional]
+ ///
+ public Order Order { get; set; }
+
+ ///
+ /// Details for specific industries, including airline and accommodation industries
+ /// [Optional]
+ ///
+ public Industry Industry { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/ConfirmPaymentSetupRetry.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/ConfirmPaymentSetupRetry.cs
new file mode 100644
index 00000000..fa504641
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/ConfirmPaymentSetupRetry.cs
@@ -0,0 +1,29 @@
+using System;
+
+namespace Checkout.Payments.Setups
+{
+ ///
+ /// [Beta]
+ ///
+ public class ConfirmPaymentSetupRetry
+ {
+ ///
+ /// The maximum number of authorization retry attempts, excluding the initial authorization
+ /// [ 1 .. 15 ]
+ /// [Optional]
+ ///
+ public int? MaxAttempts { get; set; } = 6;
+
+ ///
+ /// A timestamp that details the date on which the retry schedule expires, in ISO 8601 format
+ /// [Optional]
+ ///
+ public DateTime? EndsOn { get; set; }
+
+ ///
+ /// A timestamp of the date on which the next authorization attempt will take place, in ISO 8601 format
+ /// [Optional]
+ ///
+ public DateTime? NextAttemptOn { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/PaymentSetupSource.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/PaymentSetupSource.cs
new file mode 100644
index 00000000..1f560600
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/PaymentSetupSource.cs
@@ -0,0 +1,90 @@
+using Checkout.Common;
+
+namespace Checkout.Payments.Setups
+{
+ ///
+ /// Source information for payment setup confirm response
+ ///
+ public class PaymentSetupSource
+ {
+ ///
+ /// The type of the payment source
+ ///
+ public string Type { get; set; }
+
+ ///
+ /// The unique identifier of the payment source
+ ///
+ public string Id { get; set; }
+
+ ///
+ /// The billing address associated with the payment source
+ ///
+ public Address BillingAddress { get; set; }
+
+ ///
+ /// The phone number associated with the payment source
+ ///
+ public Phone Phone { get; set; }
+
+ ///
+ /// The card scheme
+ ///
+ public string Scheme { get; set; }
+
+ ///
+ /// The last four digits of the card number
+ ///
+ public string Last4 { get; set; }
+
+ ///
+ /// A unique fingerprint of the underlying card number
+ ///
+ public string Fingerprint { get; set; }
+
+ ///
+ /// The card BIN
+ ///
+ public string Bin { get; set; }
+
+ ///
+ /// The card type
+ ///
+ public string CardType { get; set; }
+
+ ///
+ /// The card category
+ ///
+ public string CardCategory { get; set; }
+
+ ///
+ /// The name of the card issuer
+ ///
+ public string Issuer { get; set; }
+
+ ///
+ /// The card issuer country ISO2 code
+ ///
+ public CountryCode? IssuerCountry { get; set; }
+
+ ///
+ /// The card product type
+ ///
+ public string ProductType { get; set; }
+
+ ///
+ /// The Address Verification System check result
+ ///
+ public string AvsCheck { get; set; }
+
+ ///
+ /// The CVV check result
+ ///
+ public string CvvCheck { get; set; }
+
+ ///
+ /// The Payment Account Reference (PAR)
+ ///
+ public string PaymentAccountReference { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/PaymentSetupsConfirmResponse.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/PaymentSetupsConfirmResponse.cs
new file mode 100644
index 00000000..13c7ebf9
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/PaymentSetupsConfirmResponse.cs
@@ -0,0 +1,117 @@
+using System;
+using Newtonsoft.Json;
+
+using Checkout.Common;
+using PaymentSetupRisk = Checkout.HandlePaymentsAndPayouts.Payments.POSTPayments.Responses.RequestAPaymentOrPayoutResponseCreated.Risk;
+using PaymentSetupThreeds = Checkout.HandlePaymentsAndPayouts.Payments.POSTPayments.Responses.RequestAPaymentOrPayoutResponseCreated.Threeds;
+using PaymentSetupProcessing = Checkout.HandlePaymentsAndPayouts.Payments.POSTPayments.Responses.RequestAPaymentOrPayoutResponseCreated.Processing;
+
+namespace Checkout.Payments.Setups
+{
+ ///
+ /// [Beta]
+ ///
+ public class PaymentSetupsConfirmResponse : Resource
+ {
+ ///
+ /// The payment's unique identifier
+ /// ^(pay)_(\w{26})$
+ /// 30 characters
+ ///
+ public string Id { get; set; }
+
+ ///
+ /// The unique identifier for the action performed against this payment
+ /// ^(act)_(\w{26})$
+ /// 30 characters
+ ///
+ public string ActionId { get; set; }
+
+ ///
+ /// The payment amount
+ ///
+ public long? Amount { get; set; }
+
+ ///
+ /// The three-letter ISO currency code of the payment
+ /// 3 characters
+ ///
+ public Currency? Currency { get; set; }
+
+ ///
+ /// Whether or not the authorization or capture was successful
+ ///
+ public bool? Approved { get; set; }
+
+ ///
+ /// The status of the payment
+ ///
+ public PaymentStatus Status { get; set; }
+
+ ///
+ /// The acquirer authorization code if the payment was authorized
+ ///
+ public string AuthCode { get; set; }
+
+ ///
+ /// The Gateway response code
+ ///
+ public string ResponseCode { get; set; }
+
+ ///
+ /// The Gateway response summary
+ ///
+ public string ResponseSummary { get; set; }
+
+ ///
+ /// Provides 3D Secure enrollment status if the payment was downgraded to non-3D Secure
+ ///
+ [JsonProperty(PropertyName = "3ds")]
+ public PaymentSetupThreeds.Threeds Threeds { get; set; }
+
+ ///
+ /// Returns the payment's risk assessment results
+ ///
+ public PaymentSetupRisk.Risk Risk { get; set; }
+
+ ///
+ /// The source of the payment
+ ///
+ public PaymentSetupSource Source { get; set; }
+
+ ///
+ /// The customer associated with the payment
+ ///
+ public CustomerResponse Customer { get; set; }
+
+ ///
+ /// The date/time the payment was processed
+ ///
+ public DateTime? ProcessedOn { get; set; }
+
+ ///
+ /// Your reference for the payment
+ ///
+ public string Reference { get; set; }
+
+ ///
+ /// Returns information related to the processing of the payment
+ ///
+ public PaymentSetupProcessing.Processing Processing { get; set; }
+
+ ///
+ /// The final Electronic Commerce Indicator (ECI) security level used to authorize the payment
+ ///
+ public string Eci { get; set; }
+
+ ///
+ /// The scheme transaction identifier
+ ///
+ public string SchemeId { get; set; }
+
+ ///
+ /// [Beta]
+ ///
+ public ConfirmPaymentSetupRetry Retry { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/PaymentSetupsResponse.cs b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/PaymentSetupsResponse.cs
new file mode 100644
index 00000000..98590181
--- /dev/null
+++ b/src/CheckoutSdk/HandlePaymentsAndPayouts/PaymentSetups/Responses/PaymentSetupsResponse.cs
@@ -0,0 +1,91 @@
+using Checkout.Common;
+using Checkout.Payments.Setups.Entities;
+
+namespace Checkout.Payments.Setups
+{
+ ///
+ /// Beta
+ ///
+ public class PaymentSetupsResponse : Resource
+ {
+ ///
+ /// The payment's unique identifier
+ /// ^(pay)_(\w{26})$
+ /// 30 characters
+ ///
+ public string Id { get; set; }
+
+ ///
+ /// The processing channel to use for the payment
+ /// ^(pc)_(\w{26})$
+ /// [Required]
+ ///
+ public string ProcessingChannelId { get; set; }
+
+ ///
+ /// The payment amount, in the minor currency unit:
+ /// https://www.checkout.com/docs/payments/accept-payments/format-the-amount-value
+ /// [Required]
+ ///
+ public long? Amount { get; set; }
+
+ ///
+ /// The currency of the payment, as a three-letter ISO currency code:
+ /// https://www.checkout.com/docs/developer-resources/codes/currency-codes
+ /// [Required]
+ ///
+ public Currency? Currency { get; set; }
+
+ ///
+ /// The type of payment.
+ /// You must provide this field for card payments in which the cardholder is not present. For example, if the
+ /// transaction is a recurring payment, or a mail order/telephone order (MOTO) payment
+ /// [Optional]
+ ///
+ public PaymentType? PaymentType { get; set; } = Payments.PaymentType.Regular;
+
+ ///
+ /// A reference you can use to identify the payment. For example, an order number.
+ /// <= 80 characters
+ /// [Optional]
+ ///
+ public string Reference { get; set; }
+
+ ///
+ /// A description of the payment
+ /// <= 100 characters
+ /// [Optional]
+ ///
+ public string Description { get; set; }
+
+ ///
+ /// The payment methods that are enabled on your account and available for use
+ /// [Optional]
+ ///
+ public PaymentMethods PaymentMethods { get; set; }
+
+ ///
+ /// Settings for the Payment Setup
+ /// [Optional]
+ ///
+ public Settings Settings { get; set; }
+
+ ///
+ /// The customer's details
+ /// [Optional]
+ ///
+ public Customer Customer { get; set; }
+
+ ///
+ /// The customer's order details
+ /// [Optional]
+ ///
+ public Order Order { get; set; }
+
+ ///
+ /// Details for specific industries, including airline and accommodation industries
+ /// [Optional]
+ ///
+ public Industry Industry { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/CheckoutSdk/ICheckoutApi.cs b/src/CheckoutSdk/ICheckoutApi.cs
index 37262804..e55a81bb 100644
--- a/src/CheckoutSdk/ICheckoutApi.cs
+++ b/src/CheckoutSdk/ICheckoutApi.cs
@@ -15,6 +15,7 @@
using Checkout.Payments.Hosted;
using Checkout.Payments.Links;
using Checkout.Payments.Sessions;
+using Checkout.Payments.Setups;
using Checkout.Reports;
using Checkout.Risk;
using Checkout.Tokens;
@@ -68,5 +69,7 @@ public interface ICheckoutApi : ICheckoutApiClient
IForwardClient ForwardClient();
INetworkTokensClient NetworkTokensClient();
+
+ IPaymentSetupsClient PaymentSetupsClient();
}
}
diff --git a/src/CheckoutSdk/Payments/AccommodationData.cs b/src/CheckoutSdk/Payments/AccommodationData.cs
index ca273160..e8771c52 100644
--- a/src/CheckoutSdk/Payments/AccommodationData.cs
+++ b/src/CheckoutSdk/Payments/AccommodationData.cs
@@ -7,14 +7,29 @@ namespace Checkout.Payments
{
public class AccommodationData
{
+ ///
+ /// The name of the accommodation (hotel, resort, etc.)
+ ///
public string Name { get; set; }
+ ///
+ /// The booking reference or confirmation number
+ ///
public string BookingReference { get; set; }
+ ///
+ /// The check-in date in YYYY-MM-DD format
+ ///
public DateTime CheckInDate { get; set; }
+ ///
+ /// The check-out date in YYYY-MM-DD format
+ ///
public DateTime CheckOutDate { get; set; }
+ ///
+ /// The address of the accommodation
+ ///
public Address Address { get; set; }
public CountryCode State { get; set; }
@@ -23,10 +38,19 @@ public class AccommodationData
public string City { get; set; }
+ ///
+ /// The number of rooms booked
+ ///
public int? NumberOfRooms { get; set; }
+ ///
+ /// List of guests staying at the accommodation
+ ///
public List Guests { get; set; }
+ ///
+ /// Details of the rooms booked
+ ///
public List Room { get; set; }
}
}
\ No newline at end of file
diff --git a/src/CheckoutSdk/Payments/Contexts/PaymentContextsAccommodationRoom.cs b/src/CheckoutSdk/Payments/Contexts/PaymentContextsAccommodationRoom.cs
index d46ddc55..e197d6bf 100644
--- a/src/CheckoutSdk/Payments/Contexts/PaymentContextsAccommodationRoom.cs
+++ b/src/CheckoutSdk/Payments/Contexts/PaymentContextsAccommodationRoom.cs
@@ -2,8 +2,14 @@ namespace Checkout.Payments.Contexts
{
public class PaymentContextsAccommodationRoom
{
+ ///
+ /// The nightly rate for the room
+ ///
public string Rate { get; set; }
+ ///
+ /// The number of nights the room is booked for
+ ///
public int? NumberOfNightsAtRoomRate { get; set; }
}
}
\ No newline at end of file
diff --git a/src/CheckoutSdk/Payments/Contexts/PaymentContextsFlightLegDetails.cs b/src/CheckoutSdk/Payments/Contexts/PaymentContextsFlightLegDetails.cs
index 3233d684..cb03a283 100644
--- a/src/CheckoutSdk/Payments/Contexts/PaymentContextsFlightLegDetails.cs
+++ b/src/CheckoutSdk/Payments/Contexts/PaymentContextsFlightLegDetails.cs
@@ -4,22 +4,49 @@ namespace Checkout.Payments.Contexts
{
public class PaymentContextsFlightLegDetails
{
+ ///
+ /// The flight number for this leg of the journey
+ ///
public string FlightNumber { get; set; }
+ ///
+ /// The IATA code of the airline operating this flight leg
+ ///
public string CarrierCode { get; set; }
+ ///
+ /// The class of service (e.g., Y for Economy, C for Business, F for First)
+ ///
public string ClassOfTravelling { get; set; }
+ ///
+ /// The IATA code of the departure airport
+ ///
public string DepartureAirport { get; set; }
+ ///
+ /// The departure date in YYYY-MM-DD format
+ ///
public DateTime? DepartureDate { get; set; }
+ ///
+ /// The departure time in HH:MM format
+ ///
public string DepartureTime { get; set; }
+ ///
+ /// The IATA code of the arrival airport
+ ///
public string ArrivalAirport { get; set; }
+ ///
+ /// Code indicating if there are stopovers (O for stopover, X for no stopover)
+ ///
public string StopOverCode { get; set; }
+ ///
+ /// The fare basis code that determines the fare rules and restrictions
+ ///
public string FareBasisCode { get; set; }
}
}
\ No newline at end of file
diff --git a/src/CheckoutSdk/Payments/Contexts/PaymentContextsGuests.cs b/src/CheckoutSdk/Payments/Contexts/PaymentContextsGuests.cs
index f06cad78..bf6beab0 100644
--- a/src/CheckoutSdk/Payments/Contexts/PaymentContextsGuests.cs
+++ b/src/CheckoutSdk/Payments/Contexts/PaymentContextsGuests.cs
@@ -4,10 +4,19 @@ namespace Checkout.Payments.Contexts
{
public class PaymentContextsGuests
{
+ ///
+ /// The guest's first name
+ ///
public string FirstName { get; set; }
+ ///
+ /// The guest's last name
+ ///
public string LastName { get; set; }
+ ///
+ /// The guest's date of birth in YYYY-MM-DD format
+ ///
public DateTime DateOfBirth { get; set; }
}
}
\ No newline at end of file
diff --git a/src/CheckoutSdk/Payments/Contexts/PaymentContextsPassenger.cs b/src/CheckoutSdk/Payments/Contexts/PaymentContextsPassenger.cs
index 0c28b07f..a57373d4 100644
--- a/src/CheckoutSdk/Payments/Contexts/PaymentContextsPassenger.cs
+++ b/src/CheckoutSdk/Payments/Contexts/PaymentContextsPassenger.cs
@@ -5,12 +5,24 @@ namespace Checkout.Payments.Contexts
{
public class PaymentContextsPassenger
{
+ ///
+ /// The passenger's first name as it appears on their travel document
+ ///
public string FirstName { get; set; }
+ ///
+ /// The passenger's last name as it appears on their travel document
+ ///
public string LastName { get; set; }
+ ///
+ /// The passenger's date of birth in YYYY-MM-DD format
+ ///
public DateTime? DateOfBirth { get; set; }
+ ///
+ /// The passenger's address information
+ ///
public Address Address { get; set; }
}
}
\ No newline at end of file
diff --git a/src/CheckoutSdk/Payments/Contexts/PaymentContextsTicket.cs b/src/CheckoutSdk/Payments/Contexts/PaymentContextsTicket.cs
index d3334832..5226c135 100644
--- a/src/CheckoutSdk/Payments/Contexts/PaymentContextsTicket.cs
+++ b/src/CheckoutSdk/Payments/Contexts/PaymentContextsTicket.cs
@@ -4,16 +4,34 @@ namespace Checkout.Payments.Contexts
{
public class PaymentContextsTicket
{
+ ///
+ /// The airline ticket number
+ ///
public string Number { get; set; }
+ ///
+ /// The date when the ticket was issued in YYYY-MM-DD format
+ ///
public DateTime? IssueDate { get; set; }
+ ///
+ /// The IATA code of the airline that issued the ticket
+ ///
public string IssuingCarrierCode { get; set; }
+ ///
+ /// Indicates if this is part of a travel package (Y/N)
+ ///
public string TravelPackageIndicator { get; set; }
+ ///
+ /// The name of the travel agency that sold the ticket
+ ///
public string TravelAgencyName { get; set; }
+ ///
+ /// The IATA code of the travel agency that sold the ticket
+ ///
public string TravelAgencyCode { get; set; }
}
}
\ No newline at end of file
diff --git a/src/CheckoutSdk/Payments/FlightLegDetails.cs b/src/CheckoutSdk/Payments/FlightLegDetails.cs
index 3a73459f..5dea0188 100644
--- a/src/CheckoutSdk/Payments/FlightLegDetails.cs
+++ b/src/CheckoutSdk/Payments/FlightLegDetails.cs
@@ -1,3 +1,5 @@
+using System;
+
namespace Checkout.Payments
{
public class FlightLegDetails
@@ -8,7 +10,7 @@ public class FlightLegDetails
public string ServiceClass { get; set; }
- public string DepartureDate { get; set; }
+ public DateTime DepartureDate { get; set; }
public string DepartureTime { get; set; }
diff --git a/test/CheckoutSdkTest/Accounts/AccountsIntegrationTest.cs b/test/CheckoutSdkTest/Accounts/AccountsIntegrationTest.cs
index 70e1b1b6..6d379d60 100644
--- a/test/CheckoutSdkTest/Accounts/AccountsIntegrationTest.cs
+++ b/test/CheckoutSdkTest/Accounts/AccountsIntegrationTest.cs
@@ -6,6 +6,7 @@
using Checkout.Common;
using Checkout.Instruments;
using Shouldly;
+using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Mime;
@@ -552,12 +553,14 @@ private async Task UploadFile()
private static CheckoutApi GetAccountsCheckoutApi()
{
+ var logFactory = CreateLoggerFactory();
return CheckoutSdk.Builder()
.OAuth()
.ClientCredentials(
System.Environment.GetEnvironmentVariable("CHECKOUT_DEFAULT_OAUTH_ACCOUNTS_CLIENT_ID"),
System.Environment.GetEnvironmentVariable("CHECKOUT_DEFAULT_OAUTH_ACCOUNTS_CLIENT_SECRET"))
.Scopes(OAuthScope.Accounts)
+ .LogProvider(logFactory)
.Build() as CheckoutApi;
}
}
diff --git a/test/CheckoutSdkTest/Accounts/AccountsPayoutSchedulesIntegrationTest.cs b/test/CheckoutSdkTest/Accounts/AccountsPayoutSchedulesIntegrationTest.cs
index 9a35d937..50ea75dd 100644
--- a/test/CheckoutSdkTest/Accounts/AccountsPayoutSchedulesIntegrationTest.cs
+++ b/test/CheckoutSdkTest/Accounts/AccountsPayoutSchedulesIntegrationTest.cs
@@ -97,12 +97,15 @@ private async Task ShouldUpdateAndRetrieveMonthlyPayoutSchedules()
private static CheckoutApi GetPayoutSchedulesCheckoutApi()
{
+ var logFactory = TestLoggerFactoryHelper.Instance;
+
return CheckoutSdk.Builder()
.OAuth()
.ClientCredentials(
System.Environment.GetEnvironmentVariable("CHECKOUT_DEFAULT_OAUTH_PAYOUT_SCHEDULE_CLIENT_ID"),
System.Environment.GetEnvironmentVariable("CHECKOUT_DEFAULT_OAUTH_PAYOUT_SCHEDULE_CLIENT_SECRET"))
.Scopes(OAuthScope.Marketplace)
+ .LogProvider(logFactory)
.Build() as CheckoutApi;
}
}
diff --git a/test/CheckoutSdkTest/CheckoutPreviousSdkTest.cs b/test/CheckoutSdkTest/CheckoutPreviousSdkTest.cs
index c730afc1..46c18bb2 100644
--- a/test/CheckoutSdkTest/CheckoutPreviousSdkTest.cs
+++ b/test/CheckoutSdkTest/CheckoutPreviousSdkTest.cs
@@ -12,6 +12,7 @@ public class CheckoutPreviousSdkTest : UnitTestFixture
[Fact]
private void ShouldCreateCheckoutSdks()
{
+ var logFactory = TestLoggerFactoryHelper.Instance;
var checkoutApi1 = CheckoutSdk
.Builder()
.Previous()
@@ -19,6 +20,7 @@ private void ShouldCreateCheckoutSdks()
.PublicKey(ValidPreviousPk)
.SecretKey(ValidPreviousSk)
.Environment(Environment.Sandbox)
+ .LogProvider(logFactory)
.Build();
checkoutApi1.ShouldNotBeNull();
@@ -29,6 +31,7 @@ private void ShouldCreateCheckoutSdks()
.StaticKeys()
.SecretKey(ValidPreviousSk)
.Environment(Environment.Sandbox)
+ .LogProvider(logFactory)
.Build();
checkoutApi2.ShouldNotBeNull();
@@ -39,12 +42,14 @@ private void ShouldFailToCreateCheckoutSdks()
{
try
{
+ var logFactory = TestLoggerFactoryHelper.Instance;
CheckoutSdk.Builder()
.Previous()
.StaticKeys()
.PublicKey(InvalidPreviousPk)
.SecretKey(ValidPreviousSk)
.Environment(Environment.Sandbox)
+ .LogProvider(logFactory)
.Build();
throw new XunitException();
}
@@ -56,6 +61,7 @@ private void ShouldFailToCreateCheckoutSdks()
try
{
+ var logFactory = TestLoggerFactoryHelper.Instance;
CheckoutSdk
.Builder()
.Previous()
@@ -63,6 +69,7 @@ private void ShouldFailToCreateCheckoutSdks()
.PublicKey(ValidPreviousPk)
.SecretKey(InvalidPreviousSk)
.Environment(Environment.Sandbox)
+ .LogProvider(logFactory)
.Build();
throw new XunitException();
}
@@ -81,6 +88,7 @@ public void ShouldInstantiateClientWithCustomHttpClientFactory()
httpClientFactory.Setup(mock => mock.CreateClient())
.Returns(new HttpClient());
+ var logFactory = TestLoggerFactoryHelper.Instance;
var checkoutApi = CheckoutSdk
.Builder()
.Previous()
@@ -89,6 +97,7 @@ public void ShouldInstantiateClientWithCustomHttpClientFactory()
.SecretKey(ValidPreviousSk)
.Environment(Environment.Sandbox)
.HttpClientFactory(httpClientFactory.Object)
+ .LogProvider(logFactory)
.Build();
checkoutApi.ShouldNotBeNull();
@@ -98,6 +107,7 @@ public void ShouldInstantiateClientWithCustomHttpClientFactory()
[Fact]
private void ShouldCreateCheckoutSdksWithSubdomain()
{
+ var logFactory = TestLoggerFactoryHelper.Instance;
var checkoutApi1 = CheckoutSdk
.Builder()
.Previous()
@@ -106,6 +116,7 @@ private void ShouldCreateCheckoutSdksWithSubdomain()
.SecretKey(ValidPreviousSk)
.Environment(Environment.Sandbox)
.EnvironmentSubdomain("1234doma")
+ .LogProvider(logFactory)
.Build();
checkoutApi1.ShouldNotBeNull();
@@ -117,6 +128,7 @@ private void ShouldCreateCheckoutSdksWithSubdomain()
.SecretKey(ValidPreviousSk)
.Environment(Environment.Sandbox)
.EnvironmentSubdomain("1234doma")
+ .LogProvider(logFactory)
.Build();
checkoutApi2.ShouldNotBeNull();
diff --git a/test/CheckoutSdkTest/HandlePaymentsAndPayouts/PaymentSetups/PaymentSetupsClientTest.cs b/test/CheckoutSdkTest/HandlePaymentsAndPayouts/PaymentSetups/PaymentSetupsClientTest.cs
new file mode 100644
index 00000000..13cdc461
--- /dev/null
+++ b/test/CheckoutSdkTest/HandlePaymentsAndPayouts/PaymentSetups/PaymentSetupsClientTest.cs
@@ -0,0 +1,149 @@
+using Checkout.Common;
+using Checkout.Payments;
+using Checkout.Payments.Setups;
+using Checkout.Payments.Setups.Entities;
+using Moq;
+using Shouldly;
+using System.Threading;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace Checkout.HandlePaymentsAndPayouts.PaymentSetups
+{
+ public class PaymentSetupsClientTest : UnitTestFixture
+ {
+ private readonly SdkAuthorization _authorization = new SdkAuthorization(PlatformType.Default, ValidDefaultPk);
+ private readonly Mock _apiClient = new Mock();
+ private readonly Mock _sdkCredentials = new Mock(PlatformType.Default);
+ private readonly Mock _httpClientFactory = new Mock();
+ private readonly Mock _configuration;
+
+ public PaymentSetupsClientTest()
+ {
+ _sdkCredentials.Setup(credentials => credentials.GetSdkAuthorization(SdkAuthorizationType.SecretKeyOrOAuth))
+ .Returns(_authorization);
+
+ _configuration = new Mock(_sdkCredentials.Object,
+ Environment.Sandbox, _httpClientFactory.Object);
+ }
+
+ [Fact]
+ public async Task CreatePaymentSetup_WhenRequestIsValid_ShouldSucceed()
+ {
+ // Arrange
+ var request = CreateValidPaymentSetupsRequest();
+ var expectedResponse = new PaymentSetupsResponse { Id = "ps_test_12345" };
+
+ _apiClient.Setup(apiClient => apiClient.Post(
+ "payments/setups",
+ _authorization,
+ request,
+ CancellationToken.None,
+ null))
+ .ReturnsAsync(expectedResponse);
+
+ IPaymentSetupsClient paymentSetupsClient = new PaymentSetupsClient(_apiClient.Object, _configuration.Object);
+
+ // Act
+ var response = await paymentSetupsClient.CreatePaymentSetup(request);
+
+ // Assert
+ response.ShouldNotBeNull();
+ response.Id.ShouldBe("ps_test_12345");
+ }
+
+ [Fact]
+ public async Task UpdatePaymentSetup_WhenRequestIsValid_ShouldSucceed()
+ {
+ // Arrange
+ var paymentSetupId = "ps_test_12345";
+ var request = CreateValidPaymentSetupsRequest();
+ var expectedResponse = new PaymentSetupsResponse { Id = paymentSetupId };
+
+ _apiClient.Setup(apiClient => apiClient.Put(
+ $"payments/setups/{paymentSetupId}",
+ _authorization,
+ request,
+ CancellationToken.None,
+ null))
+ .ReturnsAsync(expectedResponse);
+
+ IPaymentSetupsClient paymentSetupsClient = new PaymentSetupsClient(_apiClient.Object, _configuration.Object);
+
+ // Act
+ var response = await paymentSetupsClient.UpdatePaymentSetup(paymentSetupId, request);
+
+ // Assert
+ response.ShouldNotBeNull();
+ response.Id.ShouldBe(paymentSetupId);
+ }
+
+ [Fact]
+ public async Task GetPaymentSetup_WhenIdIsValid_ShouldSucceed()
+ {
+ // Arrange
+ var paymentSetupId = "ps_test_12345";
+ var expectedResponse = new PaymentSetupsResponse { Id = paymentSetupId };
+
+ _apiClient.Setup(apiClient => apiClient.Get(
+ $"payments/setups/{paymentSetupId}",
+ _authorization,
+ CancellationToken.None))
+ .ReturnsAsync(expectedResponse);
+
+ IPaymentSetupsClient paymentSetupsClient = new PaymentSetupsClient(_apiClient.Object, _configuration.Object);
+
+ // Act
+ var response = await paymentSetupsClient.GetPaymentSetup(paymentSetupId);
+
+ // Assert
+ response.ShouldNotBeNull();
+ response.Id.ShouldBe(paymentSetupId);
+ }
+
+ [Fact]
+ public async Task ConfirmPaymentSetup_WhenParametersAreValid_ShouldSucceed()
+ {
+ // Arrange
+ var paymentSetupId = "ps_test_12345";
+ var paymentMethodOptionId = "opt_test_67890";
+ var expectedResponse = new PaymentSetupsConfirmResponse { Id = "pay_test_confirm_111" };
+
+ // El método ConfirmPaymentSetup usa Post con 3 parámetros: path, authorization, cancellationToken
+ _apiClient.Setup(apiClient => apiClient.Post(
+ $"payments/setups/{paymentSetupId}/confirm/{paymentMethodOptionId}",
+ _authorization,
+ It.IsAny