Как да мамят Robokassa
Същност на въпроса
Мисля, че много от вас са запознати с такава услуга за плащане като Robokassa. Тази услуга, както обикновено, работи с два вида клиенти: физически и юридически лица. Обикновеният потребител, купуващ нещо в нашия онлайн магазин, очаква да му бъде представена фактура за сумата, посочена на цената. Очевидният факт е, че изискването от потребителя да покрие и комисионната е прав път към никъде. Тук възниква въпросът как да прехвърлим задължението за плащане на дела на robobox office към самия онлайн магазин.
Изглежда, какво може да бъде по-лесно? Със сигурност такава настройка е в личния ви акаунт на сайта за плащане. Не беше така. По-скоро е така. Но само ако сте юридическо лице.
В моята ситуация човекът, за когото е създаден този магазин, е физическо лице. Администрацията на robokassa благоразумно постави въпроса за комисионната в страничната лента на личния акаунт. Очевидно, като най-подходящи. За да не бъдете неоснователни:

- MerchantLogin - вашето влизане в системата
- InvId - идентификатор на фактура
- OutSum - сумата, която искаме да получим
- MerchantPass1 - техническа парола №1 за транзакции (общо са две, втората е за получаване на информация за състоянието на плащанията)
- SignatureValue - md5-хеш на низ като "sMerchantLogin: nOutSum: nInvId: sMerchantPass1"
Всъщност всяка хитра промяна на една от стойностите, включени в реда SignatureValue, ще попречи на сделката да бъде завършена. Между другото, вие като разработчик можете да добавите свои собствени параметри shp *, които ще „оцелеят“ при плащането и ще бъдат изпратени обратно на вашия сървър. Тези параметри също се добавят към подписа на транзакцията.
Сега да се върнем към темата на статията.
Решение на проблема
Решението, предлагано от служителите на Robokassa, е тревожно веднага. Изглежда така:
За тези цели е създаден специален XML интерфейс:
Методът за изчисляване на сумата, получена от магазина - CalcOutSumm
Описание на метода: Позволява ви да изчислите сумата на вземането въз основа на текущите курсове ROBOKASSA, в зависимост от сумата, която потребителят ще плати.
Параметри на метода: MerchantLogin - идентификатор на магазин (низ), IncCurrLabel - етикет на валута (низ), за който трябва да се изчисли сумата. Ако го оставите празно, изчислението ще бъде направено за всички налични валути, IncSum - сумата, която потребителят трябва да плати.
Тези. ние сме поканени да изчислим сумата, така че, като се вземе предвид комисионната, тя да бъде равна на цената на стоката. Магазинът беше написан на релси и следователно всяко допълнително разбор щеше да отнеме няколко реда. И все пак, дори с цялото ни желание
Къде е заровено кучето?
Проблемите започват веднага щом искаме да използваме този „интерфейс“. Да приемем, че искахме да изчислим сумата за всички методи на плащане. Както се казва в ръководството:
IncCurrLabel - валутен етикет (низ), за който искате да изчислите сумата. Ако го оставите празно, изчислението ще се извърши за всички налични валути.