Skip to content

Instantly share code, notes, and snippets.

@dimitrispaxinos
Created September 29, 2023 09:41
Show Gist options
  • Save dimitrispaxinos/9bc073ce37b6389d51916607e64b67c9 to your computer and use it in GitHub Desktop.
Save dimitrispaxinos/9bc073ce37b6389d51916607e64b67c9 to your computer and use it in GitHub Desktop.
/**
* Stripe API Client for handling various Stripe operations.
*/
class StripeApiClient {
constructor(apiKey) {
this.apiKey = apiKey;
}
/**
* Private method to make requests to the Stripe API.
* @param {string} endpoint - The Stripe API endpoint.
* @param {string} method - The HTTP method (e.g., 'post', 'get').
* @param {object} data - The data payload for the request.
* @returns {object} - The parsed JSON response from the Stripe API.
*/
_makeRequest(endpoint, method, data) {
let headers = {
"Authorization": "Bearer " + this.apiKey,
"Content-Type": "application/x-www-form-urlencoded"
};
let options = {
"method": method,
"headers": headers,
"payload": data
};
let response = UrlFetchApp.fetch('https://api.stripe.com/v1/' + endpoint, options);
return JSON.parse(response.getContentText());
}
/**
* Create a new customer in Stripe.
* @param {string} name - The customer's name.
* @param {string} email - The customer's email address.
* @param {string} address - The customer's address.
* @param {string} country - The customer's country.
* @param {string} city - The customer's city.
* @param {string} postalCode - The customer's postal code.
* @returns {object} - The created customer object.
*/
createCustomer(name, email, address, country, city, postalCode) {
let customerData = {
"name": name,
"email": email,
"address[line1]": address,
"address[city]": city,
"address[postal_code]": postalCode,
"address[country]": country
};
return this._makeRequest('customers', 'post', customerData);
}
/**
* Create a subscription for a customer.
* @param {string} customerId - The ID of the customer.
* @param {string} priceId - The ID of the price.
* @param {number} duration - The duration of the subscription in months.
* @param {number} trialDays - The trial period in days.
* @returns {object} - The created subscription object.
*/
createSubscription(customerId, priceId, duration, trialDays) {
let currentDate = new Date();
currentDate.setMonth(currentDate.getMonth() + parseInt(duration));
let cancelAtTimestamp = Math.floor(currentDate.getTime() / 1000);
let subscriptionData = {
"customer": customerId,
"items[0][price]": priceId,
"cancel_at": cancelAtTimestamp.toString(),
};
if(trialDays > 0) {
let trialEndDate = new Date();
trialEndDate.setDate(trialEndDate.getDate() + trialDays);
let trialEndTimestamp = Math.floor(trialEndDate.getTime() / 1000);
subscriptionData["trial_end"] = trialEndTimestamp.toString();
}
return this._makeRequest('subscriptions', 'post', subscriptionData);
}
/**
* Create a checkout session for a customer.
* @param {string} priceId - The ID of the price.
* @param {string} customerId - The ID of the customer.
* @param {string} [success_url="https://your-success-url.com"] - The URL to redirect to upon successful checkout.
* @param {string} [cancel_url="https://your-cancel-url.com"] - The URL to redirect to upon checkout cancellation.
* @returns {object} - The created checkout session object.
*/
createCheckoutSession(priceId, customerId, payment_method_type = "card", success_url = "https://your-success-url.com", cancel_url = "https://your-cancel-url.com") {
let sessionData = {
"customer": customerId,
"payment_method_types[]": payment_method_type,
"line_items[0][price]": priceId,
"line_items[0][quantity]": "1",
"mode": "subscription",
"success_url": success_url,
"cancel_url": cancel_url
};
return this._makeRequest('checkout/sessions', 'post', sessionData);
}
/**
* Fetch a list of customers from Stripe.
* @returns {object} - The list of customers.
*/
fetchCustomers() {
return this._makeRequest('customers', 'get', {});
}
/**
* Fetch a list of products from Stripe.
* @returns {object} - The list of products.
*/
fetchProducts() {
return this._makeRequest('products', 'get', {});
}
fetchProduct(productId) {
return this._makeRequest('products/' + productId, 'get', {});
}
/**
* Fetch a list of prices for a specific product from Stripe.
* @param {string} product - The ID of the product.
* @returns {object} - The list of prices for the specified product.
*/
fetchProductPrices(product) {
return this._makeRequest('prices?product=' + product, 'get', {});
}
/**
* Create a new price for a product in Stripe.
* @param {number} unit_amount - The amount for the price.
* @param {string} product - The ID of the product.
* @param {string} currency - The currency for the price.
* @returns {object} - The created price object.
*/
createProductPrice(unit_amount, product, currency) {
let priceData = {
"product": product,
"unit_amount": unit_amount.toString(),
"currency": currency,
"recurring[interval]": "month"
};
return this._makeRequest('prices', 'post', priceData);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment