pay-connect
Version:
A module for integrating multiple payment gateways including PayPal, Stripe, GooglePay and Momo.
1,119 lines (1,106 loc) • 35.9 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/index.ts
var index_exports = {};
__export(index_exports, {
GooglePayGateway: () => GooglePayGateway,
MomoGateway: () => MomoGateway,
PaypalGateway: () => PaypalGateway,
StripeGateway: () => StripeGateway,
initializeGateways: () => initializeGateways,
loadStripeClient: () => loadStripeClient
});
module.exports = __toCommonJS(index_exports);
// src/gateways/momo.ts
var MomoGateway = class {
startPayment(amount, orderId) {
return Promise.resolve(`Payment of ${amount} for order ${orderId} started.`);
}
confirmPayment(paymentId) {
return Promise.resolve(`Payment with ID ${paymentId} confirmed.`);
}
cancelPayment(paymentId) {
return Promise.resolve(`Payment with ID ${paymentId} canceled.`);
}
};
// src/gateways/paypal/utils.ts
function handleResponse(response) {
return __async(this, null, function* () {
if (response.status === 204) {
return {
jsonResponse: null,
httpStatusCode: response.status
};
}
try {
const jsonResponse = yield response.json();
return {
jsonResponse,
httpStatusCode: response.status
};
} catch (err) {
const errorMessage = yield response.text();
throw new Error(errorMessage);
}
});
}
// src/gateways/paypal/orders.ts
var PayPalOrders = class {
constructor(options, baseUrl, generateAccessToken) {
this.options = options;
this.baseUrl = baseUrl;
this.generateAccessToken = generateAccessToken;
}
createOrder(data) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v2/checkout/orders`;
const payload = {
intent: this.options.intent,
purchase_units: [
{
amount: {
currency_code: this.options.currency,
value: data.total,
breakdown: {
item_total: {
currency_code: this.options.currency,
value: data.subtotal
},
discount: {
currency_code: this.options.currency,
value: data.discount
},
tax_total: {
currency_code: this.options.currency,
value: data.tax
}
}
},
shipping: {
name: {
full_name: data.billing_info.name
},
address: {
address_line_1: data.billing_info.address,
admin_area_2: data.billing_info.city,
admin_area_1: this.options.buyerCountry,
country_code: this.options.buyerCountry
}
}
}
]
};
if (this.options.buyerCountry === "US") {
payload.purchase_units[0].shipping.address.postal_code = data.billing_info.postal_code;
}
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(payload)
});
return handleResponse(response);
});
}
captureOrder(orderID) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v2/checkout/orders/${orderID}/capture`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
};
// src/gateways/paypal/subscriptions.ts
var PayPalSubscriptions = class {
constructor(options, baseUrl, generateAccessToken) {
this.options = options;
this.baseUrl = baseUrl;
this.generateAccessToken = generateAccessToken;
}
createPlan(data) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/plans`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(data)
});
return handleResponse(response);
});
}
getPlanList() {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/plans`;
const response = yield fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
getPlanDetails(planID) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/plans/${planID}`;
const response = yield fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
updatePlan(planID, data) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/plans/${planID}`;
const response = yield fetch(url, {
method: "PATCH",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(data)
});
return handleResponse(response);
});
}
updatePlanPricing(planID, data) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/plans/${planID}/update-pricing-schemes`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(data)
});
return handleResponse(response);
});
}
createSubscription(data) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/subscriptions`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(data)
});
return handleResponse(response);
});
}
getSubscriptionDetails(subscriptionID) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/subscriptions/${subscriptionID}`;
const response = yield fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
updateSubscription(subscriptionID, data) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/subscriptions/${subscriptionID}`;
const response = yield fetch(url, {
method: "PATCH",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(data)
});
return handleResponse(response);
});
}
cancelSubscription(subscriptionID, reason) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/subscriptions/${subscriptionID}/cancel`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify({ reason })
});
return handleResponse(response);
});
}
activateSubscription(subscriptionID) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/subscriptions/${subscriptionID}/activate`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
captureSubscription(subscriptionID) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/subscriptions/${subscriptionID}/capture`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
suspendSubscription(subscriptionID, reason) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/subscriptions/${subscriptionID}/suspend`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify({ reason })
});
return handleResponse(response);
});
}
reviseSubscription(subscriptionID, data) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/subscriptions/${subscriptionID}/revise`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(data)
});
return handleResponse(response);
});
}
listSubscriptionTransactions(subscriptionID, startTime, endTime) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/billing/subscriptions/${subscriptionID}/transactions?start_time=${startTime}&end_time=${endTime}`;
const response = yield fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
};
// src/gateways/paypal/payments.ts
var PayPalPayments = class {
constructor(options, baseUrl, generateAccessToken) {
this.options = options;
this.baseUrl = baseUrl;
this.generateAccessToken = generateAccessToken;
}
refundCapturedPayment(captureID, amount) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v2/payments/captures/${captureID}/refund`;
const payload = {
amount: {
value: amount,
currency_code: this.options.currency
}
};
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(payload)
});
return handleResponse(response);
});
}
getCaptureDetails(captureID) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v2/payments/captures/${captureID}`;
const response = yield fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
};
// src/gateways/paypal/products.ts
var PayPalProducts = class {
constructor(options, baseUrl, generateAccessToken) {
this.options = options;
this.baseUrl = baseUrl;
this.generateAccessToken = generateAccessToken;
}
createProduct(data) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/catalogs/products`;
const response = yield fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(data)
});
return handleResponse(response);
});
}
getProductList() {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/catalogs/products`;
const response = yield fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
getProductDetails(productId) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/catalogs/products/${productId}`;
const response = yield fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`
}
});
return handleResponse(response);
});
}
updateProduct(productId, data) {
return __async(this, null, function* () {
const accessToken = yield this.generateAccessToken();
const url = `${this.baseUrl}/v1/catalogs/products/${productId}`;
const response = yield fetch(url, {
method: "PATCH",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
Authorization: `Bearer ${accessToken}`
},
body: JSON.stringify(data)
});
return handleResponse(response);
});
}
};
// src/gateways/paypal/index.ts
var import_paypal_js = require("@paypal/paypal-js");
var PaypalGateway = class {
constructor(options) {
const defaultOptions = {
currency: "USD",
intent: "CAPTURE",
vault: false,
buyerCountry: "US",
locale: "en_US"
};
this.options = __spreadValues(__spreadValues({}, defaultOptions), options);
this.clientId = this.options.clientId || "test";
this.clientSecret = this.options.clientSecret;
this.baseUrl = this.options.environment === "production" ? "https://api-m.paypal.com" : "https://api-m.sandbox.paypal.com";
this.orders = new PayPalOrders(
this.options,
this.baseUrl,
this.generateAccessToken.bind(this)
);
this.subscriptions = new PayPalSubscriptions(
this.options,
this.baseUrl,
this.generateAccessToken.bind(this)
);
this.payments = new PayPalPayments(
this.options,
this.baseUrl,
this.generateAccessToken.bind(this)
);
this.products = new PayPalProducts(
this.options,
this.baseUrl,
this.generateAccessToken.bind(this)
);
}
generateAccessToken() {
return __async(this, null, function* () {
if (!this.clientSecret) {
throw new Error("Client secret is required for generating access token");
}
const auth = Buffer.from(
`${this.options.clientId}:${this.clientSecret}`
).toString("base64");
const response = yield fetch(`${this.baseUrl}/v1/oauth2/token`, {
method: "POST",
body: "grant_type=client_credentials",
headers: {
Authorization: `Basic ${auth}`,
"Content-Type": "application/x-www-form-urlencoded"
}
});
if (!response.ok) {
throw new Error(`Failed to generate access token: ${response.statusText}`);
}
const data = yield response.json();
return data.access_token;
});
}
renderCheckoutButtons(_0) {
return __async(this, arguments, function* (containerId, options = {}) {
const defaultOptions = {
style: {
shape: "rect",
layout: "vertical",
color: "gold",
label: "paypal"
}
};
options = Object.assign({}, defaultOptions, options);
let paypal;
try {
paypal = yield (0, import_paypal_js.loadScript)({ clientId: this.clientId });
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal && paypal.Buttons) {
try {
yield paypal.Buttons(options).render(`#${containerId}`);
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
});
}
renderSubscriptionButtons(_0) {
return __async(this, arguments, function* (containerId, options = {}) {
const defaultOptions = {
style: {
layout: "vertical",
color: "blue",
shape: "rect",
label: "subscribe"
}
};
options = Object.assign({}, defaultOptions, options);
let paypal;
try {
paypal = yield (0, import_paypal_js.loadScript)({
clientId: this.clientId,
vault: true,
dataNamespace: "paypal_subscriptions"
});
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal && paypal.Buttons) {
try {
yield paypal.Buttons(options).render(`#${containerId}`);
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
});
}
};
// src/gateways/stripe/types.ts
var import_stripe = require("stripe");
// src/gateways/stripe/index.ts
var import_stripe_js = require("@stripe/stripe-js");
var loadStripeClient = (publishableKey) => __async(void 0, null, function* () {
try {
const clientStripe = yield (0, import_stripe_js.loadStripe)(publishableKey);
return clientStripe;
} catch (error) {
console.error("Error loading Stripe client:", error);
throw error;
}
});
var StripeGateway = class {
constructor(options) {
let _stripe = null;
const getStripe = () => {
if (!_stripe) {
_stripe = new import_stripe.Stripe(options.secretKey, {
apiVersion: "2025-02-24.acacia"
});
}
return _stripe;
};
this.serverStripe = getStripe();
}
createCharge(amount, currency, source) {
return __async(this, null, function* () {
try {
const charge = yield this.serverStripe.charges.create({
amount,
currency,
source
});
return {
success: true,
chargeId: charge.id,
amount: charge.amount,
currency: charge.currency,
source: charge.source
};
} catch (error) {
console.error("Error creating charge:", error);
return { success: false, error: error.message };
}
});
}
retrieveCharge(chargeId) {
return __async(this, null, function* () {
try {
const charge = yield this.serverStripe.charges.retrieve(chargeId);
return {
success: true,
chargeId: charge.id,
amount: charge.amount,
currency: charge.currency,
status: charge.status
};
} catch (error) {
console.error("Error retrieving charge:", error);
return { success: false, error: error.message };
}
});
}
refundCharge(chargeId) {
return __async(this, null, function* () {
try {
const refund = yield this.serverStripe.refunds.create({
charge: chargeId
});
return {
success: true,
refundId: refund.id,
chargeId: refund.charge
};
} catch (error) {
console.error("Error refunding charge:", error);
return { success: false, error: error.message };
}
});
}
createSubscription(customerId, priceId) {
return __async(this, null, function* () {
if (!priceId) {
return { success: false, error: "Price ID cannot be empty." };
}
try {
const subscription = yield this.serverStripe.subscriptions.create({
customer: customerId,
items: [{ price: priceId }]
});
return {
success: true,
subscriptionId: subscription.id,
status: subscription.status
};
} catch (error) {
console.error("Error creating subscription:", error);
return { success: false, error: error.message };
}
});
}
retrieveSubscription(subscriptionId) {
return __async(this, null, function* () {
try {
const subscription = yield this.serverStripe.subscriptions.retrieve(subscriptionId);
return {
success: true,
subscriptionId: subscription.id,
status: subscription.status,
items: subscription.items
};
} catch (error) {
console.error("Error retrieving subscription:", error);
return { success: false, error: error.message };
}
});
}
cancelSubscription(subscriptionId) {
return __async(this, null, function* () {
try {
const canceledSubscription = yield this.serverStripe.subscriptions.cancel(subscriptionId);
return {
success: true,
subscriptionId: canceledSubscription.id,
status: canceledSubscription.status
};
} catch (error) {
console.error("Error canceling subscription:", error);
return { success: false, error: error.message };
}
});
}
retrieveCustomer(customerId) {
return __async(this, null, function* () {
try {
const customer = yield this.serverStripe.customers.retrieve(customerId);
return {
success: true,
customerId: customer.id,
email: "deleted" in customer ? null : customer.email,
name: "deleted" in customer ? null : customer.name
};
} catch (error) {
console.error("Error retrieving customer:", error);
return { success: false, error: error.message };
}
});
}
retrievePrice(priceId) {
return __async(this, null, function* () {
try {
const price = yield this.serverStripe.prices.retrieve(priceId);
return {
success: true,
priceId: price.id,
unitAmount: price.unit_amount,
currency: price.currency
};
} catch (error) {
console.error("Error retrieving price:", error);
return { success: false, error: error.message };
}
});
}
createCustomer(email, name) {
return __async(this, null, function* () {
try {
const customer = yield this.serverStripe.customers.create({
email,
name
});
return {
success: true,
customerId: customer.id,
email: customer.email,
name: customer.name
};
} catch (error) {
console.error("Error creating customer:", error);
return { success: false, error: error.message };
}
});
}
createPrice(unitAmount, currency, productId) {
return __async(this, null, function* () {
try {
const price = yield this.serverStripe.prices.create({
unit_amount: unitAmount,
currency,
product: productId
});
return {
success: true,
priceId: price.id,
unitAmount: price.unit_amount,
currency: price.currency
};
} catch (error) {
console.error("Error creating price:", error);
return { success: false, error: error.message };
}
});
}
createProduct(name, description) {
return __async(this, null, function* () {
try {
const product = yield this.serverStripe.products.create({
name,
description
});
return {
success: true,
productId: product.id,
name: product.name,
description: product.description
};
} catch (error) {
console.error("Error creating product:", error);
return { success: false, error: error.message };
}
});
}
listProducts() {
return __async(this, null, function* () {
try {
const products = yield this.serverStripe.products.list();
return {
success: true,
products: products.data
};
} catch (error) {
console.error("Error listing products:", error);
return { success: false, error: error.message };
}
});
}
createCheckoutSession(params) {
return __async(this, null, function* () {
try {
const session = yield this.serverStripe.checkout.sessions.create(params);
console.log("checkout session:", { params });
return {
success: true,
sessionId: session.id,
url: session.url
};
} catch (error) {
console.error("Error creating checkout session:", error);
return { success: false, error: error.message };
}
});
}
};
// src/gateways/google-pay/index.ts
var import_dist = require("@google-pay/button-element/dist/index");
var GooglePayGateway = class {
constructor(options) {
this.handleLoadPaymentData = (paymentData) => {
console.log("onLoadPaymentData", paymentData);
};
this.handleCancel = (reason) => {
console.log("onCancel", reason);
};
this.handleError = (reason) => {
console.error("onError", reason);
};
this.handleClick = (event) => {
console.log("onClick", event);
};
this.onPaymentDataChanged = (intermediatePaymentData) => {
return new Promise((resolve) => {
var _a;
const { shippingAddress, shippingOptionData, callbackTrigger } = intermediatePaymentData;
const paymentDataRequestUpdate = {};
if (callbackTrigger === "INITIALIZE") {
paymentDataRequestUpdate.newShippingOptionParameters = __spreadValues({}, this.getGoogleDefaultShippingOptions());
} else if (callbackTrigger === "SHIPPING_ADDRESS") {
if ((shippingAddress == null ? void 0 : shippingAddress.administrativeArea) === "NJ") {
paymentDataRequestUpdate.error = this.getGoogleUnserviceableAddressError();
} else {
const selectedShippingOptionId = (_a = shippingOptionData == null ? void 0 : shippingOptionData.id) != null ? _a : "standard";
paymentDataRequestUpdate.newShippingOptionParameters = __spreadProps(__spreadValues({}, this.getGoogleDefaultShippingOptions()), {
defaultSelectedOptionId: selectedShippingOptionId
});
paymentDataRequestUpdate.newTransactionInfo = this.calculateNewTransactionInfo(selectedShippingOptionId);
}
} else if (callbackTrigger === "SHIPPING_OPTION") {
paymentDataRequestUpdate.newTransactionInfo = this.calculateNewTransactionInfo(shippingOptionData == null ? void 0 : shippingOptionData.id);
}
resolve(paymentDataRequestUpdate);
});
};
this.onReadyToPayChange = (result) => {
console.log("onReadyToPayChange", result);
};
this.processPayment = (paymentData) => {
return new Promise((resolve) => {
const paymentToken = paymentData.paymentMethodData.tokenizationData.token;
console.log("onPaymentAuthorized", { paymentToken });
setTimeout(() => {
resolve();
}, 1e3);
});
};
this.onPaymentAuthorized = (paymentData) => {
return new Promise((resolve) => {
this.processPayment(paymentData).then(() => {
resolve({
transactionState: "SUCCESS"
});
}).catch(() => {
resolve({
transactionState: "ERROR",
error: {
intent: "PAYMENT_AUTHORIZATION",
message: "Insufficient funds",
reason: "PAYMENT_DATA_INVALID"
}
});
});
});
};
const defaultOptions = {
environment: "TEST",
buttonType: "buy",
buttonColor: "default",
buttonSizeMode: "static",
existingPaymentMethodRequired: false,
paymentRequest: {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [
{
type: "CARD",
parameters: {
allowedAuthMethods: ["PAN_ONLY", "CRYPTOGRAM_3DS"],
allowedCardNetworks: ["MASTERCARD", "VISA"],
billingAddressRequired: true
},
tokenizationSpecification: {
type: "PAYMENT_GATEWAY",
parameters: {
gateway: "example",
gatewayMerchantId: "exampleGatewayMerchantId"
}
}
}
],
merchantInfo: {
merchantId: "12345678901234567890",
merchantName: "Demo Merchant"
},
transactionInfo: {
totalPriceStatus: "FINAL",
totalPriceLabel: "Total",
totalPrice: "100.00",
currencyCode: "USD",
countryCode: "US"
},
callbackIntents: [
"PAYMENT_AUTHORIZATION",
"SHIPPING_ADDRESS",
"SHIPPING_OPTION"
],
shippingAddressRequired: true,
shippingAddressParameters: {
phoneNumberRequired: true
},
shippingOptionRequired: true
},
onLoadPaymentData: this.handleLoadPaymentData,
onCancel: this.handleCancel,
onError: this.handleError,
onClick: this.handleClick,
paymentDataCallbacks: {
onPaymentAuthorized: this.onPaymentAuthorized,
onPaymentDataChanged: this.onPaymentDataChanged
},
onReadyToPayChange: this.onReadyToPayChange
};
this.options = __spreadValues(__spreadValues({}, defaultOptions), options);
}
getGoogleUnserviceableAddressError() {
return {
reason: "SHIPPING_ADDRESS_UNSERVICEABLE",
message: "Cannot ship to the selected address",
intent: "SHIPPING_ADDRESS"
};
}
getGoogleDefaultShippingOptions() {
return {
shippingOptions: [
{
id: "standard",
label: "Standard shipping",
description: "Arrives in 3-5 days"
},
{
id: "express",
label: "Express shipping",
description: "Arrives in 1-2 days"
}
],
defaultSelectedOptionId: "standard"
};
}
calculateNewTransactionInfo(selectedShippingOptionId) {
let totalPrice = "100.00";
if (selectedShippingOptionId === "express") {
totalPrice = "110.00";
}
return {
totalPriceStatus: "FINAL",
totalPriceLabel: "Total",
totalPrice,
currencyCode: "USD",
countryCode: "US"
};
}
renderButton(containerId) {
const button = document.createElement(
"google-pay-button"
);
button.environment = this.options.environment;
button.buttonType = this.options.buttonType;
button.buttonColor = this.options.buttonColor;
button.buttonLocale = this.options.buttonLocale || "";
button.buttonSizeMode = this.options.buttonSizeMode;
button.buttonRadius = this.options.buttonRadius;
button.existingPaymentMethodRequired = this.options.existingPaymentMethodRequired || false;
button.paymentRequest = this.options.paymentRequest;
if (this.options.paymentDataCallbacks && this.options.paymentRequest.callbackIntents) {
const { callbackIntents } = this.options.paymentRequest;
if (callbackIntents.includes("PAYMENT_AUTHORIZATION")) {
button.onPaymentAuthorized = this.options.paymentDataCallbacks.onPaymentAuthorized;
}
if (["SHIPPING_ADDRESS", "SHIPPING_OPTION"].some(
(intent) => callbackIntents.includes(intent)
)) {
button.onPaymentDataChanged = this.options.paymentDataCallbacks.onPaymentDataChanged;
}
}
if (this.options.onLoadPaymentData) {
button.onLoadPaymentData = this.options.onLoadPaymentData;
}
if (this.options.onCancel) {
button.onCancel = this.options.onCancel;
}
if (this.options.onClick) {
button.onClick = this.options.onClick;
}
if (this.options.onError) {
button.onError = this.options.onError;
}
if (this.options.onReadyToPayChange) {
button.onReadyToPayChange = this.options.onReadyToPayChange;
}
const container = document.getElementById(containerId);
if (container) {
container.innerHTML = "";
container.appendChild(button);
}
}
};
// src/index.ts
var initializeGateways = (config) => {
const gateways = {};
if (config.paypal) {
gateways.paypal = new PaypalGateway(config.paypal.options);
}
if (config.stripe) {
gateways.stripe = new StripeGateway(config.stripe.options);
}
if (config.momo) {
gateways.momo = new MomoGateway();
}
if (config.googlePay) {
gateways.googlePay = new GooglePayGateway(config.googlePay);
}
return gateways;
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
GooglePayGateway,
MomoGateway,
PaypalGateway,
StripeGateway,
initializeGateways,
loadStripeClient
});