Created
September 29, 2023 09:41
-
-
Save dimitrispaxinos/9bc073ce37b6389d51916607e64b67c9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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