需将Apple Pay .p12证书转为PEM格式并配置cURL参数:先用OpenSSL拆分公私钥,再在PHP中通过CURLOPT_SSLCERT、CURLOPT_SSLKEY和CURLOPT_SSLKEYPASSWD指定路径与密码,同时合并WWDR中间证书确保信任链完整。

如果您在配置苹果支付(Apple Pay)时需要将证书集成到PHP后端服务中,但无法正确上传或解析.p12格式的商户证书,则可能是由于证书格式、密码错误或服务器环境限制导致。以下是完成苹果支付PHP证书上传的具体操作步骤:
一、准备苹果支付证书文件
苹果支付要求使用由Apple Developer Portal导出的.p12格式商户身份证书,该证书必须与您在Merchant ID中启用的Apple Pay功能绑定,并包含私钥。确保导出时设置了强密码,且未勾选“加密导出”以外的额外选项。
1、登录Apple Developer Account,进入Certificates, Identifiers & Profiles。
2、在Certificates栏目下,选择Apple Pay Merchant Identity,找到对应Merchant ID的证书。
立即学习“PHP免费学习笔记(深入)”;
3、点击Download按钮下载.cer文件,双击安装至钥匙串访问(Keychain Access)。
4、在钥匙串中定位该证书,右键选择“导出”,保存为.p12格式,务必记住设置的导出密码,后续PHP代码中需使用该密码解密。
二、将.p12证书转换为PEM格式
PHP的cURL或OpenSSL扩展通常不直接支持.p12格式,需先将其拆分为公钥(.pem)和私钥(.key)文件,以便在服务端调用时加载。
1、打开终端,执行命令:openssl pkcs12 -clcerts -nokeys -in merchant_id.p12 -out apple_pay_cert.pem,输入导出密码后生成公钥PEM文件。
2、执行命令:openssl pkcs12 -nocerts -nodes -in merchant_id.p12 -out apple_pay_key.pem,输入相同密码,生成未加密私钥文件。
3、若提示私钥受密码保护,请追加 -passout pass:your_password 参数以避免运行时交互输入。
三、在PHP代码中加载证书文件
使用cURL发起Apple Pay服务器端验证请求(如向https://apple-pay-gateway.apple.com/paymentservices/startSession)时,必须通过CURLOPT_SSLCERT和CURLOPT_SSLKEY指定证书路径,并启用SSL验证。
1、将apple_pay_cert.pem和apple_pay_key.pem文件放置于PHP项目可读目录,例如/var/www/html/certs/。
2、在PHP脚本中初始化cURL句柄:$ch = curl_init("https://apple-pay-gateway.apple.com/paymentservices/startSession");
3、设置证书参数:curl_setopt($ch, CURLOPT_SSLCERT, "/var/www/html/certs/apple_pay_cert.pem");
4、设置私钥参数:curl_setopt($ch, CURLOPT_SSLKEY, "/var/www/html/certs/apple_pay_key.pem");
5、必须设置私钥密码:curl_setopt($ch, CURLOPT_SSLKEYPASSWD, "your_export_password");
四、验证证书链完整性
Apple Pay网关会校验完整的证书信任链,若服务器缺少中间证书(Intermediate Certificate),可能导致SSL握手失败。需确保PHP环境信任Apple根证书及WWDR中间证书。
1、从Apple开发者文档下载AppleWWDRCAG3.cer,并转换为PEM格式:openssl x509 -inform DER -in AppleWWDRCAG3.cer -out AppleWWDRCAG3.pem。
2、将该PEM文件与商户证书合并:cat apple_pay_cert.pem AppleWWDRCAG3.pem > apple_pay_fullchain.pem。
3、在cURL中改用合并后的证书:curl_setopt($ch, CURLOPT_SSLCERT, "/var/www/html/certs/apple_pay_fullchain.pem");
4、确认PHP的openssl.cafile或curl.cainfo指向包含Apple根证书的CA bundle路径,否则CURLOPT_SSL_VERIFYPEER可能失败。
五、调试常见证书错误响应
当Apple Pay接口返回HTTP 400或cURL错误码60/77/58时,通常对应证书加载异常,需逐项检查底层原因。
1、执行openssl pkcs12 -info -in merchant_id.p12,验证.p12是否可被OpenSSL识别且密码正确。
2、使用openssl x509 -in apple_pay_cert.pem -text -noout检查公钥PEM内容是否含Subject=CN=merchant.yourdomain.com字段。
3、运行php -r "var_dump(openssl_pkey_get_private(file_get_contents('apple_pay_key.pem')));"确认私钥可被PHP OpenSSL模块加载。
4、若出现error:0D0680A8:asn1 encoding routines:ASN1_CHECK_INFINITE_END:wrong tag,请检查.p12是否被文本编辑器意外修改或换行符损坏。











