التجارة الإلكترونية

مدفوعات العملات الرقمية لمتاجر السلع الرقمية

كيف يمكن لمتجر يبيع المفاتيح والحسابات والتنزيلات والاشتراكات قبول العملات الرقمية: مسار التسليم، والمدفوعات الجزئية، وتكرار الـ webhook، وما يجب وعد العملاء به.

المتجر الذي يبيع مفاتيح التراخيص أو حسابات الألعاب أو التنزيلات أو صلاحيات الوصول له خاصية غير معتادة: يُسلَّم المنتج لحظة وصول المال، دون تدخّل أي شخص. لهذا بالذات تناسبه العملات الرقمية، ولهذا بالذات تهمّ تفاصيل مسار الدفع. يشرح هذا الدليل ما الذي يتغيّر، وكيف تربط التسليم بحالة الدفع، والأخطاء التي تُفقد المتاجر الرقمية مخزونها.

لماذا تناسب السلع الرقمية العملات الرقمية

ثلاث خصائص للسلع الرقمية تنسجم مع طريقة عمل مدفوعات العملات الرقمية:

  • التسليم فوري، لذا يجب أن يكون الدفع كذلك. العميل الذي ينتظر مفتاحه لا يريد انتظار تسوية مصرفية. يصبح دفع العملات الرقمية نهائيًا عندما تؤكده الشبكة، ويمكن لنظامك التسليم فورًا.
  • الجمهور موجود أصلًا. مشترو مفاتيح البرامج وعناصر الألعاب والـ VPN والاستضافة ومنتجات مشابهة غالبًا ما يحتفظون بعملات مستقرة ويفضلون الدفع بها، بمن فيهم عملاء في بلدان لا تعمل فيها بطاقات سوقك.
  • لا توجد عمليات chargeback على البطاقات. لا يستطيع المرسل عكس تحويل العملات الرقمية. بالنسبة لمتجر تضرر من مدفوعات بطاقات متنازع عليها على سلع رخيصة تُسلَّم فورًا، فهذا تغيير حقيقي. وهذا يعني أيضًا أن الاسترداد قرارك وتحويل ترسله بنفسك، لذا اكتب سياسة الاسترداد قبل الإطلاق.

يبقى التسعير بسيطًا: تحدد السعر بالدولار الأمريكي ويدفع العميل ما يعادله بالأصل والشبكة اللذين يختارهما في صفحة الدفع.

المسار من السلة إلى المنتج المُسلَّم

مسار الطلب الواحد يبدو هكذا:

  1. يضيف العميل منتجًا ويُدخل بريده الإلكتروني (أو يسجّل الدخول).
  2. في صفحة إتمام الطلب يختار «الدفع بالعملات الرقمية». ينشئ خادمك دفعة للطلب ويتلقى رابطًا إلى صفحة الدفع المستضافة.
  3. توجّه العميل إلى تلك الصفحة. يختار أصلًا وشبكة ويدفع المبلغ الدقيق من محفظته.
  4. عند اكتمال الدفع تستدعي البوابة الـ webhook الخاص بك.
  5. يضع خادمك علامة «مدفوع» على الطلب، ويأخذ مفتاحًا أو يمنح الوصول، ويرسله بالبريد الإلكتروني وفي صفحة الطلب.

متجرك لا يولّد عنوانًا ولا يراقب البلوكتشين ولا يقارن المبالغ أبدًا. إنه يفعل أمرين: ينشئ دفعة ويتفاعل مع الحالة النهائية. النسخة التفصيلية خطوة بخطوة مع الشيفرة موجودة في كيف تقبل مدفوعات العملات الرقمية على موقع ويب.

أنشئ الدفعة برقم الطلب الخاص بك

أنشئ الدفعة من الخادم الخلفي بطلب POST واحد إلى https://api.qvard.com/api/v1/payment. يحمل الطلب مفتاحك في الترويسة Authorization: Bearer وجسم JSON فيه رقم الطلب في id والسعر price بالدولار الأمريكي، واختياريًا paymentSystemId إذا أردت أن تُفتح الصفحة بأصل وشبكة محددين. الاستجابة 201 مع redirectUrl.

