pimcore / payment-provider-hobex
Pimcore 支付提供商 - Hobex
v2.0.0
2024-04-29 11:44 UTC
Requires
- pimcore/ecommerce-framework-bundle: ^1.0
- pimcore/pimcore: ^11.0
Requires (Dev)
- phpstan/phpstan: ^1.9
README
官方 Hobex 文档
需求
Hobex 不需要额外的 PHP-SDK。您只需要从您的集成合作伙伴那里获取一个测试账户。
安装
使用 composer 安装最新版本
composer require pimcore/payment-provider-hobex
通过控制台或 Pimcore 后端中的扩展管理器启用插件
php bin/console pimcore:bundle:enable PimcorePaymentProviderHobexBundle php bin/console pimcore:bundle:install PimcorePaymentProviderHobexBundle
配置
支付管理器负责实现不同的支付提供商,以将它们集成到框架中。
有关支付管理器的更多信息,请参阅支付管理器文档。
在配置文件 pimcore_ecommerce_config.payment_manager
中配置支付提供商
pimcore_ecommerce_framework: # ... # add hobex to the set of active payment providers payment_manager: providers: hobex_testprovider: provider_id: Pimcore\Bundle\EcommerceFrameworkBundle\PaymentManager\Payment\Hobex profile: sandbox profiles: sandbox: entityId: '8a829418530df1d201531299e097175c' authorizationBearer: 'OGE4Mjk0MTg1MzBkZjFkMjAxNTMxMjk5ZTJjMTE3YWF8ZzJnU3BnS2hLUw==' testSystem: true payment_methods: - VISA - MASTER - SOFORTUEBERWEISUNG - SEPA # ... # configure the payment provider in the checkout manager checkout_manager: tenants: _defaults: payment: provider: hobex_testprovider default: ~
支付信息:订单支付部分 "支付信息" 存储了客户每次支付尝试的信息。
在 "PaymentInfo" 字段集中添加额外的字段,以便订单管理器在订单对象中存储信息:
Hobex 与 Pimcore 10 兼容,因此对于 Pimcore 6,您可能需要在您的 config.yml 中添加以下行
- { resource: '@PimcoreEcommerceFrameworkBundle/Resources/config/v7_configurations.yml' }
实现
CheckoutController.php
/** * Payment step of the checkout. * This is where the payment widget is initialized and displayed. * @Route("/checkout/payment") * @param Request $request */ public function payment(Request $request, Factory $factory) { $cartManager = $factory->getCartManager(); $orderManager = $factory->getOrderManager(); $cart = $cartManager->getCartByName('cart'); $checkoutManager = Factory::getInstance()->getCheckoutManager($cart); $order = $orderManager->getOrCreateOrderFromCart($cart); $requestConfig = new HobexRequest(); $requestConfig ->setShopperResultUrl($this->generateUrl('app_webshop_payment_result')) ->setLocale('de') ; /** @var SnippetResponse $paymentInitResponse */ $paymentInitResponse = $checkoutManager->startOrderPaymentWithPaymentProvider($requestConfig); return $this->renderTemplate('Webshop/Checkout/payment.html.twig', [ 'cart' => $cart, 'order' => $order, 'renderedForm' => $paymentInitResponse->getSnippet() ]); } /** * Final step of the example payment checkout. * This is called then the payment succeeded and the order got confirmed. * @Route("/checkout/success") * @param Request $request */ public function success(Request $request) { // needs some implementation. Typically a success page is rendered. }
app/Resources/views/Webshop/Checkout/payment.html.twig
{% extends ':Layout:default.html.twig' %} {% block content %} <div class="container" style="margin-top:2em"> <div class="row"> <div class="col-md-12"> <h1>💰 Example Checkout / Payment</h1> <hr/> <h5>Order:</h5> <ul> <li>ID: {{ order.id }}</li> <li>Number: {{ order.ordernumber }}</li> </ul> <hr/> {{ #payment widget: }} {{ renderedForm | raw }} <hr/> <a class="btn btn-info" href="{{ path('app_webshop_cart_list') }}">⏎ Back To Cart</a> </div> </div> </div> {% endblock %}
PaymentController
/** * In the payment controller the response from Hobex payments is handled. * This action is typically called when the payment succeeded. * @Route("/checkout/payment/result") * @param Request $request */ public function result(Request $request, Factory $factory) { $cartManager = $factory->getCartManager(); $orderManager = $factory->getOrderManager(); $paymentProvider = Factory::getInstance()->getPaymentManager()->getProvider("hobex_testprovider"); $order = Factory::getInstance()->getCommitOrderProcessor()->handlePaymentResponseAndCommitOrderPayment( $request->query->all(), $paymentProvider ); if ($order->getOrderState() == AbstractOrder::ORDER_STATE_COMMITTED) { return $this->redirectToRoute('app_webshop_checkout_success'); } else { $errorMessage = 'Something wrent wrong with the payment: '.$order->getLastPaymentInfo()->getMessage()); // error handling ... return $this->redirectToRoute('app_webshop_checkout_step1'); } }
实现
请参阅 https://hobex.docs.oppwa.com/tutorials/webhooks/configuration
如果您想使用 webhooks,则必须配置 webhook 密钥
pimcore_ecommerce_framework: # ... # add hobex to the set of active payment providers payment_manager: providers: hobex_testprovider: provider_id: Pimcore\Bundle\EcommerceFrameworkBundle\PaymentManager\Payment\Hobex profile: sandbox profiles: sandbox: entityId: '8a829418530df1d201531299e097175c' authorizationBearer: 'OGE4Mjk0MTg1MzBkZjFkMjAxNTMxMjk5ZTJjMTE3YWF8ZzJnU3BnS2hLUw==' # optional: if you configured webhook, you need to configure the secret here webhookSecret: '353FADF1340CA4AFA7052AD8BAAEA788E177C9D9CFC8271294F53CA83F4DB4AD' testSystem: true payment_methods: - VISA - MASTER - SOFORTUEBERWEISUNG - SEPA
处理 webhook 响应的控制器/操作示例
PaymentController
/** * In the payment controller the webhook response from Hobex payments is handled. * @Route("/checkout/payment/webhook") * @param Request $request */ public function webhookAction(Request $request){ $paymentProvider = Factory::getInstance()->getPaymentManager()->getProvider("hobex_testprovider"); $order = Factory::getInstance()->getCommitOrderProcessor()->handlePaymentResponseAndCommitOrderPayment( ['base64Content' => $request->getContent(), 'authTag' => $request->headers->get('x-authentication-tag'), 'initVector' => $request->headers->get('x-initialization-vector')], $paymentProvider ); return new Response('ok',200); }