跳到主要内容

Apple Pay

功能说明
支付LOGO-使用规范
集成方案
  1. ✅ 托管结账
  2. ✅ 嵌入式
  3. ✅ 服务器对服务器
推荐使用国家全球
是否支持虚拟行业
是否支持订阅服务✅ 视行业而定
支持的SaaS支持所有已对接的SaaS清单
支持的开源建站
  1. ✅ Magento
  2. ✅ WordPress/Woocommerce
  3. ✅ OpenCart
  4. ✅ PrestaShop
  5. ✅ ZenCart

集成方式

Oceanpayment支持以下两种Apple Pay集成模式:

集成模式适用场景
嵌入式(Embedded)商户无需申请 Apple Pay开发者资质,由 Oceanpayment完成 Merchant Validation和支付处理
服务器对服务器(Server-to-Server)商户自行申请Apple Pay开发者账号并获取Payment Token后,通过Oceanpayment服务端接口完成支付

嵌入式

1. 域名验证文件部署

商户需在所有使用Apple Pay的网站域名下部署 Apple官方域名验证文件,并确保此路径文件可以正常访问: ⬇️ 点击下载域名验证文件

https://[DOMAIN_NAME]/.well-known/apple-developer-merchantid-domain-association
注意

每个独立域名和子域名都需要部署验证文件。

https://example.com/.well-known/apple-developer-merchantid-domain-association
https://test.example.com/.well-known/apple-developer-merchantid-domain-association
···

2. 发起域名注册

  • 完成验证文件部署后,调用 Oceanpayment域名注册接口:
cURL -X POST 'https://mds.oceanpayment.com/appleregistermerchant'
-H 'Authorization: MVc9Lt1CDY7RBRUvh8iVmvvPbYF3uvWkymUDz'
-d '{
"website": ["example.com,test.example.com"]
}'
参数类型必填说明
websiteArray需要注册的域名列表
  • 错误处理
响应码说明
200OK
  • Success.
400Bad Request
  • The request is malformed or invalid.
401Unauthorized
  • The request is malformed or invalid.
417Expectation Failed
  • The e-commerce platform isn’t registered with Apple Developer.
500Internal Server Error
  • An internal server error occurred.

3. 完成接入

完成域名校验后,结账页面将在可能的情况下显示Apple Pay作为付款选项。使用嵌入式集成方案完成对接。

注意

嵌入式集成Apple Pay仅适用于支持它的Apple设备(例如Safari网页浏览器、iOS设备),且支付按钮仅在iOS 17及以上版本才会显示。

服务器对服务器

采用Server-to-Server集成时,商户需自行完成Apple Pay开发者配置。

1. 注册 Apple Developer

访问https://developer.apple.com, 加入Apple Developer Program。

2. 创建Merchant ID

  • 登录Apple Developer → Certificates, Identifiers & Profiles;
  • 点击左侧菜单Identifiers → Merchant IDs → (+),创建Merchant ID。示例:merchant.com.example.store

3. 创建Payment Processing Certificate(支付处理证书)

  • 在 Mac上使用 Keychain或 OpenSSL生成 CSR(Certificate Signing Request);
  • 登录Apple Developer → Certificates;
  • 选择 Payment Processing Certificate 类型创建证书;
  • 上传 CSR,Apple 返回 .cer文件;
  • 下载并安装证书到本地 Keychain;
  • 从Keychain导出.p12文件(包含私钥);
    .p12文件用于服务器端解密 Apple Pay返回的Payment Token。

4. 配置Merchant Domain白名单

5. 获取Payment Token

请参考Apple Pay官方示例获取Payment Token。

{
"paymentData": {
"data": "",
"signature": "",
"header": {
"publicKeyHash": "",
"ephemeralPublicKey": "",
"transactionId": ""
},
"version": "EC_v1"
},
"paymentMethod": {
"displayName": "Visa 0112",
"network": "Visa",
"type": "credit"
},
"transactionIdentifier": ""
}

6. Payment Token传参说明

  • 发起Oceanpayment支付请求时,pay_accountNumber用于传递 Apple Pay Payment Token中的paymentData对象。
  • 传值规则:请将以下节点完整传递至pay_accountNumber
{
"data": "",
"signature": "",
"header": {
"publicKeyHash": "",
"ephemeralPublicKey": "",
"transactionId": ""
},
"version": "EC_v1"
}
注意
  1. pay_accountNumber必须完整保留 Apple返回的paymentData对象内容;
  2. Payment Token获取后应立即提交支付请求,避免Token过期;
  3. 当前支持Apple Pay返回的EC_v1加密格式。

7. card_type传参说明

发起Oceanpayment支付请求时,card_type用于传递Apple Pay Payment Token中的paymentMethod.network,商户需将paymentMethod.network返回值转换为Oceanpayment card_type支持的枚举值后进行传输。

paymentMethod.networkcard_type
visaVISA
masterCardMASTERCARD
maestroMAESTRO
JCBJCB
eloELO
discoverDISCOVER
chinaUnionPayCHINAUNIONPAY
cartesBancairesCARTESBANCAIRES
amexAMEX
-d 'card_type=VISA' \

8. 完成支付

将Payment Token通过pay_accountNumber参数传值Oceanpayment,使用服务器对服务器集成方案完成对接。

const paymentRequest = {
countryCode: 'US',
currencyCode: 'USD',
total: {
label: 'OceanPayment Checkout',
amount: '10.00',
},
supportedNetworks: ['visa', 'masterCard', 'amex'],
merchantCapabilities: ['supports3DS'],
merchantIdentifier: 'merchant.oceanpayment.test',
};

session.onpaymentauthorized = function (event) {
const payment = event.payment;
console.log(JSON.stringify(payment));
console.log(JSON.stringify(payment.token));

processPayment(payment.token).then(function (response) {
console.log("response from datatrans received");
console.log(response);

if (response.match(/status=.error./)) {
console.log("an error occured!");
console.log(response);
return session.abort();
}

session.completePayment(ApplePaySession.STATUS_SUCCESS);
window.location.href = "/success.html";
});

};


function processPayment(paymentToken) {
let paymentMethod = paymentToken.paymentMethod;
let cardType = paymentMethod.network;
let environment = document.getElementById('environment').value;

let account = payParams[environment].account;
let terminal = payParams[environment].terminal;
let orderNo = new Date().getTime();
let orderCurrency = document.getElementById('#order_currency').value;
let orderAmount = document.getElementById('#order_amount').value;

document.getElementById('form').action = payParams[environment].url;
document.getElementById('account').value = account;
document.getElementById('terminal').value = terminal;
document.getElementById('pay_accountNumber').value = paymentToken.paymentData;
document.getElementById('card_type').value = cardType;
document.getElementById('order_number').value = orderNo;
document.getElementById('order_amount').value = orderAmount;
document.getElementById('methods').value = 'ApplePay';

let billingId = document.getElementById('billing_id').value;
let billingFirstName = document.getElementById('billing_firstName').value;
let billingLastName = document.getElementById('billing_lastName').value;
let billingEmail = document.getElementById('billing_email').value;

let signString = account + terminal + orderNo + orderCurrency + orderAmount
+ billingId + billingFirstName + billingLastName + billingEmail + payParams[environment].secureCode;

document.getElementById('signValue').value = sha256_digest(signString);
document.getElementById('form').submit();

}