一. 证书创建
官方文档
https://developer.apple.com/cn/help/account/configure-app-capabilities/configure-apple-pay
- 创建商家标识符
- 创建付款处理证书
CSR创建参考文档
https://developer.apple.com/cn/help/account/create-certificates/create-a-certificate-signing-request这里要注意 Apple Pay Paymetn Processing Certificate的CSR要选择 ECC 和 256 位密钥对
WX20240508-114448@2x.png
WX20240508-114522@2x.png
- AppID关联Merchant IDS
在证书中心关联
WX20240518-163431@2x.png
点击Edit选择上面创建的MerchantID
在Xcode中关联
WX20240518-163858.png
点击+Capability在列表中选择ApplePay,再勾选对应的MerchantID
二. 沙盒账号
官方文档
https://developer.apple.com/help/app-store-connect/test-in-app-purchases/create-sandbox-apple-ids/
需要注意的是沙盒AppleID,需要一个未注册过的真实邮箱地址,后续手机登录沙盒账号的时候,要在该邮箱地址去认证
三. 沙盒测试卡号
官方文档
https://developer.apple.com/apple-pay/sandbox-testing/
手机打开开发者模式,[设置-隐私与安全性-下拉到底部打开开发者模式],退出自己的AppleID,登录上面创建的沙盒账号,并完成提示的验证。去钱包中绑定上面文档给定的沙盒测试卡号,有些卡号绑定时会提示类似超出绑定数量,换其它卡号试试。
四. 代码实现
import PassKit
if PKPaymentAuthorizationController.canMakePayments() {
//设备支持ApplePay
let paymentRequest = PKPaymentRequest()
paymentRequest.merchantIdentifier = "merchant.appleApy.demo"
let currentLocale = Locale.current
if let countryCode = currentLocale.regionCode {
paymentRequest.countryCode = countryCode
}
if let currencyCode = currentLocale.currencyCode {
paymentRequest.currencyCode = currencyCode
}
var supportedNetworks: [PKPaymentNetwork] = [
.amex, .cartesBancaires, .chinaUnionPay, .discover,
.eftpos, .electron, .elo, .idCredit, .interac,
.JCB, .mada, .maestro, .masterCard, .privateLabel,
.quicPay, .suica, .visa, .vPay]
if #available(iOS 14.5, *) {
supportedNetworks.append(PKPaymentNetwork.mir)
}
if #available(iOS 15.1, *) {
supportedNetworks.append(PKPaymentNetwork.dankort)
}
if #available(iOS 16.0, *) {
supportedNetworks.append(PKPaymentNetwork.bancontact)
}
paymentRequest.supportedNetworks = supportedNetworks
paymentRequest.merchantCapabilities = [.capability3DS, .emv, .debit, .credit]
paymentRequest.paymentSummaryItems = [
PKPaymentSummaryItem(label: "商品", amount: NSDecimalNumber(string: "10.00")),
PKPaymentSummaryItem(label: "总额", amount: NSDecimalNumber(string: "10.00"))
]
let paymentController = PKPaymentAuthorizationController(paymentRequest: paymentRequest)
paymentController.delegate = self
paymentController.present(completion: nil)
} else {
//设备不支持ApplePay
}
PKPaymentAuthorizationController.canMakePayments()
判断当前设备是否支持ApplePay
paymentRequest.merchantIdentifier = "merchant.appleApy.demo"
替换成自己的merchatID
let currentLocale = Locale.current
if let countryCode = currentLocale.regionCode {
paymentRequest.countryCode = countryCode
}
if let currencyCode = currentLocale.currencyCode {
paymentRequest.currencyCode = currencyCode
}
获取当前的国家码,结算单位 (eg: CN/CNY),也可以写死成美元或人民币
var supportedNetworks: [PKPaymentNetwork] = [
.amex, .cartesBancaires, .chinaUnionPay, .discover,
.eftpos, .electron, .elo, .idCredit, .interac,
.JCB, .mada, .maestro, .masterCard, .privateLabel,
.quicPay, .suica, .visa, .vPay]
指定支持的支付网络,罗列齐全即可
paymentRequest.merchantCapabilities = [.capability3DS, .emv, .debit, .credit]
用于指定商户支持的支付功能,.debit借记卡,.credit信用卡,不添加的话,会出现支付失败的情况
paymentRequest.paymentSummaryItems = [
PKPaymentSummaryItem(label: "商品", amount: NSDecimalNumber(string: "10.00")),
PKPaymentSummaryItem(label: "总额", amount: NSDecimalNumber(string: "10.00"))
]
商品的结算信息
四. 注意事项
- 沙盒账号需要真实的邮箱,手机登录沙盒账号时,需要发送验证邮件
- 沙盒账号的地区和沙盒钱包添加的卡要对应,例如中国区的沙盒账号,对应中国区卡号,创建沙盒账号的时候会有对应的地区选择
-
paymentRequest.merchantCapabilities
记得添加.debit, .credit,支持信用卡和借记卡支持,要不然会出现无法支付的情况