از بازپرداخت مبالغی که هرگز نباید کسر میشدند، خودداری کنید
بسیاری از توسعهدهندگان فرآیند پرداخت (checkout flow) را بهگونهای پیادهسازی میکنند که کارت بلافاصله شارژ (کسر مبلغ) میشود. سپس، اعتبارسنجی سفارش مانند بررسی موجودی انبار یا بررسی کلاهبرداری را انجام میدهند.
اگر اعتبارسنجی با شکست مواجه شود، کد یک دستور بازپرداخت (refund) صادر میکند.
این کار مشکلاتی برای مشتریان شما ایجاد میکند. آنها ابتدا یک کسر مبلغ را میبینند و چند روز بعد یک بازپرداخت. آنها فکر میکنند شرکت شما قابل اعتماد نیست یا تصور میکنند پولشان گیر کرده است.
بازپرداختها هزینههای واقعی دارند:
- مشتریان وقتی دو تراکنش مجزا را میبینند، اعتماد خود را از دست میدهند.
- ۵ تا ۱۰ روز طول میکشد تا بازپرداختها در صورتحساب بانکی ظاهر شوند.
- ممکن است به دلیل کارمزدهای تراکنش یا نرخ ارز، ضرر مالی کنید.
- شبکههای کارت اعتباری، الگوهای مکرر «کسر مبلغ و بازپرداخت» را به عنوان ریسک بالا علامتگذاری میکنند.
راه حل، استفاده از مدل authorize و capture است.
بیشتر آموزشها به شما یاد میدهند که پول را بلافاصله capture کنید. در عوض، شما باید ابتدا یک hold (نگهداری موقت) روی موجودی قرار دهید. یک hold بدون جابهجا کردن پول، روی کارت باقی میماند. اگر اعتبارسنجی شما با شکست مواجه شد، کافی است آن hold را لغو کنید. در این حالت، هیچ مبلغی در صورتحساب مشتری ثبت نمیشود.
در Stripe، این کار را با تنظیم capture_method روی manual انجام میدهید.
فرآیند جدید به این صورت عمل میکند:
- یک
PaymentIntentبا قابلیتmanual captureایجاد کنید. - موجودی authorize میشود اما جابهجا نمیشود.
- اعتبارسنجی سفارش خود را انجام دهید.
- اگر سفارش معتبر بود، پرداخت را capture کنید.
- اگر سفارش با شکست مواجه شد، intent را لغو کنید.
این رویکرد چندین مزیت دارد:
- از نیاز به بازپرداخت (refund) جلوگیری میکنید.
- یک authorization لغو شده، بهسادگی از صورتحساب مشتری حذف میشود.
- میتوانید partial capture (کسر بخشی از مبلغ) انجام دهید. اگر مشتری سه قلم کالا بخرد اما یکی از آنها موجود نباشد، شما فقط مبلغ دو قلم کالا را capture میکنید.
- یک ردپای حسابرسی (audit trail) تمیز در لاگهای خود ایجاد میکنید.
اکثر ارائهدهندگان بزرگ پرداخت از همین منطق استفاده میکنند.
- Stripe از
capture_method: manualاستفاده میکند. - Adyen از تأخیر در manual capture استفاده میکند.
- Braintree از
submitForSettlement: falseاستفاده میکند. - PayPal از
intent: AUTHORIZEاستفاده میکند.
اگر هر بخشی از منطق کسبوکار شما ممکن است پس از کلیک مشتری روی دکمه پرداخت با شکست مواجه شود، از این روش استفاده کنید. بررسیهای پرریسک خود را به فاصله بین authorization و capture منتقل کنید. این کار باعث میشود جابهجاییهای مالی شما شفاف و مشتریانتان راضی بمانند.
منبع: https://dev.to/jguillaumesio/stop-refunding-payments-you-should-never-have-charged-4d7m