首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >应用程序配置中的苹果“无法添加卡”

应用程序配置中的苹果“无法添加卡”
EN

Stack Overflow用户
提问于 2021-07-01 12:28:09
回答 3查看 1.2K关注 0票数 3

我正在实现苹果应用程序配置,我遵循苹果指南中的所有步骤,但最后,我收到一条消息‘无法添加卡片’,但没有任何错误抛出这个过程。我就是这样创建PKAddPaymentPassViewController

代码语言:javascript
运行
复制
      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个值,然后他们将它发送给我。

代码语言:javascript
运行
复制
...
  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发送

代码语言:javascript
运行
复制
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();

发送给我我需要的所有值:activationDataephemeralPublicKeyencryptedPassData --它作为JSON对象返回它,所以我需要将它转换成数据,并将所有这些值转换成handler

我就是这样将数据放入处理程序的:

代码语言:javascript
运行
复制
          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并没有抱怨。此时,苹果钱包显示了一个警告对话框,无法添加带有两个按钮的卡片,稍后再试或再试。

  • I在MasterCard side
  • 上有一张白名单,我在模拟器、真实设备上和TestFlight

中的app上都试过了。

更新:

我们发现了一个来自苹果的错误

响应:

代码语言:javascript
运行
复制
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";
  }
EN

Stack Overflow用户

发布于 2021-07-16 06:09:06

您正在为将其发送到服务器而使用十六进制格式进行编码,并在获得响应后,尝试使用base64和utf8来转换它们。试着用十六进制,它应该能用。

我们正在使用下面的转换

代码语言:javascript
运行
复制
- (NSData *)dataFromHexString:(NSString *)string
{
    string = [string lowercaseString];
    NSMutableData *data= [NSMutableData new];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int i = 0;
    int length = string.length;
    while (i < length-1) {
        char c = [string characterAtIndex:i++];
        if (c < '0' || (c > '9' && c < 'a') || c > 'f')
            continue;
        byte_chars[0] = c;
        byte_chars[1] = [string characterAtIndex:i++];
        whole_byte = strtol(byte_chars, NULL, 16);
        [data appendBytes:&whole_byte length:1];
    }
    return data;
}

-(NSMutableString *) convertToString:(NSData *)data{
  NSUInteger capacity = data.length * 2;
  NSMutableString *sbuf = [NSMutableString stringWithCapacity:capacity];
  const unsigned char *buf = data.bytes;
  NSInteger i;
  for (i=0; i<data.length; ++i) {
    [sbuf appendFormat:@"%02x", (NSUInteger)buf[i]];
  }
  return  sbuf;
}
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68210197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档