Magento 2 成功页如何正确添加 TrustedShops 追踪?
结论
这段代码可供参考字段组织方式,但不适合直接放进 Magento 模板。它在模板中通过 ObjectManager 加载订单,并把 $block->getOrderId() 当作 increment ID 使用,这两处都需要调整或核实。建议在模块的 Block 或 ViewModel 中准备订单及所需字段,再由模板输出。写入 HTML 的值也应进行转义。
先确认订单标识
代码将 $block->getOrderId() 保存到 $incrId,随后传给 loadByIncrementId()。变量名不能说明它实际返回的是订单 increment ID。Magento 的订单实体 ID 和 increment ID 是两种不同标识,使用前应确认当前成功页提供的是哪一种。标识不匹配时,可能查不到订单,也可能加载到错误的记录。
应在服务层使用已确认的标识读取订单,并验证订单对象是否有效。不要只凭请求参数或用户可控的值加载订单。成功页只应输出当前结账流程中已确认的订单信息。
将读取逻辑移出模板
Magento 不建议在模板中直接调用 ObjectManager。订单读取、付款信息获取和商品数据整理应放在 Block 或 ViewModel 中,通过依赖注入获取所需服务,再将结果传给 .phtml 模板。这样更便于测试,也能集中处理订单不存在、商品数据缺失等情况。
模板只负责呈现 TrustedShops 所需字段。下面的片段展示了输出时的转义方式,假设 $order 和 $imageHelper 已由页面逻辑准备好:
<div id="trustedShopsCheckout" style="display: none;">
<span id="tsCheckoutOrderNr"><?= $escaper->escapeHtml($order->getIncrementId()) ?></span>
<span id="tsCheckoutBuyerEmail"><?= $escaper->escapeHtml($order->getCustomerEmail()) ?></span>
<span id="tsCheckoutOrderAmount"><?= $escaper->escapeHtml((string) $order->getGrandTotal()) ?></span>
<span id="tsCheckoutOrderCurrency"><?= $escaper->escapeHtml($order->getStoreCurrencyCode()) ?></span>
<span id="tsCheckoutOrderPaymentType"><?= $escaper->escapeHtml($order->getPayment()->getMethod()) ?></span>
<?php foreach ($order->getAllVisibleItems() as $item): ?>
<?php $product = $item->getProduct(); ?>
<?php if (!$product) { continue; } ?>
<?php $imageUrl = $imageHelper->init($product, 'product_page_image_small')->getUrl(); ?>
<span class="tsCheckoutProductItem">
<span class="tsCheckoutProductUrl"><?= $escaper->escapeUrl($product->getProductUrl()) ?></span>
<span class="tsCheckoutProductImageUrl"><?= $escaper->escapeUrl($imageUrl) ?></span>
<span class="tsCheckoutProductName"><?= $escaper->escapeHtml($item->getName()) ?></span>
<span class="tsCheckoutProductSKU"><?= $escaper->escapeHtml($item->getSku()) ?></span>
</span>
<?php endforeach; ?>
</div>
这段代码只是模板片段,并非完整的模块接入代码。实际项目中,应由通过依赖注入获取服务的 Block 或 ViewModel 提供 $order 和图片 helper。若使用其他订单标识或已有 TrustedShops 扩展,也应按相应实现调整。
核对传递的数据
- 商品循环:原代码遍历
getAllVisibleItems()后又检查getParentItemId()。应结合实际商品类型和 TrustedShops 对商品条目的要求,确认是否需要这项检查,避免漏报或重复商品。 - 金额和货币:原代码读取
getGrandTotal()和getStoreCurrencyCode()。应确认金额格式、货币来源及小数位符合当前 TrustedShops 接入要求,并按接口要求提供数值格式。 - 付款方式:
getMethod()返回 Magento 中的付款方式代码。应确认 TrustedShops 接收该代码,还是要求映射为其他值。 - 商品 URL 和图片:商品可能不可用,也可能没有可生成的 URL 或图片。应处理空值,并按接入要求提供可访问的地址。
- HTML 输出:邮箱、商品名称、SKU 等文本应使用 HTML 转义,URL 应使用 URL 转义。不要直接输出数据库中的值。
- 页面展示:隐藏容器只会隐藏页面内容,不会验证字段格式、访问权限或数据是否正确。
接入后,应使用测试订单检查最终 HTML 中的字段值,并按照 TrustedShops 对订单号、金额、付款方式和商品条目的具体要求核对格式。仅凭题目中的代码,无法确认这些字段已符合 TrustedShops 的完整接入规范。
备注:内容仅供参考。