استخدم رقم طلب موجودًا في نظامك قبل الدفعة، ورقمًا واحدًا لكل عملية شراء. إذا انتهت مهلة الطلب وأعدت إرساله بالـ id نفسه لطريقة الدفع نفسها فستحصل على الدفعة الموجودة بدل دفعة ثانية، لذا فإعادة المحاولة آمنة.

أنشئ الدفعة بعد أن يضغط العميل على «ادفع» فقط، لا عند بناء السلة. وإلا ظهرت السلال المهجورة كركام من الدفعات غير المسددة.

سلّم فقط عند اكتمال الدفع، ومرة واحدة فقط

هذه هي القاعدة التي تحمي مخزونك. للدفعة أربع حالات: wait (أُنشئت)، partial (أرسل العميل أقل من المطلوب)، completed (وصل المبلغ كاملًا)، وrejected. يستدعي Qvard الـ webhook الخاص بك عند اكتمال الدفعة، مع الـ id الذي أرسلته والـ status.

ومن هذا يأتي شرطان للمعالج لديك:

  • تصرّف فقط عند completed. لا تسلّم مفتاحًا لمجرد أن العميل عاد إلى موقعك، ولا عند مبلغ جزئي. دليل الدفع هو الـ webhook وليس المتصفح.
  • كن idempotent. يُعاد إرسال الـ webhook حتى تردّ نقطة النهاية لديك بـ HTTP 200 بالضبط (خمس محاولات في نحو ست دقائق)، وقد تصل إعادة المحاولة بعد نجاح الأولى. سلّم المفتاح وضع علامة «سُلِّم» على الطلب في معاملة قاعدة بيانات واحدة، وتخطَّ الطلبات المُسلَّمة. وإلا فقد تكلّفك دفعة واحدة مفتاحين.

تحقّق من توقيع ترويسة X-Qvard-Signature في كل webhook: HMAC-SHA256 بمفتاحك السري، بمقارنة بزمن ثابت (constant-time)، وارفض ما لا يطابق. المزيد في كيف تؤمّن webhook مدفوعات العملات الرقمية.

Node.jsdeliver.js
// Called from the Qvard webhook handler after the X-Qvard-Signature check.
async function onQvardEvent({ id, status }) {
  const order = await db.orders.findById(id);
  if (!order) return;                          // unknown order: ignore

  if (status !== 'completed') return;          // deliver only on a full payment
  if (order.deliveredAt) return;               // the webhook can arrive twice

  // One transaction: take a key and mark the order, so a retry cannot take a second key.
  await db.transaction(async (tx) => {
    const key = await tx.licenseKeys.takeFree(order.productId);
    await tx.orders.update(order.id, { state: 'paid', deliveredAt: new Date(), keyId: key.id });
    await mailer.send(order.email, 'Your purchase', 'Key: ' + key.value);
  });
}

أظهر للعميل ما يجري

روابط العودة بعد الدفع غير متاحة بعد، لذا يعود العميل الذي دفع إلى موقعك من تلقاء نفسه، وغالبًا قبل معالجة الـ webhook بثوانٍ. استعد لتلك اللحظة:

  • أعطِ كل طلب صفحة تعرض الحالة الحالية: بانتظار الدفع، مدفوع ومُسلَّم، أو مشكلة.
  • اجعل الصفحة تُحدّث نفسها ما دامت الحالة «بانتظار الدفع»، ليظهر المفتاح دون إعادة تحميل.
  • أرسل المفتاح بالبريد الإلكتروني أيضًا. الناس يغلقون التبويبات، والبريد هو النسخة التي سيبحثون عنها لاحقًا.
  • إن لم يُعلَّم الطلب مدفوعًا بعد، فاذكر ذلك بوضوح واطلب من العميل ألا يدفع مرتين.

معظم تذاكر الدعم في المتاجر الرقمية هي «دفعت ولم أستلم شيئًا». صفحة الحالة والبريد الإلكتروني يقلّلانها أكثر من أي شيء آخر.

نقص المبلغ المدفوع والطلبات المنتهية

