السلام عليكم اريد اضافة بوابة دفع داخل موقعى وهى paymob ولاكن لايوجد شرح مبسط لااضفة البوابة
التقنية next js
ستجد تفصيل هنا في المستند الرسمي:
أولاً عليك إعداد إعداد متغيرات البيئة في ملف .env.local
PAYMOB_API_KEY="مفتاح الـ api هنا" PAYMOB_INTEGRATION_ID="الـ integration_id" PAYMOB_IFRAME_ID="الـ iframe_id"
وستجد المعلومات السابقة في حسابك عند التسجيل كمطور في الموقع السابق.
ثم عليك إنشاء مسار API كالتالي pages/api/paymob.js
import axios from 'axios'; async function getAuthToken() { try { const response = await axios.post('https://accept.paymob.com/api/auth/tokens', { api_key: process.env.PAYMOB_API_KEY }); return response.data.token; } catch (error) { throw new Error('Failed to authenticate'); } } async function createOrder(authToken, amount) { try { const response = await axios.post('https://accept.paymob.com/api/ecommerce/orders', { auth_token: authToken, delivery_needed: "false", amount_cents: amount * 100, currency: "EGP", }); return response.data.id; } catch (error) { throw new Error('Order creation failed'); } } async function getPaymentKey(authToken, orderId, amount, billingData) { try { const response = await axios.post('https://accept.paymob.com/api/acceptance/payment_keys', { auth_token: authToken, amount_cents: amount * 100, expiration: 3600, order_id: orderId, billing_data: billingData, currency: "EGP", integration_id: process.env.PAYMOB_INTEGRATION_ID, }); return response.data.token; } catch (error) { throw new Error('Payment key generation failed'); } } export default async function handler(req, res) { if (req.method !== 'POST') { return res.status(405).json({ message: 'Method not allowed' }); } try { const { amount, billingData } = req.body; // 1. الحصول على رمز التحقق const authToken = await getAuthToken(); // 2. إنشاء طلب const orderId = await createOrder(authToken, amount); // 3. توليد مفتاح الدفع const paymentKey = await getPaymentKey(authToken, orderId, amount, billingData); // 4. إنشاء رابط الدفع const checkoutUrl = `https://accept.paymob.com/api/acceptance/iframes/$%7Bprocess.env.PAYMOB_IFRAME_ID%7D?payment_token=$%7BpaymentKey%7D%60; res.status(200).json({ checkoutUrl }); } catch (error) { res.status(500).json({ message: error.message }); } }
ثم في الواجهة الأمامية مثلاً في components/PaymentButton.js تقوم بإرسال الطلب إليه كالتالي:
import { useState } from 'react'; export default function PaymentButton() { const [loading, setLoading] = useState(false); const initiatePayment = async () => { setLoading(true); try { const billingData = { first_name: "ahmed", last_name: "fathi", email: "ahmed@example.com", phone_number: "01010101010", country: "EGY", city: "Cairo", street: "Main St" }; const response = await fetch('/api/paymob', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ amount: 100, // المبلغ بالجنيه المصري billingData }), }); const data = await response.json(); window.location.href = data.checkoutUrl; } catch (error) { console.error(error); } finally { setLoading(false); } }; return ( <button onClick={initiatePayment} disabled={loading} > {loading ? 'جاري التحميل...' : 'ادفع الآن'} </button> ); }
ومن الأفضل لو استخدمت axios لإرسال الطلبات في مشروعك بدلاً من fetch:
npm install axios
وللعلم في المثال هناك بيانات إلزامية في كائن billingData يجب إضافتها وهي:
{ "first_name": "...", "last_name": "...", "email": "...", "phone_number": "...", "country": "EGY", "city": "...", "street": "..." }
وللتأكد من نجاح الدفع أضف callback URL في لوحة تحكم PayMob ثم أنشئ مسار API جديد لمعالجة الرد في ملف pages/api/paymob-callback.js
export default function handler(req, res) {
const { success, obj } = req.query; if (success === 'true') { console.log('Transaction details:', obj); res.redirect('/payment-success'); } else { res.redirect('/payment-failed'); } }
التعليقات