Stripe.net is a full service .net api for http://stripe.com. It includes support for Plans, Tokens, Customers, Charges, Subscriptions, Invoices, and Events.
For more information about the examples below, you can visit https://stripe.com/docs/api for a full reference.
Add a reference to Stripe.net.dll (You can find a pre-compiled version in the build folder of this repository or install Stripe.net via NuGet)
Next you will need to provide Stripe.net with your api key. There are 3 ways to do this: Choose one.
a) Add an AppSetting with your api key to your config (this is the easiest way)
<appSettings>
...
<add key="StripeApiKey" value="[your api key here]" />
...
</appSettings>
b) In your application initialization, call (this is a programmatic way, but you only have to do it once during startup)
StripeConfiguration.SetApiKey("[your api key here]");
c) In any of the service constructors documented below, you can optionally pass the api key (not recommended for single app/single key use). i.e...
var planService = new StripePlanService("[your api key here]");
Use the library :)
If your site has multiple offerings, plans are perfect. You can create as many plans as you want and then just assign customers to those plans later on.
var myPlan = new StripePlanCreateOptions();
myPlan.AmountInCents = 1000; // all amounts on Stripe are in cents
myPlan.Currency = "usd"; // "usd" only supported right now
myPlan.Interval = "month"; // "month" or "year"
myPlan.IntervalCount = 1; // optional
myPlan.Name = "Bronze";
myPlan.TrialPeriodDays = 30; // amount of time that will lapse before the customer is billed
var planService = new StripePlanService();
StripePlan response = planService.Create(myPlan);
The returned StripePlan entity above will have a unique Id. You will want to persist this for later. When you create a customer you will be able to assign them to a plan id (or not)
var planService = new StripePlanService();
StripePlan response = planService.Get(*planId*);
var planService = new StripePlanService();
planService.Delete(*planId*);
var planService = new StripePlanService();
IEnumerable<StripePlan> response = planService.List(); // can optionally pass count (defaults to 10) and offset
var myCoupon = new StripeCouponCreateOptions();
myCoupon.Id = "HOLIDAY10OFF";
myCoupon.PercentOff = "10";
myCoupon.Duration = "repeating"; // "forever", "once", or "repeating"
myCoupon.DurationInMonths = 3; // valid when "repeating" only
// set these if you want to
myCoupon.MaxRedemptions = 100;
myCoupon.RedeemBy = '12/31/2012';
var couponService = new StripeCouponService();
StripeCoupon response = couponService.Create(myCoupon);
var couponService = new StripeCouponService();
StripeCoupon response = couponService.Get(*couponId*);
var couponService = new StripeCouponService();
couponService.Delete(*couponId*);
var couponService = new StripeCouponService();
IEnumerable<StripeCoupon> response = couponService.List(); // can optionally pass count (defaults to 10) and offset
A token can be used anywhere on Stripe where you would normally pass a card. Once it's created, it can be used on a customer or a charge, but only used once.
var myToken = new StripeTokenCreateOptions();
myToken.CardAddressCountry = "US";
myToken.CardAddressLine1 = "24 Portal St";
myToken.CardAddressLine2 = "Unit B";
myToken.CardAddressCity = "Biggie Smalls";
myToken.CardAddressState = "NC";
myToken.CardAddressZip = "27617";
myToken.CardCvc = "1223";
myToken.CardExpirationMonth = "10";
myToken.CardExpirationYear = "2012";
myToken.CardName = "Gabe Newell";
myToken.CardNumber = "4242424242424242";
myToken.AmountInCents = 5153;
myToken.Currency = "usd";
var tokenService = new StripeTokenService();
StripeToken stripeToken = tokenService.Create(myToken);
Tokens are very useful if you don't want to store the customers credit card information on your servers (very good for pci compliance).
var tokenService = new StripeTokenService();
StripeToken stripeToken = tokenService.Get(*tokenId*);
When creating a customer, you can specify any plan they are on, any coupons that will apply, a credit card or token, and various meta data.
var myCustomer = new StripeCustomerCreateOptions();
// set these properties if it makes you happy
myCustomer.Email = "pork@email.com";
myCustomer.Description = "Johnny Tenderloin (pork@email.com)";
// set these properties if using a card
myCustomer.CardNumber = "4242424242424242";
myCustomer.CardExpirationYear = "2012";
myCustomer.CardExpirationMonth = "10";
myCustomer.CardAddressCountry = "US"; // optional
myCustomer.CardAddressLine1 = "24 Beef Flank St"; // optional
myCustomer.CardAddressLine2 = "Apt 24"; // optional
myCustomer.CardAddressCity = "Biggie Smalls"; // optional
myCustomer.CardAddressState = "NC"; // optional
myCustomer.CardAddressZip = "27617"; // optional
myCustomer.CardName = "Joe Meatballs"; // optional
myCustomer.CardCvc = "1223"; // optional
// set this property if using a token
myCustomer.TokenId = *tokenId*;
myCustomer.PlanId = *planId*; // only if you have a plan
myCustomer.Coupon = *couponId*; // only if you have a coupon
myCustomer.TrialEnd = DateTime.UtcNow.AddMonths(1); // when the customers trial ends (overrides the plan if applicable)
myCustomer.Quantity = 1; // optional, defaults to 1
var customerService = new StripeCustomerService();
StripeCustomer stripeCustomer = customerService.Create(myCustomer);
Don't let this be intimidating - all of these fields are optional. You could just create a customer with an email if you wanted.
var myCustomer = new StripeCustomerUpdateOptions()
// set these properties if it makes you happy
myCustomer.Email = "pork@email.com";
myCustomer.Description = "Johnny Tenderloin (pork@email.com)";
// set these properties if using a card
myCustomer.CardNumber = "4242424242424242";
myCustomer.CardExpirationYear = "2012";
myCustomer.CardExpirationMonth = "10";
myCustomer.CardAddressCountry = "US"; // optional
myCustomer.CardAddressLine1 = "24 Beef Flank St"; // optional
myCustomer.CardAddressLine2 = "Apt 24"; // optional
myCustomer.CardAddressState = "NC"; // optional
myCustomer.CardAddressZip = "27617"; // optional
myCustomer.CardName = "Joe Meatballs"; // optional
myCustomer.CardCvc = "1223"; // optional
// set this property if using a token
myCustomer.TokenId = *tokenId*;
myCustomer.Coupon = *couponId*; // only if you have a coupon
var customerService = new StripeCustomerService();
StripeCustomer stripeCustomer = customerService.Update(*customerId*, myCustomer);
var customerService = new StripeCustomerService();
StripeCustomer stripeCustomer = customerService.Get(*customerId*);
Customers that are deleted can still be retrieved through the api. The Deleted property will be set to true if they are deleted.
var customerService = new StripeCustomerService();
customerService.Delete(*customerId*);
var customerService = new StripeCustomerService();
IEnumerable<StripeCustomer> response = customerService.List(); // can optionally pass count (defaults to 10) and offset
var myUpdatedSubscription = new StripeCustomerUpdateSubscriptionOptions()
// set these properties if using a card
myUpdatedSubscription.CardNumber = "4242424242424242";
myUpdatedSubscription.CardExpirationYear = "2012";
myUpdatedSubscription.CardExpirationMonth = "10";
myUpdatedSubscription.CardAddressCountry = "US"; // optional
myUpdatedSubscription.CardAddressLine1 = "24 Beef Flank St"; // optional
myUpdatedSubscription.CardAddressLine2 = "Apt 24"; // optional
myUpdatedSubscription.CardAddressState = "NC"; // optional
myUpdatedSubscription.CardAddressZip = "27617"; // optional
myUpdatedSubscription.CardName = "Joe Meatballs"; // optional
myUpdatedSubscription.CardCvc = "1223"; // optional
// set this property if using a token
myUpdatedSubscription.TokenId = *tokenId*;
myUpdatedSubscription.PlanId = *planId*;
myUpdatedSubscription.CouponId = *couponId*;
myUpdatedSubscription.TrialEnd = DateTime.UtcNow.AddMonths(1);
myUpdatedSubscription.Quantity = 1; // optional, defaults to 1
var customerService = new StripeCustomerService();
StripeSubscription subscription = customerService.UpdateSubscription(*customerId*, myUpdatedSubscription);
var customerService = new StripeCustomerService();
StripeSubscription subscription = customerService.CancelSubscription(*customerId*); // you can optionally pass cancelAtPeriodEnd instead of immediately cancelling
When creating a charge you can use either a card, customer, or a token. Only one is allowed.
var myCharge = new StripeChargeCreateOptions();
// always set these properties
myCharge.AmountInCents = 5153;
myCharge.Currency = "usd";
// set this if you want to
myCharge.Description = "Charge it like it's hot";
// set these properties if using a card
myCharge.CardNumber = "4242424242424242";
myCharge.CardExpirationYear = "2012";
myCharge.CardExpirationMonth = "10";
myCharge.CardAddressCountry = "US"; // optional
myCharge.CardAddressLine1 = "24 Beef Flank St" // optional
myCharge.CardAddressLine2 = "Apt 24"; // optional
myCharge.CardAddressState = "NC"; // optional
myCharge.CardAddressZip = "27617"; // optional
myCharge.CardName = "Joe Meatballs"; // optional
myCharge.CardCvc = "1223"; // optional
// set this property if using a customer
myCharge.CustomerId = *customerId*;
// set this property if using a token
myCharge.TokenId = *tokenId*;
// set this if you have your own application fees (you must have your application configured first within Stripe)
myCharge.ApplicationFeeInCents = 25;
var chargeService = new StripeChargeService();
StripeCharge stripeCharge = chargeService.Create(myCharge);
var chargeService = new StripeChargeService();
StripeCharge stripeCharge = chargeService.Get(*chargeId*);
If you do not specify an amountInCents, the entire charge is refunded. The StripeCharge entity has properties for "Refunded" (bool) and RefundedAmountInCents.
var chargeService = new StripeChargeService();
StripeCharge stripeCharge = chargeService.Refund(*chargeId*, *amountInCents*);
var chargeService = new StripeChargeService();
IEnumerable<StripeCharge> response = chargeService.List(); // can optionally pass count (defaults to 10), offset, and a customerId to get charges for a single customer
var invoiceService = new StripeInvoiceService();
StripeInvoice response = invoiceService.Get(*invoiceId*);
var invoiceService = new StripeInvoiceService();
StripeInvoice response = invoiceService.Upcoming(*customerId*);
var invoiceService = new StripeInvoiceService();
IEnumerable<StripeInvoice> response = invoiceService.List(); // can optionally pass count (defaults to 10), offset, and a customerid
Any invoice items you create for a customer will be added to their bill.
var myItem = new StripeInvoiceItemCreateOptions();
myItem.AmountInCents = 1000; // all amounts on Stripe are in cents
myItem.Currency = "usd"; // "usd" only supported right now
myItem.CustomerId = *customerId*;
myItem.Description = "na"; // not required
var invoiceItemService = new StripeInvoiceItemService();
StripeInvoiceItem response = invoiceItemService.Create(myItem);
var invoiceItemService = new StripeInvoiceItemService();
StripeInvoiceItem response = invoiceItemService.Get(*invoiceItemId*);
var myUpdatedItem = new StripeInvoiceItemUpdateOptions();
myUpdatedItem.AmountInCents = 1010; // all amounts on Stripe are in cents
myUpdatedItem.Currency = "usd"; // "usd" only supported right now
myUpdatedItem.Description = "test"; // not required
var invoiceItemService = new StripeInvoiceItemService();
StripeInvoiceItem response = invoiceItemService.Update(*invoiceItemId*, myUpdatedItem);
var invoiceItemService = new StripeInvoiceItemService();
invoiceItemService.Delete(*invoiceItemId*);
var invoiceItemService = new StripeInvoiceItemService();
IEnumerable<StripeInvoiceItem> response = invoiceItemService.List(); // can optionally pass count (defaults to 10), offset, and a customerid
Stripe sends Events (or webhooks) whenever an associated action occurs. The list of events Stripe sends is documented here: https://stripe.com/docs/api#event_types
-
In your application, create a handler that looks something like the below:
namespace TheBestApplicationEverCreated { public class StripeHandler : IHttpHandler { public bool IsReusable { get { return true; } }
public void ProcessRequest(HttpContext context) { var json = new StreamReader(context.Request.InputStream).ReadToEnd(); var stripeEvent = StripeEventUtility.ParseEvent(json); switch (stripeEvent.Type) { case "charge.refunded": // take a look at all the types here: https://stripe.com/docs/api#event_types var stripeCharge = Stripe.Mapper<StripeCharge>.MapFromJson(stripeEvent.Data.Object.ToString()); break; } } }
}
-
Create a StripeHandler.ashx in the root of your website (or wherever) that looks like this:
<%@ WebHandler Language="C#" Class="StripeHandler" CodeBehind="StripeHandler.cs" %>
-
Login to Stripe and go to Account Settings, webhooks - from here, you can setup the url that points to your StripeHandler.ashx for testing.
Whenever an Event is received, StripeEventUtility.ParseEvent(json) will convert the response into a StripeEvent object.
If you have the id and you want to retrieve the event
var eventService = new StripeEventService();
StripeEvent response = eventService.Get(*eventId*)
You can list events in the same way everything else works in Stripe.net.
var eventService = new StripeEventService();
IEnumerable<StripeEvent> response = eventService.List(); // can optionally pass count (defaults to 10), offset, and StripeEventSearchOptions
You can also optionally pass a StripeSearchEventOptions which supports a specific Created timestamp, LessThan, LessThanOrEqualTo, GreaterThan, or GreaterThanOrEqualTo.
var eventService = new StripeEventService();
var eventSearchOptions = new StripeEventSearchOptions();
// created will match on an exact date time
eventSearchOptions.Created = DateTime.UtcNow;
// or you could do something like
eventSearchOptions.LessThanOrEqualTo = DateTime.UtcNow;
eventSearchOptions.GreaterThanOrEqualTo = DateTime.UtcNow.AddMonths(-1);
IEnumerable<StripeEvent> response = eventService.List(10, 0, eventSearchOptions);
Any errors that occur on any of the services will throw a StripeException with the message returned from Stripe. It is a good idea to run your service calls in a try and catch StripeException.
The StripeException contains and HttpStatusCode and a StripeError entity. The StripeError entity contains the type, message, code and param. For more infomation, review the Errors section of stripe here: https://stripe.com/docs/api#errors