ios - Apple 在应用程序配置中“无法添加卡”
问题描述
我正在实施苹果应用内配置,并按照苹果指南中的所有步骤操作,但最后,我收到一条消息“无法添加卡”,但在此过程中没有任何错误。这就是我创建的方式PKAddPaymentPassViewController
let cardInfoPass = PKAddPaymentPassRequestConfiguration.init(encryptionScheme: PKEncryptionScheme.ECC_V2);
cardInfoPass?.cardholderName = cardholderName as? String; //The name of the person as shown on the card.
cardInfoPass?.primaryAccountSuffix = primaryAccountSuffix as? String; //The last four or five digits of the card’s number.
cardInfoPass?.localizedDescription = localizedDescription as? String; //A short description of the card.
cardInfoPass?.paymentNetwork = PKPaymentNetwork.masterCard;
cardInfoPass?.primaryAccountIdentifier = primaryAccountIdentifier as? String; // A primary account identifier, used to filter out pass libraries.
cardholderName
是写在卡上的名字
primaryAccountSuffix
最后 4 位写在卡上的
localizedDescription
银行名称
paymentNetwork
我们正在使用万事达卡
primaryAccountIdentifier
它是来自 iTunes 的号码1MNJDDA667.com.bank.package.name
我认为这部分是正确的我可以打开苹果钱包模式并且所有这些数据都在那里但是当我最后继续模式时我需要获取证书并将此证书发送给我们的 BE 并且应该将我发回 3 个值和他们寄给我
...
let certificateLeaf = certificates[0].base64EncodedString();
let certificateSubCA = certificates[1].base64EncodedString();
let nonceString = nonce.base64EncodedString();
let nonceSignature = nonceSignature.base64EncodedString();
...
let reqDataDic: [String: Any] = [
"cardId": cardId,
"applePublicCertificate": certificateSubCA,
"nonce": nonceString,
"nonceSignature": nonceSignature,
"customerId": customerId,
"deviceId": deviceId,
]
....
var request = URLRequest(url: url)
request.httpMethod = "POST"
....
request.httpBody = try? JSONSerialization.data(withJSONObject: reqDataDic, options: .prettyPrinted)
UPDATE2:我们现在像这样发送 nonce 和 nonceSignature 作为 HEX
extension Data {
struct HexEncodingOptions: OptionSet {
let rawValue: Int
static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
}
func hexEncodedString(options: HexEncodingOptions = []) -> String {
let format = options.contains(.upperCase) ? "%02hhX" : "%02hhx"
return self.map { String(format: format, $0) }.joined()
}
}
...
let nonceData = Data(bytes: nonce)
let nonceHex = nonceData.hexEncodedString();
let nonceSignatureData = Data(bytes: nonceSignature)
let nonceSignatureHex = nonceSignatureData.hexEncodedString();
BE 将我需要的所有值发回给我:activationData
, ephemeralPublicKey
,encryptedPassData
它将它作为 JSON 对象返回,因此我需要将其转换为 Data 并将所有这些值放入handler
这就是我将数据放入处理程序的方式:
if let dictionaryJson = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any] {
let activationDataString = dictionaryJson["activationData"] as! String;
let ephemeralPublicKeyString = dictionaryJson["ephemeralPublicKey"] as! String;
let encryptedPassDataString = dictionaryJson["encryptedPassData"] as! String;
let activationData = activationDataString.data(using: .utf8)
let ephemeralPublicKey = Data(base64Encoded: ephemeralPublicKeyString)
let encryptedPassData = Data(base64Encoded: encryptedPassDataString)
let paymentPassRequest = PKAddPaymentPassRequest.init()
paymentPassRequest.activationData = activationData;
paymentPassRequest.encryptedPassData = encryptedPassData;
paymentPassRequest.ephemeralPublicKey = ephemeralPublicKey;
handler(paymentPassRequest)
}
我填写了所有数据paymentPassRequest
,看起来一切正常 xCode 没有抱怨。此时苹果钱包显示一个警告对话框,提示无法添加带有 2 个按钮的卡,稍后再试或再试一次....
- 我有一张在 MasterCard 方面列入白名单的卡
- 我在模拟器、真实设备以及 TestFlight 中的应用程序上尝试过
更新:
我们发现了一个来自 Apple 的错误
回复:
https://nc-pod4-smp-device.apple.com:443/broker/v4/devices/042D1xxxxxxxxxxxxx2C52/cards 500
{
Connection = close;
"Content-Length" = 81;
"Content-Type" = "application/json";
Date = "Thu, 08 Jul 2021 08:35:25 GMT";
Vary = "accept-language";
"X-Pod" = "nc-pod4";
"X-Pod-Region" = "paymentpass.com.apple";
"x-conversation-id" = b2axxxxxxxxxxx9e6a4d;
}
{
statusCode = 500;
statusMessage = "Broker Service Response exception";
}
解决方案
let activationData = activationDataString.data(using: .utf8)
我认为这种编码仅适用于签证。
对于 MasterCard,它必须是 base64:
let activationData = Data(base64Encoded: activationDataString)
推荐阅读
- android - OpenCV - Android上的黑屏而不是相机
- sapui5 - 我们如何在 sap ui5 中获取它自己的控制器之外的视图对象?以及我们如何在 sap ui5 中访问其控制器之外的视图控件?
- android - 如何在 OnBindViewHolder() 中完成活动
- javascript - JavaScript:检查2个字母是否是字母表中的后续字母
- php - 如何管理层次结构的资源权限?
- android - 像 xmlns:app="http://schemas.android.com/apk/res-auto" 这样的行在 android xml 文件中是什么意思?
- asp.net - 为 SPA 的授权代码流配置 Identity Server 3 的正确方法是什么?
- c++ - 在c ++中以阿拉伯名称创建文件
- vue.js - Vue组件的结构应该是什么?应该按什么顺序添加功能?
- php - 整合 salesforce 和 backendless