PAYATHON 2026

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 的完整接入规范。

备注:内容仅供参考。