يرسل عملاء العملات الرقمية أحيانًا أقل قليلًا من المطلوب، لأن رسوم السحب من منصة التداول خُصمت من المبلغ، أو لأنهم يدفعون بعد الموعد الذي خطّطوا له. قرّر ما ستفعله قبل أن يحدث ذلك.

  • دفع جزئي. الحالة partial. لا تسلّم. الخياران المعتادان: إبقاء الطلب مفتوحًا وطلب إرسال الباقي من العميل، أو الاسترداد والإلغاء. اختر أحدهما وأبلغ العميل في صفحة الطلب.
  • سعر الصرف والوقت. سعر الصرف في صفحة الدفع ثابت لمدة ساعة، فلا يتحرك المبلغ أثناء دفع العميل. احجز مخزون الطلب لهذه المدة على الأقل وحرّره إذا لم يُدفع الطلب أبدًا.
  • مخزون محدود. إذا بقي مفتاح واحد فاحجزه عند إنشاء الدفعة وحرّره عند الانتهاء؛ وإلا قد يدفع عميلان ثمن المفتاح نفسه.

اجعل المنطق صغيرًا. متجر له ثلاث نتائج بالضبط (مدفوع، جزئي، غير مدفوع) أسهل في التشغيل من متجر له عشرات الحالات الخاصة.

ماذا تقول للعملاء

صفحة دفع واضحة تحقق تحويلات أكثر من صفحة ذكية. قرب الزر اذكر:

  • أي الأصول والشبكات تقبل (انظر العملات المدعومة) وأن على العميل الدفع في الشبكة التي اختارها في صفحة الدفع؛
  • أن التسليم تلقائي بعد اكتمال الدفع، وأين سيظهر المفتاح؛
  • قاعدة الاسترداد لديك في جملة واحدة، لأن العميل لا يستطيع عكس دفعة العملات الرقمية.

اذكر السعر أيضًا بالدولار ودع صفحة الدفع تعرض المبلغ الدقيق بالأصل المختار. لا تذكر أنت مبلغ العملة الرقمية في صفحة المنتج؛ فهو يتغير مع سعر الصرف.

ما الجاهز في Qvard اليوم وما ليس جاهزًا

كن واقعيًا بشأن ما تدمجه. يعمل Qvard عبر واجهة API: متجرك ينشئ الدفعة ويستقبل الـ webhook. لا توجد بعد إضافة جاهزة لمنصات المتاجر، وروابط الدفع و sandbox منفصل قيد التطوير، ويعود العملاء إلى موقعك من تلقاء أنفسهم بعد الدفع. لمتجر لديه مطوّر، أو ساعة عمل من مستقل، هذا جزء صغير من الشيفرة. راجع وثائق المطورين ونظرة عامة على التكاملات، وافتح فاتورة تجريبية لترى ما سيراه عميلك.

أما من جهة المال، فتبقى الأموال في رصيدك في Qvard وتسحبها إلى محفظتك الخاصة؛ السحب لا يكلّف إلا رسوم الشبكة، ولا توجد رسوم اشتراك. السحب إلى حساب مصرفي بالعملة الورقية غير متاح.

FAQ

هل يمكنني تسليم المنتج تلقائيًا بعد دفعة بالعملات الرقمية؟

نعم. يستدعي Qvard الـ webhook الخاص بك عند اكتمال الدفعة، ثم يستطيع خادمك أخذ مفتاح أو منح وصول وإرساله للعميل. سلّم فقط عند حالة completed واجعل المعالج آمنًا إذا نُفّذ مرتين.

ماذا يحدث إذا أرسل العميل أقل من المبلغ كاملًا؟

تأخذ الدفعة حالة partial ولا يُرسل webhook الاكتمال. لا تسلّم. اطلب من العميل إرسال الباقي أو أعد له المال، بحسب سياستك.

هل توجد عمليات chargeback مع مدفوعات العملات الرقمية؟

لا. لا يستطيع المرسل عكس تحويل العملات الرقمية. هذا يحميك من مدفوعات البطاقات المتنازع عليها، لكنه يعني أيضًا أنك أنت من يرسل المبالغ المستردة، لذا حدّد سياسة استرداد منذ البداية.

هل يمكنني تحديد الأسعار بالدولار؟

نعم، يُحدَّد السعر بالدولار الأمريكي. يدفع العميل ما يعادله بالأصل والشبكة اللذين يختارهما في صفحة الدفع، بسعر صرف ثابت لمدة ساعة.

هل توجد إضافة لمنصة متجري؟

ليس بعد. اليوم يتم التكامل عبر الـ API: طلب واحد لإنشاء دفعة وwebhook واحد لاستقبال النتيجة.

مقالات ذات صلة

مقالات ذات صلة