از بازپرداخت مبالغی که هرگز نباید کسر می‌شدند، خودداری کنید

بسیاری از توسعه‌دهندگان فرآیند پرداخت (checkout flow) را به‌گونه‌ای پیاده‌سازی می‌کنند که کارت بلافاصله شارژ (کسر مبلغ) می‌شود. سپس، اعتبارسنجی سفارش مانند بررسی موجودی انبار یا بررسی کلاهبرداری را انجام می‌دهند.

اگر اعتبارسنجی با شکست مواجه شود، کد یک دستور بازپرداخت (refund) صادر می‌کند.

این کار مشکلاتی برای مشتریان شما ایجاد می‌کند. آن‌ها ابتدا یک کسر مبلغ را می‌بینند و چند روز بعد یک بازپرداخت. آن‌ها فکر می‌کنند شرکت شما قابل اعتماد نیست یا تصور می‌کنند پولشان گیر کرده است.

بازپرداخت‌ها هزینه‌های واقعی دارند:

راه حل، استفاده از مدل authorize و capture است.

بیشتر آموزش‌ها به شما یاد می‌دهند که پول را بلافاصله capture کنید. در عوض، شما باید ابتدا یک hold (نگهداری موقت) روی موجودی قرار دهید. یک hold بدون جابه‌جا کردن پول، روی کارت باقی می‌ماند. اگر اعتبارسنجی شما با شکست مواجه شد، کافی است آن hold را لغو کنید. در این حالت، هیچ مبلغی در صورت‌حساب مشتری ثبت نمی‌شود.

در Stripe، این کار را با تنظیم capture_method روی manual انجام می‌دهید.

فرآیند جدید به این صورت عمل می‌کند:

  1. یک PaymentIntent با قابلیت manual capture ایجاد کنید.
  2. موجودی authorize می‌شود اما جابه‌جا نمی‌شود.
  3. اعتبارسنجی سفارش خود را انجام دهید.
  4. اگر سفارش معتبر بود، پرداخت را capture کنید.
  5. اگر سفارش با شکست مواجه شد، intent را لغو کنید.

این رویکرد چندین مزیت دارد:

اکثر ارائه‌دهندگان بزرگ پرداخت از همین منطق استفاده می‌کنند.

اگر هر بخشی از منطق کسب‌وکار شما ممکن است پس از کلیک مشتری روی دکمه پرداخت با شکست مواجه شود، از این روش استفاده کنید. بررسی‌های پرریسک خود را به فاصله بین authorization و capture منتقل کنید. این کار باعث می‌شود جابه‌جایی‌های مالی شما شفاف و مشتریانتان راضی بمانند.

منبع: https://dev.to/jguillaumesio/stop-refunding-payments-you-should-never-have-charged-4d7m