You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Magento 2 API生成PayPal Braintree客户端令牌?

在Magento 2中生成PayPal Braintree客户端令牌的实现方法

我来分享两种实用的实现方式,帮你搞定这个需求:

方法一:后端服务/模板中调用内置生成逻辑

Magento 2的Braintree模块已经封装好了生成客户端令牌的核心服务,我们可以直接通过依赖注入调用,适合后端生成后传递给前端页面的场景。

步骤1:创建Helper类封装令牌生成逻辑

<?php
namespace Vendor\YourModule\Helper;

use Magento\Braintree\Model\Adapter\BraintreeAdapterFactory;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\Exception\LocalizedException;

class BraintreeTokenHelper extends AbstractHelper
{
    private $braintreeAdapterFactory;

    public function __construct(
        Context $context,
        BraintreeAdapterFactory $braintreeAdapterFactory
    ) {
        parent::__construct($context);
        $this->braintreeAdapterFactory = $braintreeAdapterFactory;
    }

    /**
     * 生成Braintree客户端令牌,支持关联特定客户ID
     *
     * @param string|null $customerId 可选,关联已登录客户的ID
     * @return string
     * @throws LocalizedException
     */
    public function generateClientToken(?string $customerId = null)
    {
        try {
            $adapter = $this->braintreeAdapterFactory->create();
            $options = $customerId ? ['customerId' => $customerId] : [];
            return $adapter->generateClientToken($options);
        } catch (\Exception $e) {
            throw new LocalizedException(__('生成Braintree客户端令牌失败:%1', $e->getMessage()));
        }
    }
}

步骤2:在Block中调用并传递到前端

在支付页面的Block中注入Helper,暴露方法给模板使用:

<?php
namespace Vendor\YourModule\Block;

use Magento\Framework\View\Element\Template;
use Vendor\YourModule\Helper\BraintreeTokenHelper;
use Magento\Customer\Model\Session as CustomerSession;

class PaymentBlock extends Template
{
    private $tokenHelper;
    private $customerSession;

    public function __construct(
        Template\Context $context,
        BraintreeTokenHelper $tokenHelper,
        CustomerSession $customerSession,
        array $data = []
    ) {
        parent::__construct($context, $data);
        $this->tokenHelper = $tokenHelper;
        $this->customerSession = $customerSession;
    }

    /**
     * 获取当前用户的Braintree令牌(登录用户自动关联ID)
     *
     * @return string
     */
    public function getBraintreeClientToken()
    {
        $customerId = $this->customerSession->isLoggedIn() ? $this->customerSession->getCustomerId() : null;
        return $this->tokenHelper->generateClientToken($customerId);
    }
}

步骤3:在模板中安全输出令牌供JS使用

<script type="text/javascript">
    // 用escapeJs避免XSS风险
    const braintreeClientToken = '<?= $block->escapeJs($block->getBraintreeClientToken()) ?>';
    
    // 后续可通过这个令牌初始化Braintree SDK
    // braintree.client.create({ authorization: braintreeClientToken }, function(err, clientInstance) { ... });
</script>

方法二:创建自定义REST API端点供前端直接调用

如果前端需要通过AJAX独立获取令牌,可以搭建一个自定义API接口,支持匿名或客户权限访问。

步骤1:定义API接口

<?php
namespace Vendor\YourModule\Api;

interface BraintreeTokenApiInterface
{
    /**
     * 获取Braintree客户端令牌
     *
     * @param string|null $customerId 可选,关联客户ID
     * @return string
     */
    public function getClientToken(?string $customerId = null);
}

步骤2:实现API接口逻辑

<?php
namespace Vendor\YourModule\Model;

use Vendor\YourModule\Api\BraintreeTokenApiInterface;
use Magento\Braintree\Model\Adapter\BraintreeAdapterFactory;
use Magento\Framework\Exception\LocalizedException;

class BraintreeTokenApi implements BraintreeTokenApiInterface
{
    private $braintreeAdapterFactory;

    public function __construct(BraintreeAdapterFactory $braintreeAdapterFactory)
    {
        $this->braintreeAdapterFactory = $braintreeAdapterFactory;
    }

    /**
     * @inheritDoc
     */
    public function getClientToken(?string $customerId = null)
    {
        try {
            $adapter = $this->braintreeAdapterFactory->create();
            $options = $customerId ? ['customerId' => $customerId] : [];
            return $adapter->generateClientToken($options);
        } catch (\Exception $e) {
            throw new LocalizedException(__('无法获取Braintree客户端令牌:%1', $e->getMessage()));
        }
    }
}

步骤3:配置API路由和依赖

etc/di.xml中绑定接口与实现:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Vendor\YourModule\Api\BraintreeTokenApiInterface" type="Vendor\YourModule\Model\BraintreeTokenApi" />
</config>

etc/webapi.xml中配置API路由和权限:

<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/braintree/get-client-token" method="GET">
        <service class="Vendor\YourModule\Api\BraintreeTokenApiInterface" method="getClientToken"/>
        <resources>
            <!-- 根据需求修改权限,比如改为customer或admin -->
            <resource ref="anonymous"/>
        </resources>
        <parameters>
            <parameter name="customerId" force="true">%customer_id%</parameter>
        </parameters>
    </route>
</routes>

步骤4:前端调用示例

fetch('/rest/V1/braintree/get-client-token', {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    }
})
.then(response => response.json())
.then(token => {
    // 使用令牌初始化Braintree SDK
    braintree.client.create({ authorization: token }, function(err, clientInstance) {
        if (err) {
            console.error('初始化Braintree失败:', err);
            return;
        }
        // 后续操作:加载支付方式UI等
    });
})
.catch(error => console.error('获取令牌失败:', error));

关键注意事项

  • 确保后台已正确配置PayPal Braintree:检查环境(沙盒/生产)、API密钥、商户ID等信息,配置错误会直接导致令牌生成失败
  • 关联客户ID的令牌可提升支付安全性,建议对已登录用户使用关联令牌
  • 务必处理异常情况,避免前端因令牌生成失败出现白屏或无提示报错

内容的提问来源于stack exchange,提问作者shivashankar m

火山引擎 最新活动