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域名来源)
- Safari对ES6+语法有特定支持限制,若目标用户包含低版本Safari用户,需将
二、服务器连接异常修复(商户验证与令牌处理)
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
相关产品推荐
相关产品推荐

