首页 > 解决方案 > 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, ephemeralPublicKeyencryptedPassData它将它作为 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 个按钮的卡,稍后再试或再试一次....

更新:

我们发现了一个来自 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";
  }

标签: iosswiftreact-native

解决方案


let activationData = activationDataString.data(using: .utf8)

我认为这种编码仅适用于签证。

对于 MasterCard,它必须是 base64:

let activationData = Data(base64Encoded: activationDataString)


推荐阅读