PKAddPassPaymentRequest не может отправить запрос

Я разрабатываю предоставление Apple Pay In-App Provisioning Card Apple Pay Card Provisioning Card. получил это, продолжая эту функцию, получая nonce и nonceSignatures с сервера Apple после получения этого, пытаясь отправить PKAddPassPaymentRequest в приведенном ниже формате, ничего не получая, формат правильный, что я отправляю

PKAddPaymentPassRequest *request = [[PKAddPaymentPassRequest alloc] init];
request.encryptedPassData =[@"XXXXXXXXXXX" dataUsingEncoding:NSUTF8StringEncoding];
request.activationData =[@"XXXXXXXXXXX" dataUsingEncoding:NSUTF8StringEncoding];
request.ephemeralPublicKey =[@"XXXXXXXXXXX" dataUsingEncoding:NSUTF8StringEncoding];

Заранее спасибо.


person S P Balu Kommuri    schedule 20.05.2018    source источник


Ответы (1)


Необходимое условие: получите все права и обновленные профили. Вы можете протестировать push-подготовку к рабочей среде только с помощью testflight или appstore. Вы можете запросить среду для песочницы на своем устройстве у Apple. Они могут включить QA env на вашем устройстве, установив профиль. Затем вы также можете протестировать push-подготовку в QA env.

Как только вы выполните все требования,

<сильный>1. Создайте конфигурацию и заполните необходимые данные

PKAddPaymentPassRequestConfiguration *config= 
     [[PKAddPaymentPassRequestConfiguration alloc] 
       initWithEncryptionScheme:PKEncryptionSchemeECC_V2];

<сильный>2. Создайте PKAddPaymentPassViewController и представьте его

self.addPaymentPassModal = 
     [[PKAddPaymentPassViewController alloc]
       initWithRequestConfiguration:config delegate:self];

<сильный>3. Реализуйте методы делегирования.

- (void)addPaymentPassViewController:(PKAddPaymentPassViewController *)controller 
generateRequestWithCertificateChain:(NSArray<NSData *> *)certificates
                           nonce:(NSData *)nonce
                  nonceSignature:(NSData *)nonceSignature
               completionHandler:(void(^)(PKAddPaymentPassRequest *request))handler {

  PKAddPaymentPassRequest *paymentPassRequest = [[PKAddPaymentPassRequest alloc] init];

  paymentPassRequest.encryptedPassData = [[NSData alloc]
                initWithBase64EncodedString:encryptedPassData options:0];

  paymentPassRequest.activationData = [activationData 
                 dataUsingEncoding:NSUTF8StringEncoding];

  paymentPassRequest.ephemeralPublicKey = [[NSData alloc] 
                 initWithBase64EncodedString:ephemeralPublicKey options:0];

  handler(paymentPassRequest);

}

