digital-pros / commerce-authorize
Craft Commerce 4的Authorize.net支付网关插件
Requires
- authorizenet/authorizenet: ~2.0.1
- craftcms/cms: ^5.0.0
- craftcms/commerce: ^5.0.0
- craftcms/commerce-omnipay: ^4.0.0
- omnipay/authorizenet: ^3.0.0
README
Craft Commerce的Authorize.net
此网关使用thephpleague/omnipay-authorizenet Authorize.net驱动程序,并将更新Craft Commerce 1中的Authorize.net AIM网关。
要求
- Craft 5(或更高版本)
- Craft Commerce 5
注意 Craft Commerce 4已更改支付字段的名称和ID属性,包括支付处理程序(请参阅下面的代码示例)。使用默认表单的网站将自动更新,但使用自定义表单的支付表单需要更新。在更新到此版本后,请通过每个Authorize.net网关进行测试交易。遇到问题?请提出问题或通过hello@digitalpros.co联系我们。
此网关是Craft 5的商业插件,可以使用Craft插件商店安装,或通过更新composer.json文件以要求此网关进行安装。
composer require digital-pros/commerce-authorize
使用网关
安装网关后,默认表单字段将向Authorize.net提交交易。
默认支付表单
在网关设置中启用后,将使用默认支付表单。当需要其他定制时,应使用下面的自定义表单。当此切换按钮启用时,以下代码行将渲染支付表单。
{{ cart.gateway.getPaymentFormHtml({}) }}
自定义支付表单
下面的示例已简化以供说明。
<label>Card Holder</label>
<input name="paymentForm[gatewayHandleGoesHere][firstName]" placeholder="First Name" required="required" type="text">
<input name="paymentForm[gatewayHandleGoesHere][lastName]" placeholder="Last Name" required="required" type="text">
<label>Card Number</label>
<input id="paymentForm-gatewayHandleGoesHere-number" name="paymentForm[gatewayHandleGoesHere][number]" placeholder="Card Number" required="required" type="text">
<label>Card Expiration Date</label>
<select id="paymentForm-gatewayHandleGoesHere-month" name="paymentForm[gatewayHandleGoesHere][month]"><option value="12">12</option>...</select>
<select id="paymentForm-gatewayHandleGoesHere-year" name="paymentForm[gatewayHandleGoesHere][year]"><option value="2019">2019</option>...</select>
<label>CVV/CVV2</label>
<input id="paymentForm-gatewayHandleGoesHere-cvv" name="paymentForm[gatewayHandleGoesHere][cvv]" placeholder="CVV" required="required" type="text">
{{ cart.gateway.getPaymentFormHtml({})|raw }}
<button id="paymentForm-gatewayHandleGoesHere-submit" name="paymentForm[gatewayHandleGoesHere][submit]">Pay Now</button>
Accept.js
如果插件设置中启用了Accept.js,网关将要求两个隐藏字段(token和tokenDescriptor),这些字段在卡片验证后发送回Authorize.net。Accept.js还需要调整提交按钮,以便只有当卡片通过Accept.js验证后,支付表单才会提交。只要两个隐藏字段由Accept.js定义并填充,则不需要信用卡详细信息。
自定义Accept.js支付表单
当使用下面所示的自定义Accept.js表单时,支付表单必须有一个id为paymentForm,以便可以将支付详情发送到Authorize.net以创建令牌。(即<form id='paymentForm'></form>)
如果sendPaymentDataToAnet()包含一个true参数,则sendPaymentDataToAnet(true)在创建令牌后但提交表单到服务器进行处理之前,将从信用卡字段中删除卡片数据。对于上面的默认表单,此选项在网关设置中指定。
<label>Card Holder</label>
<input name="paymentForm[gatewayHandleGoesHere][firstName]" placeholder="First Name" required="required" type="text">
<input name="paymentForm[gatewayHandleGoesHere][lastName]" placeholder="Last Name" required="required" type="text">
<label>Card Number</label>
<input id="paymentForm-gatewayHandleGoesHere-number" name="paymentForm[gatewayHandleGoesHere][number]" placeholder="Card Number" required="required" type="text">
<label>Card Expiration Date</label>
<select id="paymentForm-gatewayHandleGoesHere-month" name="paymentForm[testingGateway][month]"><option value="12">12</option>...</select>
<select id="paymentForm-gatewayHandleGoesHere-year" name="paymentForm[gatewayHandleGoesHere][year]"><option value="2019">2019</option>...</select>
<label>CVV/CVV2</label>
<input id="paymentForm-gatewayHandleGoesHere-cvv" name="paymentForm[gatewayHandleGoesHere][cvv]" placeholder="CVV" required="required" type="text">
<!-- Required fields and changes for Authorize.net Accept.js -->
<input id="paymentForm-gatewayHandleGoesHere-token" name="paymentForm[gatewayHandleGoesHere][token]" type="hidden">
<input id="paymentForm-gatewayHandleGoesHere-tokenDescriptor" name="paymentForm[gatewayHandleGoesHere][tokenDescriptor]" type="hidden">
{{ cart.gateway.getPaymentFormHtml({})|raw }}
<button id="authorizeSubmit" name="authorizeSubmit" onclick="event.preventDefault(); sendPaymentDataToAnet(true);">Pay Now</button>
退货和退款
此网关支持在Authorize.net中交易成功结算后进行部分退款和全额退款。在插件设置中,如果退款失败,可以选择取消交易,但如果退款失败,则将完全取消交易。
保存的支付来源
使用Authorize.net客户信息管理器(CIM)保存支付来源。在启用此功能之前,必须在Authorize.net内部启用CIM。在网关设置中启用存储的支付来源后,数据库中只保存信用卡的最后四位数字,以便以后可以识别卡片(如果未启用Accept.js)。
信用卡将被添加到/从Authorize.net客户信息管理器中的客户配置文件中。如果启用了Accept.js,将为每个存储的支付来源创建一个单独的配置文件。当卡片被移除时,客户配置文件不会被从Authorize.net中删除。
当启用Accept.js时,Craft Commerce不会处理信用卡号,而是仅传递一个用于处理的令牌。这项安全措施限制了支付来源在支付来源上显示卡号的最后四位。为了保存具有自定义名称的支付来源,可以在支付表格中添加一个描述字段。这可能会是一个隐藏字段,在提交表格之前只能输入卡号的最后四位。
<input id="paymentForm-gatewayHandleGoesHere-description" name="paymentForm[gatewayHandleGoesHere][description]" placeholder="Card Name" />
⚠ 警告:如果支付来源已保存后禁用此功能,当客户尝试使用或修改支付来源时将引发错误。 您可能需要在禁用此功能之前运行数据库备份并手动清除支付来源数据库表。
订阅
从版本1.5开始,我们已将新的订阅网关添加到本Authorize.net插件中。由于Authorize.net不提供订阅计划,此功能是通过使用Authorize.net CIM和定期收费来实现的。这种实现确实需要一个单独的网关,但两个网关可以在同一Commerce安装中同时运行。订阅网关不能用于常规交易或退款,它只能在Craft Commerce订阅中使用。您可能希望在结账过程中排除此网关的已保存支付方式。
考虑到这些,您需要先在网关设置中设置所有“计划”,然后再在Craft Commerce订阅计划设置区域中引用这些计划。计划可以设置为按日或按月收费,每次计费周期之间至少有7天或1个月。您可以提供可调整的(或免费)试用期,甚至可以调整首次计费日期(这将延长试用期)。
当从前端指定试用期长度时,请确保指定周期长度(与网关中的计划设置匹配)而不是天数。插件会自动将月份转换为天数,并根据需要添加从延长开始日期计算出的额外天数。
由于Authorize.net CIM需要额外的计费字段,因此根据您的Authorize.net设置,可能需要一些额外的必填字段。所有这些字段都在默认表格中可用,但可以将其移动到隐藏字段,如果您希望从客户档案中获取此信息。
您需要在您的Authorize.net账户中设置webhooks,以便Authorize.net能够正确计算下一次计费日期并在不再有效时取消订阅。网关设置中还需要一个有效的签名密钥,以验证调用来自Authorize.net。您需要订阅所有订阅事件,以及所有支付事件(除了欺诈(x3)和priorAuthCapture.created事件)。
注意:在创建CIM联系人时,Authorize.net需要15秒的延迟,因此您可能希望在界面中构建一个等待指示器。
CraftCMS默认存储模板在Craft Commerce存储库中不包括具有订阅的支付表格,因为Stripe仅支持一种支付方式(每个客户的默认支付方式),但您需要使用以下模板代码将支付表格添加到您的订阅(Craft Commerce 4.6.2或更高版本)
{% namespace plan.getGateway().handle|commercePaymentFormNamespace %}
{{ plan.getGateway().getPaymentFormHtml({})|raw }}
{% endnamespace %}
我们已启用存储库中的讨论区域以收集有关一般订阅反馈的反馈,但如果您对新的订阅功能有任何疑问,或在测试过程中发现错误,请通过打开问题或在hello@digitalpros.co给我们发邮件来告知我们。
发送自定义发票号和描述(仅限标准网关)
如果您想在常规支付中发送自定义订单号和描述,您现在可以使用以下自定义事件在您的自定义插件中。
use digitalpros\commerce\authorize\events\AuthorizePaymentEvent;
use digitalpros\commerce\authorize\gateways\Gateway;
Event::on(
Gateway::class,
Gateway::EVENT_BEFORE_AUTHORIZE_PAYMENT,
function(AuthorizePaymentEvent $event) {
// @model Transaction $transaction
$transaction = $event->transaction;
// @var string $invoiceNumber
$invoiceNumber = $event->invoiceNumber;
// @var string $description
$description = $event->description;
// @element Order $order
$order = $event->transaction->order;
// Update the Invoice Number and Description
$event->invoiceNumber = $event->transaction->order->shortNumber; // 20 Characters Max
$event->description = "Custom Order Description"; // 255 Characters Max
}
);
支持
有问题吗?请随时打开问题,或在hello@digitalpros.co给我们发邮件。
