Такрорий тўлов, яъни recurring billing — бу мижоздан ҳар ой ёки ҳар йили автоматик равишда пул ечиб олиш жараёни бўлиб, унинг ортида кўпчилик ўйлаганидан анча мураккаб техник инфратузилма ётади. Фойдаланувчи обунани бир марта фаоллаштирса, кейинги тўловлар унинг иштирокисиз амалга ошиши керак, бу эса картани хавфсиз сақлаш, тўғри вақтда ҳисоб-китоб қилиш ва муваффақиятсиз уринишларни қайта ишлаш каби масалаларни келтириб чиқаради. Ушбу мақолада биз subscription бизнес моделини эмас, балки унинг остидаги биллинг механикасини — дастурчи сифатида нимани қандай қуриш кераклигини батафсил кўриб чиқамиз. Мақсад — сизнинг сайтингиз ёки иловангизда ишончли такрорий тўлов тизимини қуриш учун зарур билимларни бериш.
Карта сақланмайди — токен сақланади
Такрорий тўловнинг биринчи ва энг муҳим қоидаси шуки, сиз ҳеч қачон мижознинг карта рақамини ўз серверингизда сақламайсиз. Бунинг ўрнига тўлов провайдери (Stripe, Payme, Click ёки бошқа шлюз) картани ўзининг хавфсиз муҳитида сақлайди ва сизга токен деб аталадиган махсус идентификаторни қайтаради. Бу токен ўзи орқали картадан пул ечиб бўлмайди, лекин сизнинг провайдерингизга «ўша сақланган картадан шунча пул еч» деган буйруқни бериш имконини беради. Шу ёндашув туфайли сизнинг тизимингиз PCI DSS талабларининг энг оғир қисмидан озод бўлади, чунки ҳақиқий карта маълумотлари сизнинг серверингизга умуман тегмайди.
Техник жиҳатдан бу жараён одатда икки босқичда кечади. Биринчи тўловда мижоз карта маълумотларини провайдернинг хавфсиз формасига киритади ва провайдер «setup intent» ёки шунга ўхшаш операция орқали картани тасдиқлайди ҳамда сақлайди. Кейин сизнинг базангизда фойдаланувчи ёзуви билан бирга ушбу токен ва провайдердаги мижоз идентификатори сақланади. Кейинги барча тўловлар учун сиз шунчаки ушбу токенни ишлатиб, провайдер API'сига сўров юборасиз ва у картадан пул ечади. Муҳим нуқта — токен муддати ўтиши ёки карта янгиланиши мумкин, шунинг учун провайдерлар кўпинча «card updater» хизматини таклиф қилади, бу эскирган карта маълумотларини автоматик янгилаб туради.
Тўлов жадвали ва биллинг цикли
Ҳар бир обуна ўзининг биллинг циклига эга: ойлик, йиллик ёки ихтиёрий интервал. Тизим ҳар бир актив обуна учун кейинги тўлов санасини ҳисоблаб бориши ва ўша сана келганда тўловни ишга тушириши керак. Буни амалга оширишнинг икки асосий йўли бор. Биринчиси — провайдернинг ўз биллинг тизимига (масалан, Stripe Billing) таяниш, бунда Stripe ўзи жадвални бошқаради ва вақти келганда webhook орқали сизни хабардор қилади. Иккинчиси — ўзингизнинг cron жараёнингиз ҳар куни ишга тушиб, бугун тўлови келган обуналарни топиб, ҳар бири учун провайдерга charge сўровини юборади.
Ўзингизнинг жадвалингизни бошқарганда бир нечта нозик масалалар пайдо бўлади. Масалан, 31-январда бошланган ойлик обуна февралда қайси кунга тушади? Кўпчилик тизимлар бундай ҳолатда ойнинг охирги кунига туширади ва кейин имкон қадар асл санага қайтаради. Вақт минтақалари ҳам муҳим — тўлов мижознинг вақт минтақасида ярим тунда эмас, балки сизнинг серверингиздаги белгиланган вақтда ишлаши керак, акс ҳолда ёзги вақт ўзгаришлари ёки турли минтақалар туфайли чалкашлик юзага келади. Идемпотентлик калити (idempotency key) ҳам зарур, чунки cron қайта ишга тушганда бир хил обуна икки марта ҳисобланмаслиги шарт.
Dunning: муваффақиятсиз тўловни қайта уриниш
Реал ҳаётда такрорий тўловларнинг сезиларли қисми биринчи уринишда муваффақиятсиз бўлади — картада маблағ етишмайди, карта муддати ўтган ёки банк транзакцияни вақтинча рад этади. Бундай ҳолатларни бошқариш жараёни dunning деб аталади ва у сизнинг даромадингизни сақлаб қолишда ҳал қилувчи рол ўйнайди. Ёмон қурилган dunning мантиғи туфайли аслида тўлашга қодир мижозлар шунчаки бир марта хато туфайли йўқотилади, яхши қурилгани эса муваффақиятсиз тўловларнинг ярмидан кўпини қайтариб олиши мумкин.
Dunning стратегиясининг асоси — ақлли қайта уриниш жадвали. Биринчи муваффақиятсизликдан кейин дарҳол яна уриниш кўпинча фойдасиз, чунки сабаб ўзгармаган бўлади. Бунинг ўрнига тизим бир неча кун оралиғида, масалан 1-кун, 3-кун, 5-кун ва 7-кунда қайта уради, чунки шу вақт ичида мижоз картасини тўлдириши ёки маошини олиши мумкин. Ҳар бир уриниш билан бирга мижозга email ёки SMS орқали хабар юборилиши керак — «тўловингиз амалга ошмади, илтимос картангизни янгиланг». Агар барча уринишлар тугаса, обуна тўхтатилади ёки чекланган режимга ўтказилади. Баъзи тизимлар «smart retry» қўллайди, яъни машина ўрганиши орқали ҳар бир карта учун муваффақият эҳтимоли энг юқори бўлган вақтни танлайди.
Proration: ўртада тариф ўзгартириш
Proration — бу мижоз биллинг цикли ўртасида тарифини ўзгартирганда тўловни адолатли қайта ҳисоблаш механизми. Масалан, мижоз ойнинг 1-кунида 100 минг сўмлик режага обуна бўлган, лекин 15-куни 200 минг сўмлик режага ўтмоқчи. Бу ҳолатда у қолган ярим ой учун эски режанинг ишлатилмаган қисмини қайтариб олиши ва янги режанинг қолган қисми учун фарқни тўлаши керак. Proration шу ҳисоб-китобни автоматлаштиради ва мижоздан аниқ қанча пул олиш ёки келажакдаги ҳисобига қанча кредит қўшиш кераклигини аниқлайди.
Техник жиҳатдан proration кун даражасида ҳисобланади: қолган кунлар сони биллинг циклидаги умумий кунларга бўлинади ва шу нисбат нархга кўпайтирилади. Юқори тарифга ўтишда (upgrade) одатда фарқ дарҳол ундирилади, пасайишда (downgrade) эса кўпинча кредит сифатида сақланиб, кейинги ҳисобда ҳисобга олинади. Бу ерда муҳим қарор — proration'ни дарҳол алоҳида транзакция сифатида амалга оширасизми ёки кейинги оддий ҳисобга қўшиб юборасизми. Кўпгина провайдерлар иккала вариантни ҳам қўллаб-қувватлайди, аммо солиқ ва чека тузилиши нуқтаи назаридан бу танлов муҳим аҳамиятга эга.
Invoice, чека ва солиқ
Ҳар бир муваффақиятли тўлов учун тизим invoice ёки чека яратиши керак, бунда ким, қачон, қайси хизмат учун ва қанча тўлаганлиги қайд этилади. Бу нафақат мижоз учун шаффофлик, балки бухгалтерия ва солиқ ҳисоботлари учун ҳам зарур. Invoice одатда ноёб рақамга эга бўлиб, изчил кетма-кетликда генерация қилиниши керак, чунки кўп мамлакатларда солиқ қонунлари бўшлиқларсиз рақамлашни талаб қилади. Ўзбекистонда эса фискал чека талаблари мавжуд бўлиб, ҳар бир тўлов солиқ органларининг онлайн-касса тизимига узатилиши керак бўлиши мумкин.
Солиқ ҳисоблаш такрорий биллингда алоҳида мураккаблик туғдиради, айниқса хизмат турли юрисдикциялардаги мижозларга сотилса. ҚҚС ёки сотув солиғи ставкаси мижознинг жойлашувига қараб ўзгаради ва бу нархнинг бир қисми сифатида ҳисобга олиниши ёки устига қўшилиши керак. Stripe Tax каби хизматлар бу жараённи автоматлаштирса-да, маҳаллий шароитда, яъни Ўзбекистон солиқ тизимига мослашда, кўпинча қўлда қўшимча интеграция талаб этилади. Энг яхши ёндашув — солиқ логикасини биллинг логикасидан ажратиб, алоҳида модул сифатида қуриш, шунда ставкалар ўзгарганда бутун тизимни қайта ёзиш шарт бўлмайди.
Chargeback ва низолар
Chargeback — бу мижоз ўз банкига мурожаат қилиб, амалга ошган тўловни қайтаришни талаб қилганда юзага келадиган ҳолат. Такрорий тўловларда chargeback айниқса кенг тарқалган, чунки мижозлар баъзан обунани бекор қилишни унутади ёки кутилмаган тўловни кўриб, уни фирибгарлик деб ўйлайди. Ҳар бир chargeback сизга нафақат транзакция суммасини, балки банк томонидан ундириладиган қўшимча жаримани ҳам йўқотишга олиб келади, ва агар chargeback'лар улуши юқори бўлса, тўлов провайдери сизнинг ҳисобингизни умуман блоклаши мумкин.
Chargeback'ларни камайтиришнинг энг яхши йўли — шаффофлик. Ҳисобдаги тўлов тавсифи (statement descriptor) тушунарли бўлиши, ҳар бир тўловдан олдин мижозга эслатма юборилиши ва обунани бекор қилиш жараёни оддий бўлиши керак. Техник жиҳатдан тизимингиз chargeback webhook'ларини эшитиши ва улар келганда обунани автоматик тўхтатиши, мижознинг кириш ҳуқуқини чеклаши ва ички ёзувларни янгилаши лозим. Баъзи ҳолларда chargeback'га қарши низода далил сифатида фойдаланувчининг хизматдан фойдаланганлигини кўрсатувчи логлар ва етказиб бериш тасдиқлари талаб қилинади, шунинг учун бу маълумотларни сақлаб бориш фойдали.
Webhook орқали ҳолатни синхронлаш
Такрорий биллинг тизимининг энг критик техник қисмларидан бири — ҳолатни синхрон сақлаш. Сизнинг маълумотлар базангиз ва тўлов провайдери ҳар доим обунанинг ҳақиқий ҳолати тўғрисида бир хил фикрда бўлиши керак. Бунинг воситаси — webhook'лар, яъни провайдер муҳим ҳодисалар (тўлов муваффақиятли ўтди, тўлов муваффақиятсиз бўлди, обуна бекор қилинди, chargeback бошланди) юз берганда сизнинг серверингизга реал вақтда юборадиган HTTP сўровлари. Фақат ўз базангизга таяниб қолсангиз, масалан, провайдер томонида автоматик бекор қилинган обунадан бехабар қолиб, мижозга хизмат кўрсатишда давом этишингиз мумкин.
Webhook'ларни тўғри қайта ишлаш бир нечта қоидаларни талаб қилади. Биринчидан, ҳар бир webhook'нинг имзосини текширинг, акс ҳолда кимдир сохта ҳодиса юбориб тизимингизни алдаши мумкин. Иккинчидан, webhook'ларни идемпотент қилинг — бир хил ҳодиса бир неча марта келиши мумкин, шунинг учун уни қайта ишлашдан олдин илгари ишланганлигини текширинг. Учинчидан, webhook'ни дарҳол қабул қилиб, оғир ишловни навбат (queue) орқали фонда бажаринг, чунки провайдер жавобни тез кутади ва кечиксангиз қайта юборади. Тартибсиз етказиб беришни ҳам ҳисобга олинг: ҳодисалар юборилиш тартибида келмаслиги мумкин, шунинг учун ҳар бир ҳодисанинг вақт белгисига қараб энг сўнгги ҳолатни аниқланг.
Воситалар ва Ўзбекистон шароити
Дунё миқёсида Stripe Billing такрорий тўловлар учун де-факто стандарт ҳисобланади, чунки у proration, dunning, солиқ ва webhook'ларнинг катта қисмини қутидан чиққан ҳолда ҳал қилади. Унга муқобил сифатида Chargebee, Recurly, Paddle каби махсус биллинг платформалари мавжуд бўлиб, улар айниқса мураккаб тариф моделлари ёки глобал солиқ талабларига эга бизнеслар учун қулай. Бу воситалар сизни биллинг инфратузилмасини нолдан қуришдан қутқаради, лекин улар асосан халқаро карталар ва валюталар билан ишлайди.
Ўзбекистон шароитида вазият ўзига хос. Маҳаллий тўлов тизимлари — Payme, Click, Uzum ва бошқалар — асосан бир марталик тўловларга йўналтирилган бўлиб, уларнинг такрорий тўлов ва сақланган карта (токенизация) имкониятлари халқаро провайдерлардагидек ривожланган эмас. Баъзи тизимлар карта токенини сақлаб, кейинроқ қайта тўлов қилиш имконини беради, лекин proration ёки автоматик dunning каби юқори даражадаги функцияларни кўпинча ўзингиз қуришингизга тўғри келади. Шунинг учун Ўзбекистонда такрорий биллинг қурганда энг амалий ёндашув — биллинг мантиғининг ядросини (жадвал, retry, proration, ҳолат бошқаруви) ўзингиз ёзиб, тўлов провайдерини фақат «пул ечиш» қатлами сифатида ишлатиш. Бу сизга провайдер чекловларидан мустақил бўлиш ва келажакда янги тўлов тизимларини қўшиш имконини беради.