Apple Pay JS集成时onMerchantValidate配置及商户证书获取问题
onMerchantValidate 阶段POST请求提交内容
向苹果服务器发起的校验请求,请求体固定包含4个必填参数:
merchantIdentifier:你在苹果开发者后台注册的商户ID,统一以merchant.为前缀displayName:支付弹窗向用户展示的商户名称,需和开发者后台注册时填写的名称保持一致initiative:网页端集成Apple Pay固定填web即可initiativeContext:集成Apple Pay的网站域名,无需携带http/https协议头
额外注意:请求需使用TLS 1.2及以上版本发起,Content-Type请求头需设置为application/json,且必须携带商户身份证书完成双向SSL校验,否则苹果会直接拒绝请求。
商户身份证书及对应密钥获取方式
merchIdentityCert即商户身份证书,获取步骤如下:
- 使用付费的苹果开发者账号登录开发者后台,进入「Certificates, Identifiers & Profiles」管理板块
- 先创建商户标识符(Merchant ID),即请求参数里的
merchantIdentifier,创建时需填写你集成Apple Pay的网站域名并完成域名所有权验证 - 针对已创建的Merchant ID,选择创建「Merchant Identity Certificate(商户身份证书)」,按照引导上传本地生成的CSR签名请求文件后,即可下载得到
.cer格式的证书文件 - 将下载的
.cer证书导入系统钥匙串(Mac系统),右键选择导出为.p12格式的证书包,导出时可设置加密密码,该p12包内已包含证书本身和对应的私钥 - 可通过openssl命令将p12包拆分为独立的pem格式证书和密钥文件,适配PHP调用:
- 提取证书文件:
openssl pkcs12 -in 你的证书包.p12 -clcerts -nokeys -out merchIdentityCert.pem - 提取私钥文件:
openssl pkcs12 -in 你的证书包.p12 -nocerts -nodes -out merchIdentityKey.pem
- 提取证书文件:
PHP 发起校验请求参考实现
使用cURL发起请求的示例代码如下:
<?php // onMerchantValidate事件中拿到的苹果校验接口地址 $appleValidationEndpoint = $_POST['validationUrl']; // 构造请求体 $requestBody = json_encode([ 'merchantIdentifier' => 'merchant.com.example.mystore', 'displayName' => 'MyStore', 'initiative' => 'web', 'initiativeContext' => 'mystore.example.com' ]); $ch = curl_init($appleValidationEndpoint); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => $requestBody, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_SSLCERT => '/server/secure/path/merchIdentityCert.pem', // 证书文件存放在非web可访问目录 CURLOPT_SSLKEY => '/server/secure/path/merchIdentityKey.pem', // 私钥文件存放在非web可访问目录 // 若私钥设置了导出密码,新增下面一行配置 // CURLOPT_SSLKEYPASSWD => '你设置的私钥密码' ]); $response = curl_exec($ch); if (curl_errno($ch)) { // 按需处理请求错误逻辑 http_response_code(500); exit(curl_error($ch)); } curl_close($ch); // 直接返回苹果返回的会话信息给前端即可完成校验 echo $response; ?>
注意:证书和私钥文件必须存放在web服务根目录之外的路径,避免被公开访问泄露
内容的提问来源于stack exchange,提问作者Amr Gadalla
相关产品推荐
相关产品推荐

