Angular 17+ plugin for integrating Stripe payments (one-time & subscriptions) with theme customization, event emitters, and standalone components.
- 💳 One-time payments via Stripe PaymentElement
- 🔄 Subscriptions / recurring billing via SetupIntent
- 🎨 Theming & Appearance API (Stripe + SCSS variables)
- 🌍 Localization support (
locale
input) - ✅ Event emitters for success/error handling
- 🔧 Built with standalone Angular components (Angular 17+)
npm install ngxsmk-stripe @stripe/stripe-js
import { Component } from '@angular/core';
import { StripePaymentComponent, StripeSubscriptionComponent } from 'ngxsmk-stripe';
@Component({
selector: 'app-root',
standalone: true,
imports: [StripePaymentComponent, StripeSubscriptionComponent],
template: `
<h1>ngxsmk-stripe Demo</h1>
<!-- One-time Payment -->
<ngxsmk-stripe-payment
[publicKey]="publicKey"
[clientSecret]="paymentClientSecret"
[returnUrl]="returnUrl"
[appearance]="appearance"
(paymentSuccess)="onPaymentSuccess($event)"
(paymentError)="onPaymentError($event)">
</ngxsmk-stripe-payment>
<!-- Subscription -->
<ngxsmk-stripe-subscription
[publicKey]="publicKey"
[clientSecret]="subscriptionClientSecret"
[returnUrl]="returnUrl"
[appearance]="appearance"
(subscriptionSuccess)="onSubSuccess($event)"
(subscriptionError)="onSubError($event)">
</ngxsmk-stripe-subscription>
`
})
export class AppComponent {
publicKey = 'pk_test_xxxxxxxxxxxxx'; // Your Stripe publishable key
paymentClientSecret = 'pi_xxxxx_secret_xxxxx'; // From backend (PaymentIntent)
subscriptionClientSecret = 'seti_xxxxx_secret_xxxxx'; // From backend (SetupIntent)
returnUrl = 'http://localhost:4200/success';
appearance = {
theme: 'stripe',
variables: { colorPrimary: '#ff5733' }
};
onPaymentSuccess(ev: any) { console.log('✅ Payment success', ev); }
onPaymentError(err: any) { console.error('❌ Payment error', err); }
onSubSuccess(ev: any) { console.log('✅ Subscription success', ev); }
onSubError(err: any) { console.error('❌ Subscription error', err); }
}
appearance = {
theme: 'night',
variables: {
colorPrimary: '#ff5733',
fontSizeBase: '16px'
}
};
Override global variables in your styles.scss
:
$primary-color: #ff5733;
$btn-text: #fff;
Create secrets on your backend.
One-time payments (PaymentIntent):
const paymentIntent = await stripe.paymentIntents.create({
amount: 1999,
currency: "usd",
automatic_payment_methods: { enabled: true },
});
res.send({ clientSecret: paymentIntent.client_secret });
Subscriptions (SetupIntent):
const setupIntent = await stripe.setupIntents.create({
customer: "cus_xxxxx", // existing customer id
payment_method_types: ["card"],
});
res.send({ clientSecret: setupIntent.client_secret });
Input | Type | Default | Description |
---|---|---|---|
publicKey |
string | — | Stripe publishable key |
clientSecret |
string | — | Client secret from backend (PaymentIntent or SetupIntent) |
returnUrl |
string | — | Where to redirect after payment/subscription |
appearance |
object | null |
Stripe Appearance API object |
locale |
string | en |
Language/locale for Stripe Elements |
(paymentSuccess)
→ emits payment result(paymentError)
→ emits error
(subscriptionSuccess)
→ emits subscription result(subscriptionError)
→ emits error
# Build the library
ng build ngxsmk-stripe
# Run demo app
ng serve demo-app
cd dist/ngxsmk-stripe
npm publish --access public
MIT
Last updated: 2025-08-19