You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP网站集成Heartland支付系统Apple Pay遇问题求助

Heartland Apple Pay 集成问题修复方案

一、Safari语法错误排查与修复

  • 检查客户端Apple Pay初始化代码的语法兼容性:
    • Safari对ES6+语法有特定支持限制,若目标用户包含低版本Safari用户,需将const/let转译为ES5,避免使用:has()等Safari不支持的CSS选择器
    • 确保Apple Pay按钮的DOM选择器逻辑正确,避免在DOM未加载完成时执行初始化代码
    • 修正后的客户端初始化代码示例:
      document.addEventListener('DOMContentLoaded', function() {
        if (window.ApplePaySession) {
          var merchantIdentifier = 'merchant.com.your-domain';
          if (ApplePaySession.canMakePaymentsWithActiveCard(merchantIdentifier)) {
            var button = document.getElementById('apple-pay-button');
            button.addEventListener('click', startApplePaySession);
          }
        }
      });
      
      function startApplePaySession() {
        var session = new ApplePaySession(3, {
          countryCode: 'US',
          currencyCode: 'USD',
          merchantCapabilities: ['supports3DS'],
          supportedNetworks: ['visa', 'masterCard'],
          total: { label: 'Your Store', amount: '10.00' }
        });
      
        session.onvalidatemerchant = function(event) {
          fetch('/apple-pay/validate-merchant.php', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ validationURL: event.validationURL })
          })
          .then(function(response) { return response.json(); })
          .then(function(merchantSession) { session.completeMerchantValidation(merchantSession); })
          .catch(function() { session.abort(); });
        };
      
        session.onpaymentauthorized = function(event) {
          fetch('/apple-pay/process-token.php', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ paymentToken: event.payment.token })
          })
          .then(function(response) { return response.json(); })
          .then(function(result) {
            if (result.success) {
              session.completePayment(ApplePaySession.STATUS_SUCCESS);
            } else {
              session.completePayment(ApplePaySession.STATUS_FAILURE);
            }
          })
          .catch(function() { session.completePayment(ApplePaySession.STATUS_FAILURE); });
        };
      
        session.begin();
      }
      
    • 同域名下的fetch请求需确保接口路径正确,跨域场景需配置服务器CORS响应头(允许Safari的Apple Pay域名来源)

二、服务器连接异常修复(商户验证与令牌处理)

1. 商户验证文件(validate-merchant.php)修正要点

  • 避免手动构造请求,直接调用Heartland SDK生成商户会话,防止签名或参数错误
  • 修正后的示例代码:
    <?php
    require_once 'path/to/heartland-sdk/autoload.php';
    
    use Heartland\PaymentServices;
    
    $config = [
      'public_key' => 'YOUR_HEARTLAND_PUBLIC_KEY',
      'secret_key' => 'YOUR_HEARTLAND_SECRET_KEY',
      'environment' => 'sandbox' // 测试用sandbox,上线切换为production
    ];
    
    $paymentServices = new PaymentServices($config);
    $postData = json_decode(file_get_contents('php://input'), true);
    $validationURL = $postData['validationURL'];
    
    try {
      $merchantSession = $paymentServices->applePay()->getMerchantSession($validationURL);
      echo json_encode($merchantSession);
    } catch (Exception $e) {
      http_response_code(500);
      echo json_encode(['error' => $e->getMessage()]);
    }
    ?>
    
  • 检查服务器防火墙是否放行Apple Pay验证域名(https://apple-pay-gateway.apple.com),确保出站请求能正常访问该地址

2. 支付令牌处理文件(process-token.php)修正要点

  • 正确解析Apple Pay令牌结构,按Heartland要求传递参数
  • 修正后的示例代码:
    <?php
    require_once 'path/to/heartland-sdk/autoload.php';
    
    use Heartland\PaymentServices;
    
    $config = [
      'public_key' => 'YOUR_HEARTLAND_PUBLIC_KEY',
      'secret_key' => 'YOUR_HEARTLAND_SECRET_KEY',
      'environment' => 'sandbox'
    ];
    
    $paymentServices = new PaymentServices($config);
    $postData = json_decode(file_get_contents('php://input'), true);
    $paymentToken = $postData['paymentToken'];
    
    try {
      $chargeRequest = [
        'amount' => '10.00',
        'currency' => 'USD',
        'payment_method' => [
          'type' => 'apple_pay',
          'token' => $paymentToken['paymentData']
        ]
      ];
    
      $response = $paymentServices->charges()->create($chargeRequest);
    
      if ($response['success']) {
        echo json_encode(['success' => true, 'transaction_id' => $response['transaction_id']]);
      } else {
        echo json_encode(['success' => false, 'error' => $response['error_message']]);
      }
    } catch (Exception $e) {
      http_response_code(500);
      echo json_encode(['success' => false, 'error' => $e->getMessage()]);
    }
    ?>
    
  • 确认服务器PHP版本支持JSON解析,检查file_get_contents('php://input')是否能正常获取POST请求体
  • 更新Heartland SDK至最新版本,避免旧版本存在Apple Pay接口兼容问题

三、通用排查步骤

  • 开启Safari开发者工具,查看控制台的具体语法错误信息,定位到出错代码行
  • 使用Heartland沙箱环境测试,排除生产环境的配置限制
  • 查看服务器日志,获取商户验证、令牌请求的具体错误细节(如HTTP状态码、接口返回错误)
  • 确认Apple Pay商户ID已在Apple开发者后台完成配置,且当前域名已通过验证

内容的提问来源于stack exchange,提问作者Ankush Tyagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:32:32