Initialer Commit: Projekt Start
This commit is contained in:
149
lib/services/woocommerce_checkout_service.dart
Normal file
149
lib/services/woocommerce_checkout_service.dart
Normal file
@@ -0,0 +1,149 @@
|
||||
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<Map<String, dynamic>> createOrder({
|
||||
required CartProvider cart,
|
||||
required Map<String, dynamic> billing,
|
||||
Map<String, dynamic>? 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<List<Map<String, dynamic>>> 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<dynamic> 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<Map<String, dynamic>>();
|
||||
} 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<List<Map<String, dynamic>>> 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<dynamic> data = json.decode(response.body);
|
||||
return data.cast<Map<String, dynamic>>();
|
||||
} else {
|
||||
throw Exception('Fehler beim Laden der Versandoptionen: ${response.statusCode}');
|
||||
}
|
||||
} catch (e) {
|
||||
throw Exception('Fehler beim Abrufen der Versandoptionen: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user