تلخيص
تعالج واجهات برمجة تطبيقات Braintree المدفوعات من بطاقات الائتمان، PayPal، Venmo، والمحافظ الرقمية. يمكنك التكامل عبر حزم SDKs من جانب الخادم (Node, Python, Ruby، إلخ)، إنشاء رموز عميل لأمان الواجهة الأمامية، والتعامل مع المعاملات، والمبالغ المستردة، والاشتراكات. للاختبار، استخدم Apidog للتحقق من حمولات webhook واختبار التكامل الخاص بك مقابل بيانات البيئة التجريبية قبل الإطلاق الفعلي.
مقدمة
تعالج Braintree مليارات الدولارات من المدفوعات سنويًا، وتعد معالج الدفع الذي يقف وراء شركات مثل Uber وAirbnb وGitHub. تدعم المنصة بطاقات الائتمان، PayPal، Venmo، Apple Pay، Google Pay، وتحويلات ACH.
واجهات برمجة تطبيقات الدفع تختلف عن غيرها: الخطأ في كتالوج المنتجات قد يكون مزعجًا، لكن الخطأ في المدفوعات يكلف أموالاً ويهز ثقة العملاء. يجب عليك إنجازها بشكل صحيح.
تقدم Braintree طريقتين للتكامل:
- واجهة المستخدم الجاهزة (Drop-in UI): نموذج دفع مُعد مسبقًا
- واجهة المستخدم المخصصة (Custom UI): تحكم كامل
كلا الطريقتين تستخدمان نفس واجهات برمجة تطبيقات جانب الخادم لمعالجة الدفع. هذا الدليل يركّز على العمل الذي يتم على جانب الخادم بعد أن ينقر العميل على "ادفع".
💡 إذا كنت تقوم بإنشاء عمليات تكامل للدفع، Apidog يسهل عليك اختبار معالجات الويب هوك (webhook handlers) والتحقق من استجابات الدفع. تستطيع محاكاة الويب هوك الخاصة بـ Braintree محليًا لضمان أن رمزك يتعامل مع حالات النجاح والفشل والحالات الهامشية قبل معالجة المعاملات الحقيقية.
اختبر ويب هوك Braintree باستخدام Apidog - مجانًا
إعداد Braintree
إنشاء حساب Braintree
- اذهب إلى braintreepayments.com وأنشئ حسابًا تجريبيًا (sandbox account).
- بعد التسجيل ستحصل على:
- معرف التاجر (Merchant ID):
abc123xyz - المفتاح العام (Public Key):
def456... - المفتاح الخاص (Private Key):
ghi789...
- معرف التاجر (Merchant ID):
- خزّن هذه البيانات بأمان، ولا تشارك المفتاح الخاص أو تضفه إلى Git.
تثبيت حزمة SDK
اختر لغة الخادم لديك وثبّت SDK:
Node.js:
npm install braintree
Python:
pip install braintree
Ruby:
gem install braintree
تهيئة البوابة:
const braintree = require('braintree')
const gateway = new braintree.BraintreeGateway({
environment: braintree.Environment.Sandbox,
merchantId: process.env.BRAINTREE_MERCHANT_ID,
publicKey: process.env.BRAINTREE_PUBLIC_KEY,
privateKey: process.env.BRAINTREE_PRIVATE_KEY
})
إنشاء رمز مميز للعميل (Client Token)
قبل عرض نموذج الدفع، أنشئ رمز مميز للعميل يسمح للواجهة الأمامية بالتواصل مع Braintree:
app.get('/checkout/token', async (req, res) => {
const clientToken = await gateway.clientToken.generate()
res.json({ clientToken: clientToken.clientToken })
})
يستخدم هذا الرمز لتهيئة Drop-in UI أو أي تكامل مخصص في الواجهة الأمامية.
معالجة المدفوعات
سير عملية الدفع
- الواجهة الأمامية ترسل رمز الدفع (payment method nonce) إلى الخادم.
- الخادم ينشئ معاملة باستخدام الرمز (nonce).
- Braintree تعالج الدفع.
- الخادم يستقبل استجابة النجاح أو الفشل.
- تنفذ الطلب أو تعرض خطأ.
خصم من بطاقة ائتمان
app.post('/checkout', async (req, res) => {
const { paymentMethodNonce, amount, orderId } = req.body
const result = await gateway.transaction.sale({
amount: amount,
paymentMethodNonce: paymentMethodNonce,
orderId: orderId,
options: {
submitForSettlement: true
}
})
if (result.success) {
res.json({
success: true,
transactionId: result.transaction.id
})
} else {
res.status(400).json({
success: false,
message: result.message
})
}
})
الخصم باستخدام طريقة دفع محفوظة
بعد المعاملة الأولى، يمكنك حفظ طريقة الدفع لاستخدامها لاحقًا:
// إنشاء عميل مع طريقة دفع
const result = await gateway.customer.create({
firstName: 'John',
lastName: 'Doe',
email: 'john@example.com',
paymentMethodNonce: nonce
})
// الحصول على رمز طريقة الدفع المحفوظة
const paymentMethodToken = result.customer.paymentMethods[0].token
// خصم من طريقة الدفع المحفوظة
await gateway.transaction.sale({
amount: '49.99',
paymentMethodToken: paymentMethodToken,
options: {
submitForSettlement: true
}
})
معاملات PayPal
const result = await gateway.transaction.sale({
amount: '99.00',
paymentMethodNonce: paypalNonce,
orderId: 'ORDER-123',
options: {
submitForSettlement: true
}
})
استرداد الأموال والإلغاءات
استرداد كامل للمبلغ
const result = await gateway.transaction.refund('transaction_id')
if (result.success) {
console.log('تم الاسترداد:', result.transaction.id)
}
استرداد جزئي للمبلغ
const result = await gateway.transaction.refund('transaction_id', '50.00')
if (result.success) {
console.log('تم معالجة استرداد جزئي')
}
إلغاء معاملة (Void)
الإلغاء يوقف المعاملة قبل تسويتها:
const result = await gateway.transaction.void('transaction_id')
if (result.success) {
console.log('تم إلغاء المعاملة')
}
سير حالة المعاملة
مُصرح بها ← مُقدمة للتسوية ← مُسواة
↓
مُلغاة
مُسواة ← مُستردة
الاشتراكات والفوترة المتكررة
تدير Braintree الاشتراكات للمدفوعات المتكررة.
إنشاء خطة
أنشئ خطة في لوحة التحكم أو عبر API:
const result = await gateway.plan.create({
id: 'monthly-premium',
name: 'Monthly Premium',
billingFrequency: 1,
currencyIsoCode: 'USD',
price: '29.99'
})
إنشاء اشتراك
const result = await gateway.subscription.create({
paymentMethodToken: paymentMethodToken,
planId: 'monthly-premium',
firstBillingDate: new Date()
})
if (result.success) {
console.log('تم إنشاء الاشتراك:', result.subscription.id)
}
إلغاء اشتراك
const result = await gateway.subscription.cancel('subscription_id')
if (result.success) {
console.log('تم إلغاء الاشتراك')
}
تحديث الاشتراك
const result = await gateway.subscription.update('subscription_id', {
planId: 'annual-premium',
price: '299.99'
})
الويب هوك لأحداث الدفع
الويب هوك (webhooks) تُخطر خادمك بأحداث المعاملات، وهي أساسية للاشتراكات والنزاعات.
إنشاء نقطة نهاية للويب هوك
app.post('/webhooks/braintree', (req, res) => {
const signature = req.body.bt_signature
const payload = req.body.bt_payload
// التحقق من الويب هوك وتحليله
gateway.webhookNotification.parse(
signature,
payload,
(err, webhookNotification) => {
if (err) {
return res.status(400).send('ويب هوك غير صالح')
}
switch (webhookNotification.kind) {
case 'subscription_charged_successfully':
handleSuccessfulCharge(webhookNotification.subscription)
break
case 'subscription_charged_unsuccessfully':
handleFailedCharge(webhookNotification.subscription)
break
case 'dispute_opened':
handleDispute(webhookNotification.dispute)
break
case 'transaction_settled':
handleSettledTransaction(webhookNotification.transaction)
break
}
res.status(200).send('OK')
}
)
})
تسجيل الويب هوك في Braintree
في لوحة تحكم Braintree، اذهب إلى Settings → Webhooks وأضف عنوان URL لنقطة النهاية الخاصة بك. أثناء التطوير، استخدم خدمة مثل ngrok لاستقبال الويب هوك محليًا.
الاختبار باستخدام Apidog
واجهات برمجة تطبيقات الدفع تحتاج لاختبار شامل بعيدًا عن بيانات الإنتاج. مع Apidog، يمكنك اختبار التكاملات بأمان.
1. محاكاة حمولات الويب هوك
قم بإنشاء بيانات وهمية وأرسلها لنقطة نهاية الويب هوك:
{
"bt_signature": "test_signature",
"bt_payload": "eyJraW5kIjoidHJhbnNhY3Rpb25fc2V0dGxlZCIsInRyYW5zYWN0aW9uIjp7ImlkIjoiYWJjMTIzIiwiYW1vdW50IjoiNDkuOTkiLCJzdGF0dXMiOiJzZXR0bGVkIn19"
}
2. فصل البيئات
استخدم متغيرات بيئة منفصلة:
# البيئة التجريبية (Sandbox)
BRAINTREE_MERCHANT_ID: sandbox_merchant
BRAINTREE_PUBLIC_KEY: sandbox_public
BRAINTREE_PRIVATE_KEY: sandbox_private
BRAINTREE_ENVIRONMENT: sandbox
# الإنتاج (Production)
BRAINTREE_MERCHANT_ID: live_merchant
BRAINTREE_PUBLIC_KEY: live_public
BRAINTREE_PRIVATE_KEY: live_private
BRAINTREE_ENVIRONMENT: production
3. التحقق من استجابات الويب هوك
pm.test('Webhook processed successfully', () => {
pm.response.to.have.status(200)
pm.response.to.have.body('OK')
})
pm.test('Transaction ID logged', () => {
// تحقق من سجلاتك أو قاعدة بياناتك
const transactionId = pm.environment.get('last_transaction_id')
pm.expect(transactionId).to.not.be.empty
})
اختبر ويب هوك Braintree باستخدام Apidog - مجانًا
الأخطاء الشائعة والإصلاحات
رفض المعالج
السبب: البنك رفض المعاملة.
الإصلاح: عرض رسالة عامة للعميل واقتراح بطاقة مختلفة. سجل processorResponseCode للتصحيح.
if (!result.success) {
if (result.transaction.processorResponseCode === '2000') {
// رفض البنك
return res.status(400).json({
error: 'رفض البنك هذه المعاملة. يرجى محاولة استخدام بطاقة مختلفة.'
})
}
}
رفض البوابة
السبب: مرشحات الاحتيال في Braintree حظرت المعاملة.
الإصلاح: تحقق من gatewayRejectionReason:
if (result.transaction.gatewayRejectionReason === 'cvv') {
// عدم تطابق CVV
}
if (result.transaction.gatewayRejectionReason === 'avs') {
// فشل التحقق من العنوان
}
if (result.transaction.gatewayRejectionReason === 'fraud') {
// أدوات الاحتيال المتقدمة حظرتها
}
فشل التسوية
السبب: لم تتمكن المعاملة من التسوية بعد التفويض.
الإصلاح: راقب ويب هوك transaction_settlement_declined. الأسباب الشائعة:
- انتهاء صلاحية طريقة الدفع بين التفويض والتسوية
- الجهة المصدرة للبطاقة حظرت المعاملة
- عدم كفاية الأموال
المعاملات المكررة
السبب: نقر العميل مرتين أو أعيدت المحاولة برمجيًا.
الإصلاح: استخدم orderId لمنع التكرار:
const result = await gateway.transaction.sale({
amount: '49.99',
paymentMethodNonce: nonce,
orderId: 'UNIQUE-ORDER-123', // يمنع التكرارات
options: {
submitForSettlement: true
}
})
بدائل ومقارنات
| الميزة | Braintree | Stripe | PayPal |
|---|---|---|---|
| التسعير | 2.9% + 30¢ | 2.9% + 30¢ | 2.9% + 30¢ |
| دعم PayPal | أصلي | إضافة | أصلي |
| الاشتراكات | نعم | نعم | محدود |
| دولي | 46 دولة | 46 دولة | أكثر من 200 دولة |
| أدوات الاحتيال | مدمج | مدمج | أساسي |
| جودة SDK | ممتاز | ممتاز | جيد |
| المدفوعات | نعم | نعم | نعم |
الميزة الرئيسية لـ Braintree هي الدعم الأصلي لـ PayPal و Venmo. إذا كنت بحاجة لمعالجة البطاقات وPayPal في نفس التكامل، غالبًا سيكون أبسط من Stripe + PayPal بشكل منفصل.
حالات استخدام واقعية
- منصة اشتراكات SaaS: تستخدم Braintree للاشتراكات الشهرية. يتم التعامل مع المدفوعات الفاشلة عبر الويب هوك، مع إرسال إشعارات بريدية تلقائية وتمكين تحديث طريقة الدفع ذاتيًا.
- مدفوعات السوق (Marketplace): تقسيم المدفوعات بين المنصة والمستقلين باستخدام حسابات التجار الفرعية في Braintree لتبسيط التعقيد.
- التجارة الإلكترونية مع PayPal: واجهة برمجة التطبيقات الموحدة لـ Braintree تتيح دعم البطاقات وPayPal بتكامل واحد، ويعمل نفس كائن العميل عبر جميع طرق الدفع.
الخلاصة
ما يجب تذكره:
- حزم SDKs من Braintree تتعامل مع معالجة الدفع من جانب الخادم.
- رموز العميل (Client tokens) تصرح بالتواصل مع الواجهة الأمامية.
- مبيعات المعاملات تخصم من بطاقات الائتمان وPayPal.
- الاشتراكات تتولى الفوترة المتكررة.
- الويب هوك (Webhooks) تخبرك بأحداث الدفع.
- اختبر بدقة باستخدام Apidog قبل الإطلاق الفعلي.
الأسئلة الشائعة
ما هو رمز الدفع (payment method nonce)؟
الرمز (nonce) هو رمز مميز يستخدم لمرة واحدة يمثل طريقة دفع. تنشئه الواجهة الأمامية بعد إدخال العميل بيانات البطاقة، ويستخدمه الخادم للخصم. تنتهي صلاحية الرموز بعد 3 ساعات.
ما الفرق بين التفويض والتسوية؟
- التفويض: حجز مبلغ على البطاقة دون خصمه فعليًا.
- التسوية: خصم المبلغ فعليًا من البطاقة.
افتراضيًا، تقوم Braintree بالتسوية تلقائيًا. للطلبات المسبقة، يمكنك التفويض أولاً ثم التسوية عند الشحن:
// تفويض فقط
await gateway.transaction.sale({
amount: '99.00',
paymentMethodNonce: nonce,
options: {
submitForSettlement: false // تفويض فقط
}
})
// تسوية لاحقًا
await gateway.transaction.submitForSettlement('transaction_id')
كيف أتعامل مع العملات؟
كل حساب تاجر في Braintree له عملة افتراضية. العملات المتعددة تتطلب حسابات تجارية منفصلة. تواصل مع دعم Braintree لإعداد ذلك.
ما أرقام بطاقات الاختبار التي يجب أن أستخدمها؟
-
4111111111111111- فيزا (نجاح) -
4000111111111115- فيزا (رفض) -
5555555555554444- ماستركارد (نجاح) -
378282246310005- أمريكان إكسبريس (نجاح)
كيف أتعامل مع النزاعات/استرداد المدفوعات؟
استمع إلى ويب هوك:
dispute_openeddispute_wondispute_lost
قدم الأدلة عبر لوحة تحكم Braintree. وثّق كل شيء (مراسلات العملاء، تأكيدات التسليم، شروط الخدمة).
هل يمكنني تخزين أرقام بطاقات الائتمان؟
لا. يمنع الامتثال لمعايير PCI تخزين أرقام البطاقات الخام. خزن رموز طريقة الدفع فقط، وتتكفل Braintree بالامتثال.
ما هو 3D Secure؟
3D Secure يضيف خطوة تحقق إضافية للمعاملات أونلاين. يمكنك تفعيله من لوحة التحكم، والتعامل مع استجابات authentication_required:
const result = await gateway.transaction.sale({
amount: '100.00',
paymentMethodNonce: nonce,
threeDSecure: {
required: true
}
})
كم تستغرق عمليات استرداد الأموال؟
عادةً تتم في غضون 3-5 أيام عمل حسب بنك العميل. ستتلقى ويب هوك transaction_refunded عند اكتمال العملية.


Top comments (0)