- (void)addPaymentPassViewController:(PKAddPaymentPassViewController *)controller
      didFinishAddingPaymentPass:(nullable PKPaymentPass *)pass
                           error:(nullable NSError *)error {

 //Will get called once push provisioning complete

}
person Rajesh Rajendran Pillai    schedule 22.05.2018
comment
Спасибо, почти то же самое, что я реализовал, это будет полезно для меня. - person S P Balu Kommuri; 23.05.2018
comment
Привет, я реализую ту же функцию. Я передал данные карты в PKAddPaymentPassViewController и представил их. Но при нажатии кнопки «Далее» я получаю сообщение об ошибке «Не удалось добавить карту». Повторите попытку позже или обратитесь к своему эмитенту для получения дополнительной информации. Вы что я делаю не так? Я написал методы делегата также, как вы упомянули выше. Где взять сертификат, одноразовый номер и одноразовую подпись? - person bhoomi; 18.06.2018
comment
При нажатии кнопки «Далее» элемент управления вернется к приведенному ниже методу делегата с одноразовым номером, одноразовой подписью и цепочкой сертификатов. (void)addPaymentPassViewController:(PKAddPaymentPassViewController *)controller generateRequestWithCertificateChain:(NSArray *)certificates nonce:(NSData *)nonce nonceSignature:(NSData *)nonceSignature completeHandler:(void(^)(PKAddPaymentPassRequest *request))handler Тогда вам нужно создать PKAddPaymentPassRequest с этими данными, как указано выше. - person Rajesh Rajendran Pillai; 19.06.2018
comment
Спасибо Раджеш. Чтобы создать PKAddPaymentPassRequest с зашифрованнымиPassData, activationData и ephemeralPublicKey, мне нужны эти данные с моего сервера. Как я могу установить эти данные на данный момент, поскольку я еще не получил эти данные с моего сервера? - person bhoomi; 20.06.2018
comment
Привет, я получаю цепочку nonce, nonceSignature, Certificate и создаю PKAddPaymentPassRequest с соответствующими данными. Передача того же в обработчике завершения, но ребята из Apple не получают мой запрос. Не могли бы вы помочь мне в этом? Они говорят, что я не вызываю завершениеHandler с помощью AddPaymentPassRequest. @RajeshRajendranPillai - person S P Balu Kommuri; 09.07.2018
comment
Привет, Раджеш. Согласно Apple, я поделился с ними приведенным ниже исходным кодом. PKAddPaymentPassRequest *paymentPassRequest = [[PKAddPaymentPassRequest alloc] init]; paymentPassRequest.encryptedPassData = [[NSData alloc] initWithBase64EncodedString:encryptedPassDataStr options:0]; paymentPassRequest.activationData = [[NSData alloc] initWithBase64EncodedString:activationDataStr options:0]; paymentPassRequest.ephemeralPublicKey = [[NSData alloc] initWithBase64EncodedString:ephemKeyStr options:0]; handler(paymentPassRequest); они говорят, что я имею в виду не тот обработчик. - person S P Balu Kommuri; 10.07.2018
comment
@Balu Удалось ли вам добавить платежную карту в кошелек прямо из вашего приложения? Если да, не могли бы вы поделиться шагами? Я также сталкиваюсь с тем же общим сообщением об ошибке Не удалось добавить карту в кошелек каждый раз, когда я вызываю обработчик с помощью PKAddPaymentPassRequest. - person stack2012; 05.12.2018
comment
@booleanBoy я реализовал. Многое нужно сделать от поставщика карт, и их можно протестировать только в производственной среде с помощью тестового полета. Шифрование должно быть правильным и со стороны сервера. Необходимо следовать документации, предоставленной Apple как для приложения, так и для сервера. Лучше использовать режим ECC. - person S P Balu Kommuri; 05.12.2018
comment
На самом деле мы используем механизм шифрования ECC. Есть ли у вас какие-либо идеи, что может быть причиной этого общего предупреждающего сообщения, которое я описал в своем комментарии выше? Где я должен искать? Что касается среды, мы используем dev. Используемый нами профиль разработчика имеет права на использование кошелька Apple. Кроме того, приложение кошелька в iOS было создано для указания среды песочницы путем установки профиля принудительной подготовки на устройстве. @Балу - person stack2012; 05.12.2018
comment
Ваш запрос достигает сервера Apple Sandbox? Если ребята из Apple подтвердят это? Если они могут получить запрос из вашего приложения, если да? Умеют ли расшифровывать? - person S P Balu Kommuri; 06.12.2018
comment
Как люди добавляют com.apple.developer.payment-pass-provisioning в свои профили разработки? Apple прямо сообщила нам, что право распространяется только на профили распространения? - person venturidoo; 18.12.2018
comment
@RajeshRajendranPillai — Как вы, ребята, передаете сертификаты Apple обратно на свои серверы? Вы просто конвертируете данные напрямую в base64 и отправляете их? Или вам нужно сначала выполнить какие-либо преобразования в приложении? - person venturidoo; 10.01.2019
comment
Здравствуйте, я внедряю Apple Pay для банка, в котором работаю. У меня есть служба, которая дает мне зашифрованные данные, и я могу правильно связать карту с Apple Pay. Я вижу это в кошельке. Когда я пытаюсь восстановить все проходы с помощью PKPassLibrary().passes(), я получаю пустой массив. Это то, что я могу проверить только с помощью TestFlight? - person Edoardo Vicoli; 06.05.2019
comment
@Balu Я реализую подготовку Apple в приложении, но я застрял в этом общем модальном окне ошибки. Как вы реализовали весь путь? Мы используем шифрование ECC, мы можем получить все данные (encryptedPassData, ephemeralPublicKey и activationData), но мы не можем связаться с сервером Apple (во время тестирования Apple не видит наш запрос). Вы нашли что-то важное от вашей проблемы до того момента, когда вы наконец смогли добавить пропуск в кошелек? - person Luca Taccagni; 10.11.2019
comment
@LucaTaccanni, в каком формате вы отправляете все эти данные (encryptedPassData, ephemeralPublicKey и активациюData) на сервер Apple. если какой-либо из форматов данных является неправильным, они не могут получить наши запросы... - person S P Balu Kommuri; 10.11.2019
comment
@Balu - это base64, все, кроме активацииData, которая является utf8 (мы делаем именно так, как написано выше в части «3. Реализовать методы делегата» - person Luca Taccagni; 10.11.2019
comment
@LucaTaccanni, тогда это правильный процесс. Вы тестируете с сертификатом распространения в testflight только ryt? - person S P Balu Kommuri; 10.11.2019
comment
Да, конечно. У нас тоже были устройства и карты из белого списка от Apple. Но нет способа решить проблему. - person Luca Taccagni; 10.11.2019
comment
@LucaTaccanni, в этом случае я подозреваю, что возникла проблема при создании ключа активации. Тогда только наши запросы не могут дойти до серверов Apple. - person S P Balu Kommuri; 14.11.2019
comment
@Balu Я решил свою проблему. Проблема заключалась в том, что я пытался отправить данные, созданные пару дней назад, и, очевидно, они уже недействительны. Поэтому, если у кого-то есть эта проблема, я рекомендую выполнить все шаги, как указано в документации, и протестировать только с помощью TESTFLIGHT. - person Luca Taccagni; 14.11.2019
comment
@LucaTaccanni, это здорово. - person S P Balu Kommuri; 14.11.2019
comment
эй, как вы конвертируете сертификаты, nonce, noncesignature в строки? Не могли бы вы помочь - person Mahendra Thotakura; 03.06.2021
comment
@MahendraThotakura, вы можете преобразовать его следующим образом (это быстро, вы можете найти подобное для target-c): let certificateLeaf = certificates[0].base64EncodedString(); пусть certificateSubCA = сертификаты [1].base64EncodedString(); пусть nonceString = nonce.base64EncodedString(); пусть nonceSignature = nonceSignature.base64EncodedString(); - person Lukáš Šálek; 03.06.2021
comment
@Lukᚊálek спасибо за ваш ответ, я реализовал то же самое, я получаю успех от нашего сервера, когда я отправляю empherialKey, ActivationData, EncryptedPassData обратно в PKAddPaymentPassRequest, я получаю сообщение об ошибке Не удалось добавить карту. - person Mahendra Thotakura; 03.06.2021
comment
@MahendraThotakura Мы еще не реализовали конечные точки для этой логики ... Вы на шаг впереди меня (я буду там на следующей неделе) ... но я ожидаю, что это потому, что мод dev ... вы должны использовать один из них карты и несколько идентификаторов/аккаунтов Apple (я действительно не понял) developer.apple. com/apple-pay/sandbox-testing. Дайте мне знать, если вы найдете решение - person Lukáš Šálek; 03.06.2021
comment
@Lukᚊálek Эти карты песочницы можно использовать, только добавив их в Apple Wallet вручную, но нам нужно было добавить их через PKAddPaymentPassRequestConfiguration. - person Mahendra Thotakura; 03.06.2021
comment
эй, я включил режим песочницы в кошельке Apple, и я пытаюсь добавить карту в кошелек, я получаю сообщение об ошибке Ваш эмитент еще не предлагает поддержку этой карты! может кто-нибудь помочь мне в этом? - person Mahendra Thotakura; 04.06.2021
comment
@MahendraThotakura есть решение? Я просто получаю все данные, которые мне нужны (activationData,encryptedPassData,ephemeralPublicKey), но когда я помещаю их в handler(paymentPassRequest), он показывает мне диалоговое окно с предупреждением «Не удалось добавить карту, попробуйте позже или свяжитесь с эмитентом карты… у вас была такая же проблема? - person Lukáš Šálek; 23.06.2021
comment
@MahendraThotakura, кстати, как ты инициировал PKAddPaymentPassRequest.init() ?? моя конечная точка возвращает json, я должен был сделать это let ephemeralPublicKeyString = dictionaryJson["ephemeralPublicKey"] as! String;, а затем `пусть ephemeralPublicKey = Data(ephemeralPublicKeyString.utf8)` и поместил его в PKAddPaymentPassRequest` paymentPassRequest.encryptedPassData = зашифрованныйPassData; ` - person Lukáš Šálek; 23.06.2021
comment
@Lukᚊálek, да, у меня тоже была похожая проблема. Не удалось добавить карту. Мы можем протестировать эту функцию только в TestFlight. И что касается преобразования empherialKey, ActivationData и EncryptedPassData, мы должны преобразовать его на основе шифрования, которое выполняет ваша серверная команда. В нашем случае это шестнадцатеричное преобразование. - person Mahendra Thotakura; 23.06.2021
comment
@MahendraThotakura Привет, я все еще продолжаю думать об этом. Не удалось добавить ошибку карты ... не могли бы вы поделиться со мной всем, что у вас есть в addPaymentPassViewController ?? это будет очень полезно для меня... я создал вопрос StackOverflow здесь stackoverflow.com/questions/68210197/ я действительно в отчаянии - person Lukáš Šálek; 15.07.2021