konekt / payum-otp-hungary
针对SimplePay匈牙利通过传统OTP银行集成定制的Payum网关
Requires
- payum/core: ~1.0
Requires (Dev)
- monolog/monolog: ^1.18
- phpspec/phpspec: ~2.0
README
基于OTP的支付方式已被银行弃用,请使用SimplePay替代!
尽管名称和参考为v4,但它与OTP SDK v5兼容。
由标准Payum网关库组成,您可以借此通过OTP银行匈牙利进行在线支付。它还提供与Symfony和Sylius的基本集成。
免责声明:该库目前仅提供简单的离线(三方)支付,针对单一店铺(不支持多店铺)。如果您需要更多功能,请随时贡献或寻求支持。
架构
该库基于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
事件。您可以编写您需要的处理逻辑。
最终说明
如果您有任何问题,请随时创建一个问题。任何改进或进一步的功能都非常受欢迎,请随时发起拉取请求。