원클릭으로
payment-integration
Payment processing integration with Stripe and PayPal for Flutter
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Payment processing integration with Stripe and PayPal for Flutter
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Machine Learning integration for Flutter using TensorFlow Lite and Firebase ML
Google Maps and Mapbox integration for Flutter applications
Instructions for translating Google Stitch designs (HTML/Tailwind) into production-ready Flutter/Dart code.
Video and audio processing capabilities for Flutter applications
WebSocket and Socket.io integration for real-time communication in Flutter
| name | payment-integration |
| description | Payment processing integration with Stripe and PayPal for Flutter |
| keywords | payments, stripe, paypal, billing, subscriptions, ecommerce |
This skill provides comprehensive payment processing capabilities for Flutter applications using Stripe and PayPal. Supports one-time payments, subscriptions, and PCI-compliant payment flows.
dependencies:
flutter_stripe: ^10.0.0
paypal_sdk: ^1.0.0
pay: ^1.1.2 # For Apple Pay / Google Pay
import 'package:flutter_stripe/flutter_stripe.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Initialize Stripe
Stripe.publishableKey = 'pk_test_your_key_here';
await Stripe.instance.applySettings();
runApp(MyApp());
}
import 'package:flutter_stripe/flutter_stripe.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class PaymentService {
final String backendUrl;
PaymentService({required this.backendUrl});
/// Create a payment intent on your backend
Future<Map<String, dynamic>> createPaymentIntent(
double amount,
String currency,
) async {
final response = await http.post(
Uri.parse('$backendUrl/create-payment-intent'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'amount': (amount * 100).toInt(), // Stripe uses cents
'currency': currency,
}),
);
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else {
throw Exception('Failed to create payment intent');
}
}
/// Present payment sheet
Future<bool> presentPaymentSheet(String clientSecret) async {
try {
// Initialize payment sheet
await Stripe.instance.initPaymentSheet(
paymentSheetParameters: SetupPaymentSheetParameters(
paymentIntentClientSecret: clientSecret,
merchantDisplayName: '{{PROJECT_NAME}}',
style: ThemeMode.system,
),
);
// Display payment sheet
await Stripe.instance.presentPaymentSheet();
return true;
} on StripeException catch (e) {
if (e.error.code == FailureCode.Canceled) {
return false; // User canceled
}
rethrow;
}
}
/// Create and confirm payment
Future<bool> makePayment(double amount, String currency) async {
try {
// 1. Create payment intent
final paymentIntent = await createPaymentIntent(amount, currency);
// 2. Present payment sheet
final success = await presentPaymentSheet(paymentIntent['clientSecret']);
return success;
} catch (e) {
print('Payment error: $e');
return false;
}
}
}
import 'package:flutter_riverpod/flutter_riverpod.dart';
class PaymentState {
final bool isProcessing;
final bool paymentSuccess;
final String? error;
PaymentState({
this.isProcessing = false,
this.paymentSuccess = false,
this.error,
});
PaymentState copyWith({
bool? isProcessing,
bool? paymentSuccess,
String? error,
}) {
return PaymentState(
isProcessing: isProcessing ?? this.isProcessing,
paymentSuccess: paymentSuccess ?? this.paymentSuccess,
error: error,
);
}
}
class PaymentNotifier extends StateNotifier<PaymentState> {
final PaymentService _paymentService;
PaymentNotifier(this._paymentService) : super(PaymentState());
Future<void> processPayment(double amount, String currency) async {
state = state.copyWith(isProcessing: true, error: null);
try {
final success = await _paymentService.makePayment(amount, currency);
state = state.copyWith(
isProcessing: false,
paymentSuccess: success,
error: success ? null : 'Payment was cancelled or failed',
);
} catch (e) {
state = state.copyWith(
isProcessing: false,
paymentSuccess: false,
error: e.toString(),
);
}
}
}
final paymentProvider = StateNotifierProvider<PaymentNotifier, PaymentState>(
(ref) => PaymentNotifier(PaymentService(backendUrl: 'https://your-api.com')),
);
class PaymentPage extends ConsumerWidget {
const PaymentPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final paymentState = ref.watch(paymentProvider);
return Scaffold(
appBar: AppBar(title: const Text('Payment')),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Text(
'Total: \$20.00',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 32),
if (paymentState.isProcessing)
const CircularProgressIndicator()
else
ElevatedButton(
onPressed: () {
ref.read(paymentProvider.notifier)
.processPayment(20.00, 'USD');
},
child: const Text('Pay Now'),
),
if (paymentState.error != null)
Text(
paymentState.error!,
style: const TextStyle(color: Colors.red),
),
if (paymentState.paymentSuccess)
const Text(
'Payment successful!',
style: TextStyle(color: Colors.green),
),
],
),
),
);
}
}
class SubscriptionService {
final String backendUrl;
SubscriptionService({required this.backendUrl});
Future<Map<String, dynamic>> createSubscription(
String customerId,
String priceId,
) async {
final response = await http.post(
Uri.parse('$backendUrl/create-subscription'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'customerId': customerId,
'priceId': priceId,
}),
);
return jsonDecode(response.body);
}
Future<void> cancelSubscription(String subscriptionId) async {
await http.post(
Uri.parse('$backendUrl/cancel-subscription'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({'subscriptionId': subscriptionId}),
);
}
}
import 'package:pay/pay.dart';
class DigitalWalletPayment extends StatelessWidget {
final double amount;
final String currency;
const DigitalWalletPayment({
super.key,
required this.amount,
required this.currency,
});
@override
Widget build(BuildContext context) {
return GooglePayButton(
paymentConfigurationAsset: 'google_pay_config.json',
paymentItems: [
PaymentItem(
label: 'Total',
amount: amount.toStringAsFixed(2),
status: PaymentItemStatus.final_price,
),
],
type: GooglePayButtonType.pay,
onPaymentResult: (result) {
// Handle payment result
print('Payment result: $result');
},
);
}
}
Your backend must implement:
// Node.js/Express example
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
app.post('/create-payment-intent', async (req, res) => {
const { amount, currency } = req.body;
const paymentIntent = await stripe.paymentIntents.create({
amount,
currency,
automatic_payment_methods: { enabled: true },
});
res.json({ clientSecret: paymentIntent.client_secret });
});
app.post('/webhook', async (req, res) => {
const sig = req.headers['stripe-signature'];
const event = stripe.webhooks.constructEvent(
req.body,
sig,
process.env.STRIPE_WEBHOOK_SECRET
);
// Handle the event
switch (event.type) {
case 'payment_intent.succeeded':
// Fulfill the purchase
break;
case 'payment_intent.payment_failed':
// Notify user
break;
}
res.json({ received: true });
});
Use Stripe test cards:
4242 4242 4242 4242 - Success4000 0000 0000 9995 - Declined4000 0000 0000 3220 - Requires 3D Secure