konekt / payum-otp-hungary

针对SimplePay匈牙利通过传统OTP银行集成定制的Payum网关

1.1.1 2021-01-26 12:00 UTC

This package is auto-updated.

Last update: 2024-08-26 19:42:49 UTC


README

Packagist Stable Version OTP SDK v5 SimplePay Compatible

基于OTP的支付方式已被银行弃用,请使用SimplePay替代!

尽管名称和参考为v4,但它与OTP SDK v5兼容。

由标准Payum网关库组成,您可以借此通过OTP银行匈牙利进行在线支付。它还提供与SymfonySylius的基本集成。

免责声明:该库目前仅提供简单的离线(三方)支付,针对单一店铺(不支持多店铺)。如果您需要更多功能,请随时贡献或寻求支持。

架构

该库基于OTP的官方SDK构建。它隐藏了库的一些不便之处,如需要编辑配置文件、没有自动加载、混乱的警告/通知以及不支持PHP7。官方SDK的日志功能按提供的方式工作。

您必须从OTP的网站下载SDK才能使用库。

SDK

下载SDK(当前为名为Webshop_4.0的ZIP文件)后,您将在以下路径中找到所需的php库:kliensek/php/otpwebshop。这是您使用的库,您必须将其放置在Web服务器可访问的位置。从现在起,我们将调用包含库的完整路径为SDK_DIR

由于SDK没有适当的版本控制,为了检查它是否是构建在库上的相同代码,您必须像这样生成库的校验和(假设您在Unix上)

find SDK_DIR/ -type f -name "*.php" -exec md5sum {} + | awk '{print $1}' | sort | md5sum1

测试的库的校验和为5a57d623e8da3541c8b8d6fd3848862c。如果您有另一个,则表示SDK代码已更改。如果某些功能没有按预期工作,这可能是一个原因。

使用独立库

您必须按照Payum文档中描述的方式实现操作。在examples文件夹中,您可以找到可帮助您的有效脚本。

配置

您将在examples/params.dist中找到必须配置的参数。

  • sdk_dir: SDK的完整路径(如上所述)。必需。
  • sandbox: 可以为true或false,如果为true,则不需要提供secret_key和pos_id。默认:true。
  • pos_id: OTP提供的您的店铺ID。在沙箱模式下不可用。
  • secret_key: OTP提供的属于shop_id的密钥文件的完整路径。在沙箱模式下不可用。
  • transactionid_prefix: 对于每次付款,库生成一个唯一的ID,您可以在此处指定任何前缀。它不应超过10个字符,并且应为字母数字。

此外,您还可以配置SDK记录交易的日志目录。有关每个目录的详细信息,请参阅SDK官方文档。

使用Sylius库

您必须将将Sylius模型转换为网关数据的操作注册为服务。

app.payum.otp.action.convert:
    class: Konekt\PayumOtp\Bridge\Sylius\ConvertPaymentToOtpAction

您还可以定义另一个服务,用于控制发送到OTP的支付备注(shopMegjegyzes)。如果您这样做,您需要在您的应用程序中实现 \Konekt\PayumOtp\Bridge\Sylius\PaymentNoteProviderInterface,并将其定义为服务,然后将其注入到转换器中。在这种情况下,上述定义看起来像这样:

app.payum.otp.note_provider:
    class: AppBundle\MyNoteProvider #this class implements \Konekt\PayumOtp\Bridge\Sylius\PaymentNoteProviderInterface
    public: false

app.payum.otp.action.convert:
    class: Konekt\PayumOtp\Bridge\Sylius\ConvertPaymentToOtpAction
    arguments:
        - @app.payum.otp.note_provider

要将自定义Payum库注册到您的应用程序中,您应该将以下内容添加到您的AppBundle:

$extension = $container->getExtension('payum');
$extension->addGatewayFactory(new Konekt\PayumOtp\Bridge\Symfony\OtpHungaryOffsiteGatewayFactory());

然后您需要配置payum包,使其了解新的自定义库,如下所示:

payum:
    gateways:
        otp_hungary_offsite:
            otp_hungary_offsite:
                sandbox: %payum.otp.is_sandbox%
                secret_key: %payum.otp.secret_key%
                sdk_dir: %payum.otp.sdk_dir%
                pos_id: %payum.otp.pos_id%
                transactionid_prefix: %payum.otp.transactionid_prefix%
                actions:
                    - app.payum.otp.action.convert
                extensions:
                    - app.payum.otp.extension.error_notifier

您可以在parameters.yml中定义参数(推荐)。有关参数的含义,请参阅上面的配置部分。注意:即使您处于沙盒模式,您也必须为secret_key和pos_id提供值,但在此情况下,您提供的值无关紧要(目前这是一个技术深度)。

错误处理

您还可以以解耦的方式处理交易错误。例如,如果您想收到任何交易失败的通知,无论是由于发送金额错误还是私钥被拒绝等原因,您必须将库的事件通知器扩展类注册为服务。

app.payum.otp.extension.error_notifier:
    class:  Konekt\PayumOtp\Bridge\Symfony\ErrorNotifierExtension
    arguments:
        - @event_dispatcher

然后您需要在您的应用程序中编写一个监听器,并将其定义为服务。实现MyOtpListener,当发生错误时发送电子邮件

<?php

namespace AppBundle;

use Konekt\PayumOtp\Bridge\Symfony\Event\TransactionError;

class MyOtpListener
{
    /**
     * @param \Konekt\PayumOtp\Bridge\Symfony\Event\TransactionError $event
     */
    public function handleTransactionErrors(TransactionError $event)
    {
        //var_dump($event->getErrors());
        //var_dump($event->getDetails());

        //TODO: implement here some notification logic: ie. send email to the support team
    }
}

然后将其注册为服务

app.listener.otp_error:
    class: AppBundle\MyOtpListener
    tags:
        - { name: kernel.event_listener, event: payum.otp.transaction_error, method: handleTransactionErrors }

MyOtpListener::handleTransactionErrors方法中,您将收到一个包含发生错误的数组和其他交易详情的TransactionError事件。您可以编写您需要的处理逻辑。

最终说明

如果您有任何问题,请随时创建一个问题。任何改进或进一步的功能都非常受欢迎,请随时发起拉取请求。