App crash when using apple pay

未關閉
#25 2 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

評估

難度
4/5
預估耗時
3-5 天
新手友好度
30/100
Issue 類型
缺陷
描述清晰度
需要釐清
活躍度
停滯
技術堆疊
ios, typescript
領域
mobile, payments

研究方向

Start with the Apple Pay authorization handler at node_modules/@nativescript/apple-pay/payment-authorization-view-controller-delegate.ios.js:43 and trace the request and paymentData shown in the issue. Reproduce the crash using the provided onApplePayTap flow, then verify that authorization no longer terminates the application and the payment sheet completes normally.

由索引模型根據 Issue 內容生成。

描述

Error:

***** Fatal JavaScript exception - application has been terminated. *****
NativeScript encountered a fatal error: Uncaught Error: The data couldn’t be read because it isn’t in the correct format.
at
PKPaymentAuthorizationViewControllerDelegateImpl.paymentAuthorizationViewControllerDidAuthorizePaymentHandler(file: src/webpack:/vois-mgov/node_modules/@nativescript/apple-pay/payment-authorization-view-controller-delegate.ios.js:43:0)
(CoreFoundation) *** Terminating app due to uncaught exception 'NativeScript encountered a fatal error: Uncaught Error: The data couldn’t be read because it isn’t in the correct format.
at
PKPaymentAuthorizationViewControllerDelegateImpl.paymentAuthorizationViewControllerDidAuthorizePaymentHandler(file: src/webpack:/vois-mgov/node_modules/@nativescript/apple-pay/payment-authorization-view-controller-delegate.ios.js:43:0)
', reason: '(null)'
*** First throw call stack:
(
0   CoreFoundation                      0x00007fff20406d44 __exceptionPreprocess + 242
1   libobjc.A.dylib                     0x00007fff201a4a65 objc_exception_throw + 48
2   NativeScript                        0x000000010610de7e __copy_helper_block_e8_32o + 0
3   libdispatch.dylib                   0x00007fff201148e4 _dispatch_call_block_and_release + 12
4   libdispatch.dylib                   0x00007fff20115b25 _dispatch_client_callout + 8
5   libdispatch.dylib                   0x00007fff20123043 _dispatch_main_queue_drain + 1050
6   libdispatch.dylib                   0x00007fff20122c1b _dispatch_main_queue_callback_4

code:

const MERCHANTID = '388333172821828292929';
const SomeIdentifierFromPaymentProvider = '89290109290129912088';

export const onApplePayTap = async (args?: any) => {
  //try {
  // just ensuring this runs only on iOS
  if (isIOS) {
    const applePayBtn = args.object as ApplePayBtn

    // setup the event listeners for the delegate for apple pay for our button
    applePayBtn.once(ApplePayEvents.DidAuthorizePaymentHandler, async (args: any) => {
      console.log('in authorize handler')
      console.log(ApplePayEvents.DidAuthorizePaymentHandler)

      // this is where you do backend processing with your payment provider (Stripe, PayPal, etc.)
      // this payload is just a sample, your payload to a provider will likely be different
      // you can see here how to access the encrypted values from Apple Pay inside the `args.data.paymentData`
      const payloadToBackend = {
        transaction_type: 'purchase',
        merchant_ref: args.data.paymentData.header.transactionId,
        method: '3DS',
        '3DS': {
          merchantIdentifier: SomeIdentifierFromPaymentProvider,
          data: args.data.paymentData.data,
          signature: args.data.paymentData.signature,
          version: args.data.paymentData.version,
          header: args.data.paymentData.header
        }
      }

      const result = true //await this.someHttpMethodToYourProviderBackend(payloadToBackend)

      if (result) {
        // need this to call when the payment is successful to close the payment sheet correctly on iOS
        args.completion(ApplePayTransactionStatus.Success)
        // now you can follow through with your user flow since the transaction has been successful with your provider
      } else {
        // payment failed on the backend, so show the FAILURE to close the Apple Pay sheet
        args.completion(ApplePayTransactionStatus.Failure)
      }
    })

    // these are the items your customer is paying for
    const paymentItems = ([
      {
        amount: 20.5,
        label: 'Balance',
        type: ApplePayPaymentItemType.Final
      }
    ] as unknown) as ApplePayItems[]

    const request = {
      paymentItems,
      merchantId: MERCHANTID // the merchant ID for this app
      merchantCapabilities: ApplePayMerchantCapability.ThreeDS,
      countryCode: 'US',
      currencyCode: 'USD',
      shippingContactFields: [ApplePayContactFields.Name, ApplePayContactFields.PostalAddress],
      billingContactFields: [ApplePayContactFields.Name, ApplePayContactFields.PostalAddress],
      supportedNetworks: [
        ApplePayNetworks.Amex,
        ApplePayNetworks.Visa,
        ApplePayNetworks.Discover,
        ApplePayNetworks.MasterCard
      ]
    } as ApplePayRequest

    // `createPaymentRequest` will call into the Apple Pay SDK and present the user with the payment sheet for the configuration provided
    await applePayBtn.createPaymentRequest(request).catch((err) => {
      console.log('Apple Pay Error', err)
    })
  }
主要語言
TypeScript
星號
35
分支
13
PR 合併指標
30 天內沒有已合併 PR

環境準備

  • 沒有 Dockerfile 或 Docker Compose 檔案
  • 沒有 Pull Request 範本
  • 閱讀貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

NativeScript/payments 的其他 Issue

查看 NativeScript/payments 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。