import 'dart:convert'; import 'package:http/http.dart' as http; import '../providers/cart_provider.dart'; import 'woocommerce_service.dart'; /// Service für WooCommerce Checkout-Funktionalität /// /// Dieser Service bietet Methoden für den Checkout-Prozess. /// Für die einfachste Lösung wird die WebView-basierte Checkout-Seite verwendet, /// die alle WooCommerce-Einstellungen automatisch nutzt. class WooCommerceCheckoutService { static const String baseUrl = WooCommerceService.baseUrl; static const String consumerKey = WooCommerceService.consumerKey; static const String consumerSecret = WooCommerceService.consumerSecret; /// Erstellt eine Checkout-URL mit Warenkorb-Produkten /// /// Diese Methode erstellt eine URL, die direkt zur WooCommerce Checkout-Seite /// führt und die Produkte aus dem Warenkorb automatisch hinzufügt. static String buildCheckoutUrl(CartProvider cart) { if (cart.items.isEmpty) { return '$baseUrl/checkout/'; } // Erstelle eine URL, die alle Produkte zum Warenkorb hinzufügt // Format: /checkout/?add-to-cart=ID1,ID2,ID3 final productIds = cart.items .map((item) => '${item.product.id}:${item.quantity}') .join(','); // Alternative: Verwende die WooCommerce Cart-Seite und leite dann weiter // Oder direkt zur Checkout-Seite mit Produkten return '$baseUrl/checkout/?add-to-cart=${cart.items.map((item) => item.product.id).join(',')}'; } /// Erstellt eine Order über die WooCommerce REST API /// /// Diese Methode kann verwendet werden, wenn du einen nativen Checkout /// implementieren möchtest. Sie erfordert Write-Berechtigungen für die API Keys. /// /// Hinweis: Für die einfachste Lösung wird die WebView-basierte Checkout-Seite /// empfohlen, da sie alle WooCommerce-Einstellungen (Zahlungen, Versand, etc.) /// automatisch nutzt. static Future> createOrder({ required CartProvider cart, required Map billing, Map? shipping, String? paymentMethod, }) async { try { final lineItems = cart.items.map((item) { return { 'product_id': item.product.id, 'quantity': item.quantity, }; }).toList(); final orderData = { 'payment_method': paymentMethod ?? 'bacs', 'payment_method_title': paymentMethod ?? 'Direktüberweisung', 'set_paid': false, 'billing': billing, 'shipping': shipping ?? billing, 'line_items': lineItems, 'shipping_lines': [], }; final uri = Uri.parse('$baseUrl/wp-json/wc/v3/orders'); // Basic Auth für API final credentials = base64Encode(utf8.encode('$consumerKey:$consumerSecret')); final headers = { 'Authorization': 'Basic $credentials', 'Content-Type': 'application/json', }; final response = await http.post( uri, headers: headers, body: json.encode(orderData), ); if (response.statusCode == 201) { return json.decode(response.body); } else { throw Exception('Fehler beim Erstellen der Bestellung: ${response.statusCode} - ${response.body}'); } } catch (e) { throw Exception('Fehler beim Checkout: $e'); } } /// Ruft verfügbare Zahlungsmethoden ab static Future>> getPaymentMethods() async { try { final uri = Uri.parse('$baseUrl/wp-json/wc/v3/payment_gateways'); final credentials = base64Encode(utf8.encode('$consumerKey:$consumerSecret')); final headers = { 'Authorization': 'Basic $credentials', }; final response = await http.get(uri, headers: headers); if (response.statusCode == 200) { final List data = json.decode(response.body); return data .where((gateway) => gateway['enabled'] == true) .map((gateway) => { return { 'id': gateway['id'], 'title': gateway['title'], 'description': gateway['description'], }; }) .toList() .cast>(); } else { throw Exception('Fehler beim Laden der Zahlungsmethoden: ${response.statusCode}'); } } catch (e) { throw Exception('Fehler beim Abrufen der Zahlungsmethoden: $e'); } } /// Ruft Versandoptionen ab static Future>> getShippingMethods() async { try { final uri = Uri.parse('$baseUrl/wp-json/wc/v3/shipping/zones'); final credentials = base64Encode(utf8.encode('$consumerKey:$consumerSecret')); final headers = { 'Authorization': 'Basic $credentials', }; final response = await http.get(uri, headers: headers); if (response.statusCode == 200) { final List data = json.decode(response.body); return data.cast>(); } else { throw Exception('Fehler beim Laden der Versandoptionen: ${response.statusCode}'); } } catch (e) { throw Exception('Fehler beim Abrufen der Versandoptionen: $e'); } } }