iOS - merci-app/whatsapp-pay-docs GitHub Wiki

No iOS, o WPP transmite os dados para o app do emissor através de uma URL. O app do emissor responde utilizando uma URL de callback.

Seguem abaixo as etapas para implementar a ativação de token WPP + App2App@iOS.


1) Configuração do URL type

É necessário configurar o URL type que será usado pelo WPP para enviar o payload de ativação de token, dentro da aba Info do target do aplicativo, conforme imagem abaixo:

Importante: as informações devem respeitar as configurações do setup.


2) Tratamento de URL de ativação de token

No AppDelegate, é necessário implementar o tratamento das URLs configuradas no passo anterior, conforme explicado aqui.

Tendo como exemplo as configurações de exemplo, a url que o WPP irá abrir será: bank-app://token-activation/a2a?a2apayload=...&wpcallback=...

E o tratamento de URL pode ser implementado da seguinte forma:

func application(_ app: UIApplication,
                 open url: URL,
                 options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    // Checks if incoming URL fits token activation requirements
    guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true),
          let scheme = url.scheme,
          let payloadBase64 = components.queryItems?.first(where: { item in
              item.name == "a2apayload"
          })?.value,
          let callbackUrl = components.queryItems?.first(where: { item in
              item.name == "wpcallback"
          })?.value,
          scheme == "bank-app",
          url.host == "token-activation",
          components.path == "/a2a"
    else {
        return false
    }

    // TODO: Store callbackUrl for later use
    // TODO: Proceeds with token activation payload decoding and store it for later use

    return true
}

3) Decode do payload de ativação de token

O próximo passo é decodificar o payload de ativação de token.

Para isso, é útil criar um model para armazenar os dados:

struct App2AppTokenActivationPayload : Decodable {
    let panReferenceID: String?
    let tokenRequestorID: String?
    let tokenReferenceID: String?
    let walletAccountID: String?
    let deviceID: String?
    let deviceIndex: String?
    let reasonCode: String?
}

Assim podemos implementar a função que decodifica o payload enviado pelo WPP:

private func decode(base64: String): App2AppTokenActivationPayload? {
    guard let encodedData = base64.data(using: .utf8),
          let decodedData = Data(base64Encoded: encodedData),
          let json = String(data: decodedData, encoding: .utf8),
          let tokenActivationPayload = try? JSONDecoder().decode(App2AppTokenActivationPayload.self, from: decodedData)
    else {
        // Error while decoding payload
        return nil
    }
    
    return tokenActivationPayload
}

4) Executar a API de ativação de token

Com as informações obtidas nas etapas passo 2 e 3, o próximo passo é se comunicar com o BFF para que o mesmo execute a API de ativação de token.

Observaçao: antes de prosseguir com esta etapa, uma boa prática e apresentar uma tela pedindo a confirmação do usuário e requisitar autenticação com senha/biometria.


5) Abrir a URL de callback

Após executar a API de ativação de token com sucesso, é necessário abrir a URL de callback fornecida pelo WPP no passo 2. Dessa forma, o fluxo de ativação de token é encerrado e o controle retorna para o WPP.

Pseudo-code dos passos 4 e 5:

// Call BFF API that execute Token activation
ActivateToken(payload: App2AppTokenActivationPayload) { result in
  switch result {
    case .failure(let error):
      // Handle failure
    case .success(let response):
      UIApplication.shared.open(callbackUrl) {
        
      }
  }
}