wartw / module-sample-payment-gateway
演示与支付网关的集成
Requires
- php: ~5.5.0|~5.6.0|~7.0.0
- magento/framework: *
- magento/magento-composer-installer: *
- magento/module-checkout: *
- magento/module-payment: *
- magento/module-sales: *
This package is not auto-updated.
Last update: 2024-09-23 21:37:49 UTC
README
在Magento 2平台上创建支付方式证明,当您的商店基于Magento 2平台时,管理员有权利生成所需数量的支付方式,这是电子商务架构的一个伟大时代。根据客户的需求,您可能会将其添加到现有支付方式列表中。额外的支付方式无疑为顾客在您的网站上结账时提供了更多的选择。另一方面,多种支付方式是拓展全球市场的伟大策略。
在教程中,您将学习如何在Magento 2商店中创建自己的支付网关集成。在启动新的支付方式后,您可以根据路径 管理员面板 > 商店 > 设置 > 配置 > 销售 > 支付方式
查找并配置它。在那里,管理员可能会将支付方式分配给特定的运输方式,这意味着它们在启用时将成对工作。
步骤 1:创建支付方法模块
- 创建文件 registration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Mageplaza_Payment', __DIR__ );
- 声明
module.xml
文件
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Mageplaza_Payment" setup_version="0.1.0"> <sequence> <module name="Magento_Sales"/> <module name="Magento_Payment"/> <module name="Magento_Checkout"/> <module name="Magento_Directory" /> <module name="Magento_Config" /> </sequence> </module> </config>
此模块必须在 Magento_Sales、Magento_Payment、Magento_Checkout、Magento_Directory 和 Magento_Config 之后运行。因此,我们像上面的代码块一样添加了依赖项(顺序)。
步骤 2:声明支付方法模块
- 现在我们在
etc
文件夹中创建文件payment.xml
文件 etc/payment.xml
<?xml version="1.0" ?> <payment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Payment:etc/payment.xsd"> <groups> <group id="offline"> <label>Offline Payment Methods</label> </group> </groups> <methods> <method name="simple"> <allow_multiple_address>1</allow_multiple_address> </method> </methods> </payment>
- 在
etc
文件夹中创建config.xml
文件。
<?xml version="1.0" ?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd"> <default> <payment> <simple> <active>1</active> <model>Mageplaza\Payment\Model\Payment\Simple</model> <order_status>pending</order_status> <title>Simple</title> <allowspecific>0</allowspecific> <group>Offline</group> </simple> </payment> </default> </config>
在此文件中,我们声明了此支付方式的模型,我们称之为 Simple
模型。
- 创建 Simple 模型文件
<?php namespace Mageplaza\Payment\Model\Payment; class Simple extends \Magento\Payment\Model\Method\Cc { protected $_isGateway = true; protected $_canCapture = true; protected $_canCapturePartial = true; protected $_canRefund = true; protected $_canRefundInvoicePartial = true; protected $_stripeApi = false; protected $_countryFactory; protected $_minAmount = null; protected $_maxAmount = null; protected $_supportedCurrencyCodes = array('USD'); protected $_debugReplacePrivateDataKeys = ['number', 'exp_month', 'exp_year', 'cvc']; public function __construct(\Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory, \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory, \Magento\Payment\Helper\Data $paymentData, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Payment\Model\Method\Logger $logger, \Magento\Framework\Module\ModuleListInterface $moduleList, \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, \Magento\Directory\Model\CountryFactory $countryFactory, array $data = array() ) { parent::__construct( $context, $registry, $extensionFactory, $customAttributeFactory, $paymentData, $scopeConfig, $logger, $moduleList, $localeDate, null, null, $data ); $this->_countryFactory = $countryFactory; $this->_minAmount = $this->getConfigData('min_order_total'); $this->_maxAmount = $this->getConfigData('max_order_total'); } /** * Authorize payment abstract method * * @param \Magento\Framework\DataObject|InfoInterface $payment * @param float $amount * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function authorize(\Magento\Payment\Model\InfoInterface $payment, $amount) { if (!$this->canAuthorize()) { throw new \Magento\Framework\Exception\LocalizedException(__('The authorize action is not available.')); } return $this; } /** * Capture payment abstract method * * @param \Magento\Framework\DataObject|InfoInterface $payment * @param float $amount * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function capture(\Magento\Payment\Model\InfoInterface $payment, $amount) { if (!$this->canCapture()) { throw new \Magento\Framework\Exception\LocalizedException(__('The capture action is not available.')); } return $this; } /** * Refund specified amount for payment * * @param \Magento\Framework\DataObject|InfoInterface $payment * @param float $amount * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function refund(\Magento\Payment\Model\InfoInterface $payment, $amount) { if (!$this->canRefund()) { throw new \Magento\Framework\Exception\LocalizedException(__('The refund action is not available.')); } return $this; } }
此模型包括基本功能,例如
authorize()
:授权支付,例如:卡capture()
:从客户处取款refund()
:向客户退款。
步骤 3:在结账页面上显示支付方式
在前面的步骤中,我们讨论了声明模块、配置和模型文件。现在我们需要在结账页面上显示此 Simple 支付方式。
<?xml version="1.0" ?> <pagepage layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.root"> <arguments> <argument name="jsLayout" xsi:type="array"> <item name="components" xsi:type="array"> <item name="checkout" xsi:type="array"> <item name="children" xsi:type="array"> <item name="steps" xsi:type="array"> <item name="children" xsi:type="array"> <item name="billing-step" xsi:type="array"> <item name="children" xsi:type="array"> <item name="payment" xsi:type="array"> <item name="children" xsi:type="array"> <item name="renders" xsi:type="array"> <item name="children" xsi:type="array"> <item name="offline-payments" xsi:type="array"> <item name="component" xsi:type="string">Magento_OfflinePayments/js/view/payment/offline-payments</item> <item name="methods" xsi:type="array"> <item name="simple" xsi:type="array"> <item name="isBillingAddressRequired" xsi:type="boolean">true</item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </argument> </arguments> </referenceBlock> </body> </pagepage>
- 创建 js 文件以在结账页面上加载 KO 模板
define( [ 'uiComponent', 'Magento_Checkout/js/model/payment/renderer-list' ], function (Component, rendererList) { 'use strict'; rendererList.push( { type: 'simple', component: 'Mageplaza_Payment/js/view/payment/method-renderer/simple-method' } ); return Component.extend({}); } );
在此文件中,它调用另一个组件:js/view/payment/method-renderer/simple-method
现在我们需要创建 /view/frontend/web/js/view/payment/method-renderer/simple-method.js
define( [ 'Magento_Checkout/js/view/payment/default' ], function (Component) { 'use strict'; return Component.extend({ defaults: { template: 'Mageplaza_Payment/payment/simple' }, getMailingAddress: function () { return window.checkoutConfig.payment.checkmo.mailingAddress; }, }); } );
- 最后,创建 KO 模板文件 /view/frontend/web/template/payment/simple.html
<div class="payment-method" data-bind="css: {'_active': (getCode() == isChecked())}"> <div class="payment-method-title field choice"> <input type="radio" name="payment[method]" class="radio" data-bind="attr: {'id': getCode()}, value: getCode(), checked: isChecked, click: selectPaymentMethod, visible: isRadioButtonVisible()"/> <label data-bind="attr: {'for': getCode()}" class="label"><span data-bind="text: getTitle()"></span></label> </div> <div class="payment-method-content"> <!-- ko foreach: getRegion('messages') --> <!-- ko template: getTemplate() --><!-- /ko --> <!--/ko--> <div class="payment-method-billing-address"> <!-- ko foreach: $parent.getRegion(getBillingAddressFormName()) --> <!-- ko template: getTemplate() --><!-- /ko --> <!--/ko--> </div> <div class="checkout-agreements-block"> <!-- ko foreach: $parent.getRegion('before-place-order') --> <!-- ko template: getTemplate() --><!-- /ko --> <!--/ko--> </div> <div class="actions-toolbar"> <div class="primary"> <button class="action primary checkout" type="submit" data-bind=" click: placeOrder, attr: {title: $t('Place Order')}, css: {disabled: !isPlaceOrderActionAllowed()}, enable: (getCode() == isChecked()) " disabled> <span data-bind="i18n: 'Place Order'"></span> </button> </div> </div> </div> </div>
您可能还对 创建 Magento 2 运输方式感兴趣,以自定义期望的运输方式。