Welcome to PayPal Dotnet SDK. This repository content is build on top of the paypal-rest-api-specifications using microsoft/kiota.
Please refer to the PayPal REST APIs for more information.
.NET 8.0, or higher
Get client ID and client secret by going to https://developer.paypal.com/dashboard/.
This repository contains the following packages:
- Aviationexam.PayPalSdk.Common
- Aviationexam.PayPalSdk.Payments
- Aviationexam.PayPalSdk.Orders
Common package is required to be installed for other packages to work. Payments contains Payments related APIs. Orders contains Checkout Orders related APIs.
void Configure(IServiceCollection serviceCollection)
{
serviceCollection
.AddPayPalRestApiClient(
builder => builder.Configure(x =>
{
x.Environment = EPayPalEnvironment.Sandbox;
x.Timeout = TimeSpan.FromSeconds(20);
}),
shouldRedactHeaderValue: shouldRedactHeaderValue
)
.AddAuthorization(builder => builder.Configure(x =>
{
x.ClientId = "ClientId";
x.ClientSecret = "ClientSecret";
x.JwtEarlyExpirationOffset = TimeSpan.FromMinutes(5);
}), shouldRedactHeaderValue: shouldRedactHeaderValue)
.AddPaymentsApi() // adds payments api
.AddCheckoutOrdersApi() // adds checkot orders api
}This will create an order and print order id for the created order
public async static Task<Aviationexam.PayPalSdk.Payments.PayPalCheckoutOrdersClientV2.Models.Order?> CreateOrder(PayPalOrdersApiV2Client payPalOrdersApiV2Client)
{
var order = new Order_request
{
Intent = Checkout_payment_intent.CAPTURE,
PurchaseUnits =
[
new Purchase_unit_request
{
ReferenceId = "test_ref_id1",
InvoiceId = "123456",
Amount = new Amount_with_breakdown
{
CurrencyCode = "EUR",
Value = "230.00",
Breakdown = new Amount_breakdown
{
ItemTotal = new Money
{
CurrencyCode = "EUR",
Value = "220.00",
},
Shipping = new Money
{
CurrencyCode = "EUR",
Value = "10.00",
},
},
},
Items =
[
new Item
{
Name = "T-shirt",
UnitAmount = new Money
{
CurrencyCode = "EUR",
Value = "20.00",
},
Quantity = "1",
Sku = "sku1",
Category = Item_category.PHYSICAL_GOODS,
},
new Item
{
Name = "Shoes",
UnitAmount = new Money
{
CurrencyCode = "EUR",
Value = "100.00",
},
Quantity = "2",
Sku = "sku2",
Category = Item_category.PHYSICAL_GOODS,
},
],
},
],
ApplicationContext = new Order_application_context
{
ReturnUrl = "https://www.example.com",
CancelUrl = "https://www.example.com",
},
};
var payPalRequestId = Guid.NewGuid();
var createdOrder = await payPalOrdersApiV2Client.V2.Checkout.Orders.PostAsync(
BuildRequestBody(),
x => x.Headers.Add("PayPal-Request-Id", payPalRequestId.ToString()),
cancellationToken: TestContext.Current.CancellationToken
);
Console.WriteLine("Status: {0}", createdOrder.Status);
Console.WriteLine("Order Id: {0}", createdOrder.Id);
Console.WriteLine("Links:");
foreach (var link in createdOrder.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
return createdOrder;
}Before capturing an order, order should be approved by the buyer using the approve link in create order response
public async static Task<Aviationexam.PayPalSdk.Payments.PayPalCheckoutOrdersClientV2.Models.Order?> CaptureOrder(this PayPalOrdersApiV2Client payPalOrdersApiV2Client, string orderId)
{
var getOrderResponse = await payPalOrdersApiV2Client.V2.Checkout.Orders[createdOrder.Id].GetAsync(cancellationToken: TestContext.Current.CancellationToken);
if (getOrderResponse.Status is Order_status.APPROVED)
{
var captureOrderResponse = await payPalOrdersApiV2Client.V2.Checkout.Orders[createdOrder.Id].Capture.PostAsync(
new Order_capture_request(),
cancellationToken: TestContext.Current.CancellationToken
);
return captureOrderResponse;
}
return null;
}To run integration tests using your client id and secret, run the test
PAYPAL_CLIENT_ID=YOUR_SANDBOX_CLIENT_ID PAYPAL_CLIENT_SECRET=YOUR_SANDBOX_CLIENT_SECRET dotnet test