对于我的项目,我需要实现从卡到卡的转移的能力。 为了与任何银行的接口进行正式连接,有必要达成协议并满足许多条件。 因此,决定建立通往银行公开页面的门户。 为此,选择了两家Tinkoff和BIN银行,这两家银行提供了无需手续费即可转移至“其”卡的机会。 您可以在银行的相关页面上找到有关关税和转账限制的更多信息。 本文简要介绍了网关的操作,该网关实现了接受卡付款的功能。
需要实现从任何卡到预选卡的传输,并支持3DSecure授权程序。 3DSecure是用于CNP操作(不存在卡)的安全用户授权协议。 您可以在专业站点上阅读更多内容,下图显示了从用户角度来看其工作原理的简化图。

图为授权交易的简化机制,当您进行卡间付款或转账操作并输入SMS代码进行确认时,“幕后”会发生什么。
让我们逐步考虑:
- 输入卡的详细信息和金额,然后发送到银行的网站。
- 银行使用专门的服务(Merchant插件MPI),该服务会生成一个特殊的PaReq请求,该请求是带有数字签名的XML,其中包含交易参数以及应将请求发送到何处(访问控制服务器ACS)以及将其发送到何处的数据授权响应(PaRes)。
- 银行向用户返回一个包含来自MPI的信息的页面,并自动将浏览器重定向到发行用户卡的银行的ACS页面。 向用户显示了用于输入SMS代码的页面,并且SMS发送到了在开证行中注册的电话号码。
- 输入SMS代码后,ACS服务器将形成一个带有授权响应(PaRes)的页面,将用户重定向到MPI页面以完成操作或拒绝执行该操作。
为了更深入地了解该过程,请阅读相关的Visa或Mastercard文档,此级别足以解决此问题。
为了确保网关的无缝运行,以免网站的耳朵看不到翻译内容,必须将其集成到MPI和ACS之间的浏览器重定向过程中。 为此,替换从MPI收到的地址(TermUrl)。 这是用户完成授权后PaRes将重定向到的地址,因为TermUrl是在请求中输入的网关地址。 这将允许网关接收响应(RaRes),以将其发送到MPI服务器,并在处理MPI响应之后,将用户定向到成功或不成功完成事务的页面。
网关在用户的浏览器和银行页面之间工作,实现模拟银行页面,补充和修改数据以及处理来自银行服务的响应和错误的输入/输出功能。
通过浏览器和银行网站之间的反向工程交互,手动阐明了与每个银行的交互协议,通常,逻辑相同,变量和传输方法不同。 通常,这是一个瓶颈,软件的功能取决于API的不变性,一旦银行更改了服务的操作,网关的逻辑也将必须更改。
让我们更详细地考虑工作逻辑。
为了确保网关中的操作,将执行一个支付页面,在以下地址进行呼叫:
http://< >/pay/page?payid=123456&sum=100&text=Test
该URL包含以下变量:
payid-交易完成后识别付款请求结果所需的交易ID;
sum-交易金额;
文字 -信息字段“付款目的”。

填写卡数据并同意执行条款后,将发出操作委托请求。 进行转账的佣金和银行的大小(两个Tinkoff和BIN中的一个)取决于网关设置中指定为转账接收方的卡以及银行服务的可用性。 网关中实现了一种用于路由和错误处理的简单机制:始终选择Tinkoff,如果bank页面不可用,则选择BIN Bank页面。
单击转移按钮后,系统将重定向到发行卡的发行银行(ACS)的页面,将从中执行借记操作。 在记住缓存(Redis)中的事务参数之后,网关将向MPI请求PaReq参数,替换TermUrl并将数据发送给用户。
授权完成后,PaRes将转到网关,并基于缓存数据将其转发到相应的MPI,处理响应,并将用户重定向到网关设置中指定的页面之一(ERROR_PAGE,SUCCESS_PAGE)。
用于成功完成操作的页面的URL包含payid变量,该变量以带有数字签名的JWT的形式传输操作结果。
JWT示例: eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI2Njk2NzFlYi1mYmZlLTVlMTMtYTdkZi05NDEwZjg1N2U5ODkiLCJpYXQiOjE1NzE5MDg5MjgsInN1YiI6ImZpeGVkIiwiaXNzIjoicnUucGhvbmU0cGF5IiwicGF5X2lkIjoiMTIzNDUiLCJzdW0iOiIxMDAuMCIsInRyYW5zYWN0aW9uX2lkIjoiODY4MTE5ODYzIn0.c-IK3FowoR_tVe3-cpT7-rmA4EQhYy8rZkWrWASHZlc0ZzzpQont5XriCSzuDaY7jf7iIC8ZAxknAMwmTNmAHg

通过验证JWT的内容,您可以获得有关操作成功的可靠信息,JWT令牌执行类似于PaReq的功能,并提供与外部系统集成的能力。
该解决方案是支付网关的原型,您可以使用该网关在您的网站或社交网络页面上实现Internet接收(通过卡付款)。 您可以参数化付款页面或编写自己的付款页面,创造性地修改软件,主要是将操作的金额和ID转移到输入,并在输出中检查其他人没有创造性地进行任何更改。 源代码和工作示例可在
github上找到 。
还有一个网关可以补充您的VK.pay钱包,也可以用作支付网关。 通常,它实现相同的原理,Selenium用于实现部分功能,并借助该功能实现了站点上的授权和访问钱包的授权。
重要! 任何Internet交易都有潜在危险,您的数据可能被盗,在进行Internet交易时需要采取预防措施。
重要! 对于盗窃他人银行卡中的资金
规定了刑事责任(俄罗斯联邦《刑法》第159.3和159.6条) 。