Machine Learning integration for Flutter using TensorFlow Lite and Firebase ML
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Payment processing integration with Stripe and PayPal for Flutter
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
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아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Machine Learning integration for Flutter using TensorFlow Lite and Firebase ML
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Google Maps and Mapbox integration for Flutter applications
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Implement tasks from an OpenSpec change. Use when the user wants to start implementing, continue implementation, or work through tasks.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Archive a completed change in the experimental workflow. Use when the user wants to finalize and archive a change after implementation is complete.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Enter explore mode - a thinking partner for exploring ideas, investigating problems, and clarifying requirements. Use when the user wants to think through something before or during a change.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Propose a new change with all artifacts generated in one step. Use when the user wants to quickly describe what they want to build and get a complete proposal with design, specs, and tasks ready for implementation.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.