UNPKG

medusa-payment-ipay

Version:

iPay Africa payment provider for Medusa v2 - Supports M-Pesa, Airtel Money, Credit Cards, and PesaLink

288 lines (225 loc) 7.14 kB
# iPay Payment Plugin Integration Guide ## Quick Start ### 1. Install the Plugin ```bash cd path/to/your/medusa/project yarn add ./path/to/medusa-payment-ipay ``` ### 2. Configure Environment Variables Add to your `.env` file: ```bash # iPay Configuration IPAY_VID=demo # Replace with your iPay VID IPAY_HASH_KEY=demoCHANGED # Replace with your iPay hash key IPAY_LIVE=false # Set to true for production BACKEND_URL=http://localhost:9000 # Your backend URL for webhooks ``` ### 3. Update medusa-config.ts ```typescript import { defineConfig } from "@medusajs/medusa" export default defineConfig({ // ... other config modules: [ { resolve: "@medusajs/medusa/payment", options: { providers: [ { resolve: "./medusa-payment-ipay/providers/ipay", id: "ipay", options: { vid: process.env.IPAY_VID, hashKey: process.env.IPAY_HASH_KEY, live: process.env.IPAY_LIVE === "true", enabledChannels: { mpesa: true, // Enable M-Pesa airtel: true, // Enable Airtel Money creditcard: false, // Enable credit cards (requires PCI compliance) pesalink: false // Enable PesaLink bank transfers } } } ] } } ] }) ``` ### 4. Enable in Admin 1. Start your Medusa backend: `yarn dev` 2. Go to Medusa Admin → Settings → Regions 3. Select your region (e.g., Kenya) 4. Add "iPay" as a payment provider 5. Save changes ### 5. Test Integration Use the test credentials: - **VID**: `demo` - **Hash Key**: `demoCHANGED` - **Live Mode**: `false` ## Payment Flow 1. **Customer Checkout**: Customer selects iPay as payment method 2. **Payment Initiation**: Plugin generates payment form data 3. **Redirect to iPay**: Customer is redirected to iPay gateway 4. **Payment Processing**: Customer completes payment (M-Pesa, Airtel, etc.) 5. **Webhook Callback**: iPay sends payment status to your webhook 6. **Order Completion**: Based on status, order is completed or failed ## Webhook Configuration The plugin automatically creates a webhook endpoint at: ``` POST /webhooks/ipay ``` iPay will send payment notifications to this endpoint. ## Payment Status Codes | iPay Status | Description | Action | |-------------|-------------|---------| | `aei7p7yrx4ae34` | Payment successful | Order completed | | `bdi6p2yy76etrs` | Payment pending | Keep order pending | | `fe2707etr5s4wq` | Payment failed | Mark order as failed | | `dtfi4p7yty45wq` | Insufficient amount | Mark order as failed | | `cr5i3pgy9867e1` | Used transaction code | Mark order as failed | ## Storefront Integration ### Basic Setup ```javascript // In your storefront checkout component const completeOrder = async () => { try { // Set payment provider await medusaClient.carts.setPaymentSession(cartId, { provider_id: "ipay" }) // Complete cart (this will redirect to iPay) const response = await medusaClient.carts.complete(cartId) if (response.type === "cart") { // Get payment data const paymentData = response.cart.payment_session.data // Redirect to iPay gateway redirectToIPay(paymentData.paymentData, paymentData.gatewayUrl) } } catch (error) { console.error("Payment initiation failed:", error) } } const redirectToIPay = (paymentData, gatewayUrl) => { // Create a form and submit to iPay const form = document.createElement('form') form.method = 'POST' form.action = gatewayUrl // Add payment fields Object.keys(paymentData).forEach(key => { const input = document.createElement('input') input.type = 'hidden' input.name = key input.value = paymentData[key] form.appendChild(input) }) document.body.appendChild(form) form.submit() } ``` ### React/Next.js Example ```jsx import { useState } from 'react' import { useMedusaClient } from 'medusa-react' const CheckoutPayment = ({ cart }) => { const [loading, setLoading] = useState(false) const client = useMedusaClient() const handleIPay = async () => { setLoading(true) try { await client.carts.setPaymentSession(cart.id, { provider_id: "ipay" }) const response = await client.carts.complete(cart.id) if (response.type === "cart") { const { paymentData, gatewayUrl } = response.cart.payment_session.data // Create form and submit const form = document.createElement('form') form.method = 'POST' form.action = gatewayUrl form.target = '_self' Object.entries(paymentData).forEach(([key, value]) => { const input = document.createElement('input') input.type = 'hidden' input.name = key input.value = value form.appendChild(input) }) document.body.appendChild(form) form.submit() } } catch (error) { console.error('Payment failed:', error) alert('Payment initiation failed. Please try again.') } finally { setLoading(false) } } return ( <button onClick={handleIPay} disabled={loading} className="bg-green-600 text-white px-6 py-3 rounded-lg" > {loading ? 'Initializing...' : 'Pay with M-Pesa/Airtel'} </button> ) } ``` ## Production Setup ### 1. Get Production Credentials 1. Register with iPay Africa: https://ipayafrica.com 2. Complete verification process 3. Obtain production VID and hash key ### 2. Update Environment ```bash IPAY_VID=your_production_vid IPAY_HASH_KEY=your_production_hash_key IPAY_LIVE=true BACKEND_URL=https://your-domain.com ``` ### 3. SSL Configuration Ensure your webhook endpoint uses HTTPS: - Configure SSL certificate - Test webhook delivery - Monitor webhook logs ### 4. Security Considerations - Never expose hash key in frontend code - Validate all webhook requests - Log all payment transactions - Implement proper error handling ## Troubleshooting ### Common Issues 1. **Hash mismatch error** - Verify VID and hash key - Check parameter order in hash generation - Ensure no extra spaces in environment variables 2. **Webhook not received** - Check if webhook URL is publicly accessible - Verify SSL certificate - Check firewall settings 3. **Payment not completing** - Check iPay dashboard for transaction status - Verify webhook endpoint implementation - Check backend logs for errors ### Debug Mode Enable debug logging in your medusa-config.ts: ```typescript export default defineConfig({ // ... other config logger: { level: "debug" } }) ``` ### Testing Test with different scenarios: - Successful payment - Failed payment - Cancelled payment - Network timeouts ## Support - **iPay Documentation**: https://dev.ipayafrica.com/ - **Medusa Documentation**: https://docs.medusajs.com/ - **Plugin Issues**: Create an issue in the plugin repository ## License MIT License - see LICENSE file for details.