我正在实现苹果应用程序配置,我遵循苹果指南中的所有步骤,但最后,我收到一条消息‘无法添加卡片’,但没有任何错误抛出这个过程。我就是这样创建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和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:我们现在像这样把现在和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();
发送给我我需要的所有值:activationData
,ephemeralPublicKey
,encryptedPassData
--它作为JSON对象返回它,所以我需要将它转换成数据,并将所有这些值转换成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并没有抱怨。此时,苹果钱包显示了一个警告对话框,无法添加带有两个按钮的卡片,稍后再试或再试。
中的app上都试过了。
更新:
我们发现了一个来自苹果的错误
响应:
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";
}
发布于 2022-03-31 16:08:00
我在实现我们的卡配置时遇到了这个问题。在我们的例子中,我们必须同时做以下两件事:
PKAddPaymentPassRequest
字段都已正确设置。我们由API提供的所有三个字段(activationData
、encryptedPassData
、ephemeralPublicKey
)都是base64编码的,因此它们都必须转换为数据的形式:https://stackoverflow.com/questions/68210197
复制相似问题