const axios = require('axios'); const https = require('https'); class WooCommerceService { constructor() { this.baseURL = process.env.WOOCOMMERCE_URL; this.consumerKey = process.env.WOOCOMMERCE_CONSUMER_KEY; this.consumerSecret = process.env.WOOCOMMERCE_CONSUMER_SECRET; if (!this.baseURL || !this.consumerKey || !this.consumerSecret) { console.warn('WooCommerce credentials not fully configured'); } // Create HTTPS agent that ignores SSL errors in development const httpsAgent = new https.Agent({ rejectUnauthorized: process.env.NODE_ENV === 'production' }); this.client = axios.create({ baseURL: `${this.baseURL}/wp-json/wc/v3`, auth: { username: this.consumerKey, password: this.consumerSecret }, timeout: 10000, httpsAgent: httpsAgent, // Additional options for SSL issues headers: { 'User-Agent': 'PaymentWebsite/1.0' } }); } // Get order details from WooCommerce async getOrder(orderId) { try { const response = await this.client.get(`/orders/${orderId}`); console.log('WooCommerce Order Retrieved:', { id: response.data.id, status: response.data.status, total: response.data.total }); return { success: true, order: response.data }; } catch (error) { console.error('WooCommerce Get Order Error:', { orderId, error: error.response?.data || error.message }); return { success: false, error: error.response?.data?.message || error.message }; } } // Update order status in WooCommerce async updateOrderStatus(orderId, status, transactionId = null) { try { const updateData = { status: status }; // Add transaction ID if payment was successful if (transactionId) { updateData.transaction_id = transactionId; updateData.meta_data = [ { key: '_paypal_transaction_id', value: transactionId } ]; } const response = await this.client.put(`/orders/${orderId}`, updateData); console.log('WooCommerce Order Updated:', { id: response.data.id, status: response.data.status, transaction_id: transactionId }); return { success: true, order: response.data }; } catch (error) { console.error('WooCommerce Update Order Error:', { orderId, status, error: error.response?.data || error.message }); return { success: false, error: error.response?.data?.message || error.message }; } } // Add order note async addOrderNote(orderId, note, customerNote = false) { try { const response = await this.client.post(`/orders/${orderId}/notes`, { note: note, customer_note: customerNote }); console.log('Order note added:', { orderId, noteId: response.data.id }); return { success: true, note: response.data }; } catch (error) { console.error('Add Order Note Error:', { orderId, error: error.response?.data || error.message }); return { success: false, error: error.response?.data?.message || error.message }; } } // Process payment completion async completePayment(orderId, paypalData) { try { // Update order to processing/completed const updateResult = await this.updateOrderStatus( orderId, 'processing', // or 'completed' based on your workflow paypalData.transaction_id ); if (!updateResult.success) { throw new Error(updateResult.error); } // Add payment note const noteText = `Payment completed via PayPal. Transaction ID: ${paypalData.transaction_id}. Payer Email: ${paypalData.payer?.email_address || 'N/A'}`; await this.addOrderNote(orderId, noteText, false); return { success: true, message: 'Payment completed and order updated' }; } catch (error) { console.error('Complete Payment Error:', { orderId, error: error.message }); return { success: false, error: error.message }; } } // Handle payment failure async failPayment(orderId, reason) { try { // Update order to failed const updateResult = await this.updateOrderStatus(orderId, 'failed'); if (!updateResult.success) { throw new Error(updateResult.error); } // Add failure note const noteText = `Payment failed: ${reason}`; await this.addOrderNote(orderId, noteText, false); return { success: true, message: 'Order marked as failed' }; } catch (error) { console.error('Fail Payment Error:', { orderId, error: error.message }); return { success: false, error: error.message }; } } } module.exports = new WooCommerceService();