ApplePay iOS错误 – 此设备无法进行付款
将ApplePay与我的testing应用程序集成时,出现错误:
此设备无法付款
我已经安装了一个卡使用,并在销售点terminal进行testing – 在那里工作很好。
应该工作的代码行(但不)是:
PKPaymentAuthorizationViewController *auth = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:paymentRequest];
苹果的文档在详细列出集成步骤方面极其不足。
苹果公司的Apple Pay入门文件提到了这些要点:
先决条件
除了使用PassKit框架实现Apple Pay之外,您还必须:
- 如果您还没有支付处理器或网关,请设置一个帐户
- 通过证书,标识符和configuration文件注册商家标识符
- 提交证书签名请求以获取将用于encryption和解密支付令牌的公钥和私钥
- (缺less步骤)在您的KeyChain中包含Cert
- 在您的应用中添加Apple Pay权利。
在我的情况下,我忘记了第3步。解决办法是提交一个新的CSR与在步骤2中创build的商家ID,并将结果证书包括在您的钥匙串中。
编辑:但是等等,还有更多!
您还需要转到Apple会员中心的AppID部分,并编辑应用程序的应用程序ID以包含您刚创build的商家帐户ID。 否则,您的应用程序将无法使用商家ID进行configuration。 之后,转到Xcode首选项并刷新configurationconfiguration文件(如果需要,可以手动下载并安装它们)。
这些步骤应该会让您通过“此设备无法付款”错误。
确保您在Passbook上设置的信用卡已经过validation…否则,PKPaymentAuthorizationViewController将返回nil。
request.supportedNetworks = [NSArray arrayWithObjects:PKPaymentNetworkAmex,PKPaymentNetworkDiscover,PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay, nil];
确定你的卡在这些对象!
你可能想要检查你的卡片是否也可以使用。 当我的电子钱包中有三张卡片时遇到此问题。 两笔借记卡(Interac-For Canada)和一张Visa卡。 我忘记了钱包中的签证已经过期,Interac还不支持应用内Apple Pay,这就迫使Passkit返回一个无PKPaymentAuthorizationControllerInstance。 为了解决这个问题,我在iPhone的电子钱包应用程序中检查了支持的支付types,如下所示:
func checkApplePayCapabilities() -> Dictionary<String, Any>? { var mar = Array<String>() var methods : Dictionary<String, String> = ["visa":"no","mastercard":"no","amex":"no","interac":"no","debit":"no"] let payload = Dictionary<String, Any>() guard PKPaymentAuthorizationViewController.canMakePayments() else { return nil } guard #available(iOS 10, *) else { return nil } if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.amex]) { print("can make amex") methods["amex"] = "yes" mar.insert("visa", at: mar.count) } if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.visa]) { print("can make visa") methods["visa"] = "yes" mar.insert("visa", at: mar.count) } if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.masterCard]) { print("can make mastercard") methods["mastercard"] = "yes" mar.insert("mastercard", at: mar.count) } if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.interac]) { print("can make interac") methods["interac"] = "yes" mar.insert("interac", at: mar.count) } guard mar.isEmpty else { return payload } return nil }
它应该只返回可在应用程序内使用的卡片。 当然,您也可以添加其他任何付款方式,或者使用for循环来创build所需的方法数组。