Criar um aplicativo de cartão inteligente NFCCreate an NFC Smart Card app

Importante

Este tópico aplica-se somente ao Windows 10 Mobile.This topic applies to Windows 10 Mobile only.

O Windows Phone 8.1 dava suporte a aplicativos de emulação de cartão NFC usando um elemento seguro baseado em SIM, mas esse modelo exigia que aplicativos de pagamento seguro estivessem rigidamente acoplados a MNO (operadoras de rede móvel).Windows Phone 8.1 supported NFC card emulation apps using a SIM-based secure element, but that model required secure payment apps to be tightly coupled with mobile-network operators (MNO). Isso limitava a variedade de soluções de pagamento possíveis por outros comerciantes ou desenvolvedores que não estão associados a MNOs.This limited the variety of possible payment solutions by other merchants or developers that are not coupled with MNOs. No Windows 10 Mobile, apresentamos uma nova tecnologia de emulação de cartão, chamada HCE (Emulação de Cartão Host).In Windows 10 Mobile, we have introduced a new card emulation technology called, Host Card Emulation (HCE). A tecnologia HCE permite que seu aplicativo se comunique diretamente com um leitor de cartão NFC.HCE technology allows your app to directly communicate with an NFC card reader. Este tópico ilustra como a HCE (Emulação de Cartão Host) funciona em dispositivos Windows 10 Mobile e como você pode desenvolver um aplicativo HCE para que os clientes possam acessar seus serviços usando um telefone, em vez de um cartão físico, sem colaborar com uma MNO.This topic illustrates how Host Card Emulation (HCE) works on Windows 10 Mobile devices and how you can develop an HCE app so that your customers can access your services through their phone instead of a physical card without collaborating with an MNO.

O que você precisa para desenvolver um aplicativo HCEWhat you need to develop an HCE app

Para desenvolver um aplicativo de emulação de cartão baseado em HCE para Windows 10 Mobile, você precisará obter sua configuração de ambiente de desenvolvimento.To develop an HCE-based card emulation app for Windows 10 Mobile, you will need to get your development environment setup. Você pode obter a configuração instalando o Microsoft Visual Studio 2015, que inclui as ferramentas de desenvolvedor do Windows e o emulador do Windows 10 Mobile com suporte à emulação de NFC.You can get set up by installing Microsoft Visual Studio 2015, which includes the Windows developer tools and the Windows 10 Mobile emulator with NFC emulation support. Para obter mais informações sobre a obtenção da configuração, consulte Prepare-se para começarFor more information about getting setup, see, Get set up

Opcionalmente, se você quiser testar com um dispositivo Windows 10 Mobile real em vez do emulador do Windows 10 Mobile incluído, você também precisará dos itens a seguir.Optionally, if you want to test with a real Windows 10 Mobile device instead of the included Windows 10 Mobile emulator, you will also need the following items.

  • Um dispositivo Windows 10 Mobile com suporte a HCE NFC.A Windows 10 Mobile device with NFC HCE support. Atualmente, o Lumia 730, 830, 640 e o 640 XL têm hardware com suporte a aplicativos HCE NFC.Currently, the Lumia 730, 830, 640, and the 640 XL have the hardware to support NFC HCE apps.
  • Um terminal leitor que dê suporte a protocolos ISO/IEC 14443-4 e ISO/IEC 7816-4A reader terminal that supports protocols ISO/IEC 14443-4 and ISO/IEC 7816-4

O Windows 10 Mobile implementa um serviço HCE que fornece as funcionalidades a seguir.Windows 10 Mobile implements an HCE service that provides the following functionalities.

  • Os aplicativos podem registrar os AIDs (identificadores de miniaplicativos) dos cartões que desejam emular.Apps can register the applet identifiers (AIDs) for the cards they would like to emulate.
  • Resolução de conflitos e roteamento do comando APDU (unidade de dados do protocolo de aplicativo) e de pares de respostas para um dos aplicativos registrados com base na seleção de cartão leitor externo e na preferência do usuário.Conflict resolution and routing of the Application Protocol Data Unit (APDU) command and response pairs to one of the registered apps based on the external reader card selection and user preference.
  • Manipulação de eventos e notificações aos aplicativos como resultado de ações do usuário.Handling of events and notifications to the apps as a result of user actions.

O Windows 10 dá suporte à emulação de cartões inteligentes que se baseiam em ISO-DEP (ISO-IEC 14443-4) e se comunicam usando APDUs conforme definido na especificação ISO-IEC 7816-4.Windows 10 supports emulation of smart cards that are based on ISO-DEP (ISO-IEC 14443-4) and communicates using APDUs as defined in the ISO-IEC 7816-4 specification. O Windows 10 dá suporte à tecnologia ISO/IEC 14443-4 tipo A para aplicativos HCE.Windows 10 supports ISO/IEC 14443-4 Type A technology for HCE apps. As tecnologias tipo B, tipo F e não ISO-DEP (por exemplo, MIFARE) são roteadas para o SIM por padrão.Type B, type F, and non-ISO-DEP (eg MIFARE) technologies are routed to the SIM by default.

Apenas os dispositivos Windows 10 Mobile são habilitados com o recurso de emulação de cartão.Only Windows 10 Mobile devices are enabled with the card emulation feature. A emulação de cartão baseada em SIM e HCE não está disponível em outras versões do Windows 10.SIM-based and HCE-based card emulation is not available on other versions of Windows 10.

A arquitetura do suporte para emulação de cartão baseada em HCE e SIM é mostrada no diagrama abaixo.The architecture for HCE and SIM based card emulation support is shown in the diagram below.

Arquitetura para emulação de cartão HCE e SIM

Seleção de aplicativos e roteamento AIDApp selection and AID routing

Para desenvolver um aplicativo HCE, você deve entender como dispositivos Windows 10 Mobile encaminham AIDs para um aplicativo específico, pois os usuários podem instalar vários aplicativos HCE diferentes.To develop an HCE app, you must understand how Windows 10 Mobile devices route AIDs to a specific app because users can install multiple different HCE apps. Cada aplicativo pode registrar vários HCE e cartões baseados em SIM.Each app can register multiple HCE and SIM-based cards. Os aplicativos Windows Phone 8.1 herdados que são baseados em SIM continuarão a funcionar no Windows 10 Mobile, desde que o usuário escolha a opção "Cartão SIM" como seu cartão de pagamento padrão no menu de Configuração do NFC.Legacy Windows Phone 8.1 apps that are SIM-based will continue to work on Windows 10 Mobile as long as the user chooses the "SIM Card" option as their default payment card in the NFC Setting menu. Isso é definido por padrão quando o dispositivo é ajustado pela primeira vez.This is set by default when turning the device on for the first time.

Quando o usuário toca em seu dispositivo Windows 10 Mobile em um terminal, os dados são roteados automaticamente para o aplicativo adequado instalado no dispositivo.When the user taps their Windows 10 Mobile device to a terminal, the data is automatically routed to the proper app installed on the device. Esse roteamento é baseado nos AIDs, que são identificadores de 5 a 16 bytes.This routing is based on the applet IDs (AIDs) which are 5-16 byte identifiers. Durante um toque, o terminal externo transmitirá um comando SELECT APDU para especificar o AID para o qual ele gostaria que todos os comandos APDU subsequentes fossem roteados.During a tap, the external terminal will transmit a SELECT command APDU to specify the AID it would like all subsequent APDU commands to be routed to. Os comandos SELECT subsequentes mudarão o roteamento novamente.Subsequent SELECT commands, will change the routing again. Com base nos AIDs registrados pelos aplicativos e configurações do usuário, o tráfego da APDU é roteado para um aplicativo específico, que enviará uma resposta à APDU.Based on the AIDs registered by apps and user settings, the APDU traffic is routed to a specific app, which will send a response APDU. Lembre-se de que um terminal talvez queira se comunicar com vários aplicativos diferentes durante o mesmo toque.Be aware that a terminal may want to communicate with several different apps during the same tap. Portanto, você deve garantir que a tarefa em segundo plano do seu aplicativo seja encerrada o mais rápido possível quando desativada para dar espaço para a tarefa em segundo plano do outro aplicativo responder à APDU.So you must ensure your app's background task exits as quickly as possible when deactivated to make room for another app's background task to respond to the APDU. Discutiremos as tarefas em segundo plano mais adiante neste tópico.We will discuss background tasks later in this topic.

Os aplicativos HCE devem se registrar com AIDs específicos que possam manipular, portanto receberão APDUs para um AID.HCE apps must register themselves with particular AIDs they can handle so they will receive APDUs for an AID. Os aplicativos declaram AIDs usando grupos de AIDs.Apps decalre AIDs by using AID groups. Um grupo de AIDs é conceitualmente equivalente a um cartão físico individual.An AID group is conceptually equivalent to an individual physical card. Por exemplo, um cartão de crédito é declarado com um grupo de AIDs e um segundo cartão de crédito de um banco diferente é declarado com um grupo de AIDs diferente, mesmo que ambos possam ter o mesmo AID.For example, one credit card is declared with an AID group and a second credit card from a different bank is declared with a different, second AID group, even though both of them may have the same AID.

Resolução do conflitos de grupos de AIDs de pagamentoConflict resolution for payment AID groups

Quando um aplicativo registra cartões físicos (grupos de AIDs), ele pode declarar a categoria do grupo de AIDs como "Pagamento" ou "Outros".When an app registers physical cards (AID groups), it can declare the AID group category as either "Payment" or "Other." Embora possa haver vários grupos de AIDs de pagamento registrados em um determinado momento, apenas um desses grupos de AIDs de pagamento poderá ser habilitado para Tocar e Pagar por vez, o que é selecionado pelo usuário.While there can be multiple payment AID groups registered at any given time, only one of these payment AID groups may be enabled for Tap and Pay at a time, which is selected by the user. Esse comportamento existe porque o usuário espera estar no controle de conscientemente escolher um único pagamento, cartão de crédito ou débito a ser usado, para que ele não pague com um cartão diferente sem querer ao tocar o dispositivo em um terminal.This behavior exists because the user expects be in control of consciously choosing a single payment, credit, or debit card to use so they don't pay with a different unintended card when tapping their device to a terminal.

No entanto, vários grupos de AIDs registrados como "Outros" podem ser habilitados ao mesmo tempo sem a interação do usuário.However, multiple AID groups registered as "Other" can be enabled at the same time without user interaction. Esse comportamento existe porque espera-se que outros tipos de cartões, como fidelidade, cupons ou transporte público, funcionem sem qualquer esforço ou notificação sempre que o usuário toca no telefone.This behavior exists because other types of cards like loyalty, coupons, or transit are expected to just work without any effort or prompting whenever they tap their phone.

Todos os grupos de AIDs registrados como "Pagamento" aparecem na lista de cartões na página de Configurações do NFC, onde o usuário pode selecionar seu cartão de pagamento padrão.All the AID groups that are registered as "Payment" appear in the list of cards in the NFC Settings page, where the user can select their default payment card. Quando um cartão de pagamento padrão é selecionado, o aplicativo que registrou esse grupo de AIDs de pagamento se torna o aplicativo de pagamento padrão.When a default payment card is selected, the app that registered this payment AID group becomes the default payment app. Os aplicativos de pagamento padrão podem habilitar ou desabilitar qualquer um de seus grupos de AIDs sem a interação do usuário.Default payment apps can enable or disable any of their AID groups without user interaction. Se o usuário recusar o prompt do aplicativo de pagamento padrão, o aplicativo de pagamento padrão atual (se houver) continuará sendo o padrão.If the user declines the default payment app prompt, then the current default payment app (if any) continues to remain as default. A captura de tela a seguir mostra a página NFC Settings.The following screenshot shows the NFC Settings page.

Captura de tela da página NFC Settings

Usando a captura de tela de exemplo acima, se o usuário alterar o cartão de pagamento padrão para outro cartão que não esteja registrado por "HCE Application 1", o sistema criará um prompt de confirmação para obter o consentimento do usuário.Using the example screenshot above, if the user changes his default payment card to another card that is not registered by "HCE Application 1," the system creates a confirmation prompt for the user’s consent. Entretanto, se o usuário alterar seu cartão de pagamento padrão para outro cartão que esteja registrado pelo "HCE Application 1", o sistema não criará um prompt de confirmação para o usuário, pois "HCE Application1" já é o aplicativo de pagamento padrão.However, if the user changes his default payment card to another card that is registered by "HCE Application 1," the system does not create a confirmation prompt for the user, because "HCE Application1" is already the default payment app.

Resolução de conflitos de grupos de AIDs de não pagamentoConflict resolution for non-payment AID groups

Os cartões de não pagamento categorizados como "Outros" não aparecem na página de configurações de NFC.Non-payment cards categorized as "Other" do not appear in the NFC settings page.

Seu aplicativo pode criar, registrar e habilitar grupos de AIDs de não pagamento da mesma maneira que os grupos de AIDs de pagamento.Your app can create, register and enable non-payment AID groups in the same manner as payment AID groups. A principal diferença é que, para grupos de AIDs de não pagamento, a categoria de emulação é definida como "Outros", em oposição a "Pagamento".The main difference is that for non-payment AID groups the emulation category is set to "Other" as opposed to "Payment". Depois de registrar o grupo de AIDs no sistema, você precisa habilitar o grupo para receber o tráfego de NFC.After registering the AID group with the system, you need to enable the AID group to receive NFC traffic. Quando você tenta habilitar um grupo de AIDs de não pagamento para receber tráfego, o usuário não recebe um prompt de confirmação, a menos que haja um conflito com um dos AIDs já registrados no sistema por um aplicativo diferente.When you try to enable a non-payment AID group to receive traffic, the user is not prompted for a confirmation unless there is a conflict with one of the AIDs already registered in the system by a different app. Se houver um conflito, o usuário será solicitado a fornecer informações sobre o cartão e o aplicativo associado que serão desabilitados se ele optar por habilitar o grupo de AIDs recém-registrado.If there is a conflict, the user will be prompted with information about which card and it's associated app will be disabled if the user chooses to enable the newly registered AID group.

Coexistência com cartão SIM baseado em aplicativos de NFCCoexistence with SIM based NFC applications

No Windows 10 Mobile, o sistema configura a tabela de roteamento do controlador NFC que é usada para as decisões de roteamento na camada do controlador.In Windows 10 Mobile, the system sets up the NFC controller routing table that is used to make routing decisions at the controller layer. A tabela contém informações de roteamento para os itens a seguir.The table contains routing information for the following items.

  • Rotas de AIDs individuais.Individual AID routes.
  • Rota baseada em protocolo (ISO-DEP).Protocol based route (ISO-DEP).
  • Roteamento baseado em tecnologia (NFC-A/B/F).Technology based routing (NFC-A/B/F).

Quando um leitor externo envia um comando "SELECT AID", o controlador NFC primeiro procura uma correspondência nas rotas de AIDs na tabela de roteamento.When an external reader sends a "SELECT AID" command, the NFC controller first checks AID routes in the routing table for a match. Se não houver nenhuma correspondência, ele usará a rota baseada em protocolo como a rota padrão para o tráfego ISO-DEP (14443-4-A).If there is no match, it will use the protocol-based route as the default route for ISO-DEP (14443-4-A) traffic. Para qualquer outro tráfego que não seja ISO-DEP, ele usará o roteamento baseado em tecnologia.For any other non-ISO-DEP traffic it will use the technology based routing.

O Windows 10 Mobile oferece uma opção de menu "Cartão SIM" na página de Configurações do NFC para continuar a usar aplicativos baseados em SIM do Windows Phone 8.1 herdados que não registram AIDs no sistema.Windows 10 Mobile provides a menu option "SIM Card" in the NFC Settings page to continue to use legacy Windows Phone 8.1 SIM-based apps, which do not register their AIDs with the system. Se o usuário selecionar "Cartão SIM" como seu cartão de pagamento padrão, a rota ISO-DEP será definida como UICC; para todas as outras seleções no menu suspenso, a rota ISO-DEP será para o host.If the user selects "SIM card" as their default payment card, then the ISO-DEP route is set to UICC, for all other selections in the drop-down menu the ISO-DEP route is to the host.

A rota ISO-DEP é definida como "Cartão SIM" para os dispositivos que têm um cartão SIM habilitado para SE quando o dispositivo é inicializado pela primeira vez com o Windows 10 Mobile.The ISO-DEP route is set to "SIM Card" for devices that have an SE enabled SIM card when the device is booted for the first time with Windows 10 Mobile. Quando o usuário instalar um aplicativo habilitado para HCE e esse aplicativo habilitar quaisquer registros de grupos de AIDs HCE, a rota ISO-DEP será apontada para o host.When the user installs an HCE enabled app and that app enables any HCE AID group registrations, the ISO-DEP route will be pointed to the host. Os novos aplicativos baseados em SIM precisam registrar os AIDs no SIM para que as rotas de AIDs específicas sejam populadas na tabela de roteamento do controlador.New SIM-based applications need to register the AIDs in the SIM in order for the specific AID routes to be populated in the controller routing table.

Criando um aplicativo baseado em HCECreating an HCE based app

Seu aplicativo HCE tem duas partes.Your HCE app has two parts.

  • O aplicativo em primeiro plano principal para a interação do usuário.The main foreground app for the user interaction.
  • Uma tarefa em segundo plano que é disparada pelo sistema para processar APDUs para um determinado AID.A background task that is triggered by the system to process APDUs for a given AID.

Devido aos requisitos de desempenho extremamente rigorosos para carregar sua tarefa em segundo plano em resposta a um toque NFC, recomendamos que toda a sua tarefa em segundo plano seja implementada em código nativo C++/CX (incluindo quaisquer dependências, referências ou bibliotecas das quais você depende) em vez de C# ou código gerenciado.Because of the extremely tight performance requirements for loading your background task in response to an NFC tap, we recommend that your entire background task be implementing in C++/CX native code (including any dependencies, references, or libraries you depend on) rather than C# or managed code. Embora o C# e o código gerenciado normalmente tenham um bom desempenho, há uma sobrecarga, como o carregamento do CLR .NET, que pode ser evitada com a gravação em C++/CX.While C# and managed code normally performs well, there is overhead, like loading the .NET CLR, that can be avoided by writing it in C++/CX.

Criar e registrar sua tarefa em segundo planoCreate and register your background task

Você precisa criar uma tarefa em segundo plano em seu aplicativo HCE para processar e responder às APDUs roteadas para ele pelo sistema.You need to create a background task in your HCE app for processing and responding to APDUs routed to it by the system. Na primeira vez em que seu aplicativo é iniciado, o primeiro plano registra uma tarefa em segundo plano de HCE que implementa a interface IBackgroundTaskRegistration conforme mostrado no código a seguir.During the first time your app is launched, the foreground registers an HCE background task that implements the IBackgroundTaskRegistration interface as shown in the following code.

var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorHostApplicationActivated));
bgTask = taskBuilder.Register();

Observe que o gatilho da tarefa é definido como SmartCardTriggerType.Notice that the task trigger is set to SmartCardTriggerType. EmulatorHostApplicationActivated.EmulatorHostApplicationActivated. Isso significa que, sempre que um comando APDU SELECT AID for recebido pelo sistema operacional sendo resolvido para o seu aplicativo, sua tarefa em segundo plano será iniciada.This means that whenever a SELECT AID command APDU is received by the OS resolving to your app, your background task will be launched.

Receber e responder a APDUsReceive and respond to APDUs

Quando houver uma APDU dirigida ao seu aplicativo, o sistema iniciará sua tarefa em segundo plano.When there is an APDU targeted for your app, the system will launch your background task. Sua tarefa em segundo plano recebe a APDU passada por meio da propriedade CommandApdu do objeto SmartCardEmulatorApduReceivedEventArgs e responde à APDU usando o método TryRespondAsync do mesmo objeto.Your background task receives the APDU passed through the SmartCardEmulatorApduReceivedEventArgs object’s CommandApdu property and responds to the APDU using the TryRespondAsync method of the same object. Considere manter sua tarefa em segundo plano para operações leves por motivos de desempenho.Consider keeping your background task for light operations for performance reasons. Por exemplo, responda às APDUs imediatamente e saia de sua tarefa em segundo plano quando todo o processamento estiver concluído.For example, respond to the APDUs immediately and exit your background task when all processing is complete. Devido à natureza das transações NFC, os usuários tendem a encostar seus dispositivos no leitor por um período muito curto de tempo.Due to the nature of NFC transactions, users tend to hold their device against the reader for only a very short amount of time. Sua tarefa em segundo plano continuará a receber tráfego do leitor até que a conexão seja desativada. Nesse caso, você receberá um objeto SmartCardEmulatorConnectionDeactivatedEventArgs.Your background task will continue to receive traffic from the reader until your connection is deactivated, in which case you will receive a SmartCardEmulatorConnectionDeactivatedEventArgs object. Sua conexão pode ser desativada pelos motivos a seguir, conforme indicado na propriedade SmartCardEmulatorConnectionDeactivatedEventArgs.Reason.Your connection can be deactivated because of the following reasons as indicated in the SmartCardEmulatorConnectionDeactivatedEventArgs.Reason property.

  • Se a conexão for desativada com o valor ConnectionLost, isso significará que o usuário afastou seu dispositivo do leitor.If the connection is deactivated with the ConnectionLost value, it means that the user pulled their device away from the reader. Se o seu aplicativo precisar que o usuário toque no terminal por mais tempo, considere solicitar seus comentários.If your app needs the user to tap to the terminal longer, you might want to consider prompting them with feedback. Você deve encerrar sua tarefa em segundo plano rapidamente (concluindo o adiamento) para garantir que, se o usuário tocar novamente, ela não ficará aguardando a tarefa em segundo plano anterior ser encerrada.You should terminate your background task quickly (by completing your deferral) to ensure if they tap again it won’t be delayed waiting for the previous background task to exit.
  • Se a conexão for desativada com ConnectionRedirected, isso significará que o terminal enviou um novo comando APDU SELECT AID dirigido a um AID diferente.If the connection is deactivated with the ConnectionRedirected, it means that the terminal sent a new SELECT AID command APDU directed to a different AID. Nesse caso, seu aplicativo deverá encerrar a tarefa em segundo plano imediatamente (concluindo o adiamento) para permitir a execução de outra tarefa em segundo plano.In this case, your app should exit the background task immediately (by completing your deferral) to allow another background task to run.

A tarefa em segundo plano também deve se registrar no Evento cancelado em IBackgroundTaskInstance interface e, da mesma forma, encerrar a tarefa em segundo plano rapidamente (concluindo o adiamento) porque esse evento é disparado pelo sistema quando é concluído com sua tarefa em segundo plano.The background task should also register for the Canceled event on IBackgroundTaskInstance interface, and likewise quickly exit the background task (by completing your deferral) because this event is fired by the system when it is finished with your background task. Abaixo está o código que demonstra uma tarefa em plano de fundo do aplicativo HCE.Below is code that demonstrates an HCE app background task.

void BgTask::Run(
    IBackgroundTaskInstance^ taskInstance)
{
    m_triggerDetails = static_cast<SmartCardTriggerDetails^>(taskInstance->TriggerDetails);
    if (m_triggerDetails == nullptr)
    {
        // May be not a smart card event that triggered us
        return;
    }

    m_emulator = m_triggerDetails->Emulator;
    m_taskInstance = taskInstance;

    switch (m_triggerDetails->TriggerType)
    {
    case SmartCardTriggerType::EmulatorHostApplicationActivated:
        HandleHceActivation();
        break;

    case SmartCardTriggerType::EmulatorAppletIdGroupRegistrationChanged:
        HandleRegistrationChange();
        break;

    default:
        break;
    }
}

void BgTask::HandleHceActivation()
{
 try
 {
        auto lock = m_srwLock.LockShared();
        // Take a deferral to keep this background task alive even after this "Run" method returns
        // You must complete this deferal immediately after you have done processing the current transaction
        m_deferral = m_taskInstance->GetDeferral();

        DebugLog(L"*** HCE Activation Background Task Started ***");

        // Set up a handler for if the background task is cancelled, we must immediately complete our deferral
        m_taskInstance->Canceled += ref new Windows::ApplicationModel::Background::BackgroundTaskCanceledEventHandler(
            [this](
            IBackgroundTaskInstance^ sender,
            BackgroundTaskCancellationReason reason)
        {
            DebugLog(L"Cancelled");
            DebugLog(reason.ToString()->Data());
            EndTask();
        });

        if (Windows::Phone::System::SystemProtection::ScreenLocked)
        {
            auto denyIfLocked = Windows::Storage::ApplicationData::Current->RoamingSettings->Values->Lookup("DenyIfPhoneLocked");
            if (denyIfLocked != nullptr && (bool)denyIfLocked == true)
            {
                // The phone is locked, and our current user setting is to deny transactions while locked so let the user know
                // Denied
                DoLaunch(Denied, L"Phone was locked at the time of tap");

                // We still need to respond to APDUs in a timely manner, even though we will just return failure
                m_fDenyTransactions = true;
            }
        }
        else
        {
            m_fDenyTransactions = false;
        }

        m_emulator->ApduReceived += ref new TypedEventHandler<SmartCardEmulator^, SmartCardEmulatorApduReceivedEventArgs^>(
            this, &BgTask::ApduReceived);

        m_emulator->ConnectionDeactivated += ref new TypedEventHandler<SmartCardEmulator^, SmartCardEmulatorConnectionDeactivatedEventArgs^>(
                [this](
                SmartCardEmulator^ emulator,
                SmartCardEmulatorConnectionDeactivatedEventArgs^ eventArgs)
            {
                DebugLog(L"Connection deactivated");
                EndTask();
            });

  m_emulator->Start();
        DebugLog(L"Emulator started");
 }
 catch (Exception^ e)
 {
        DebugLog(("Exception in Run: " + e->ToString())->Data());
        EndTask();
 }
}

Criar e registrar grupos de AIDsCreate and register AID groups

Durante a primeira inicialização do seu aplicativo quando o cartão está sendo provisionado, você criará e registrará grupos de AIDs no sistema.During the first launch of your application when the card is being provisioned, you will create and register AID groups with the system. O sistema determina o aplicativo com o qual um leitor externo gostaria de conversar e faz o roteamento de APDUs de acordo com os AIDs registrados e as configurações do usuário.The system determines the app that an external reader would like to talk to and route APDUs accordingly based on the registered AIDs and user settings.

A maioria dos cartões de pagamento se registra para o mesmo AID (que é o AID PPSE) junto com os AIDs adicionais específicos ao cartão da rede de pagamento.Most of the payment cards register for the same AID (which is PPSE AID) along with additional payment network card specific AIDs. Cada grupo de AIDs representa um cartão e, quando o usuário habilita o cartão, todos os AIDs do grupo são habilitados.Each AID group represents a card and when the user enables the card, all AIDs in the group are enabled. Da mesma forma, quando o usuário desativa o cartão, todos os AIDs do grupo são desabilitados.Similarly, when the user deactivates the card, all AIDs in the group are disabled.

Para registrar um grupo de AIDs, você precisa criar um objeto SmartCardAppletIdGroup e definir suas propriedades para refletir que se trata de um cartão de pagamento baseado em HCE.To register an AID group, you need to create a SmartCardAppletIdGroup object and set its properties to reflect that this is an HCE-based payment card. Seu nome de exibição deve ser descritivo do usuário porque ele será exibido no menu de configurações NFC e nos prompts do usuário.Your display name should be descriptive to the user because it will show up in the NFC settings menu as well as user prompts. Para cartões de pagamento HCE, a propriedade SmartCardEmulationCategory deve ser definida como Payment, e a propriedade SmartCardEmulationType deve ser definida como Host.For HCE payment cards, the SmartCardEmulationCategory property should be set to Payment and the SmartCardEmulationType property should be set to Host.

public static byte[] AID_PPSE =
        {
            // File name "2PAY.SYS.DDF01" (14 bytes)
            (byte)'2', (byte)'P', (byte)'A', (byte)'Y',
            (byte)'.', (byte)'S', (byte)'Y', (byte)'S',
            (byte)'.', (byte)'D', (byte)'D', (byte)'F', (byte)'0', (byte)'1'
        };

var appletIdGroup = new SmartCardAppletIdGroup(
                        "Example DisplayName",
                                new List<IBuffer> {AID_PPSE.AsBuffer()},
                                SmartCardEmulationCategory.Payment,
                                SmartCardEmulationType.Host);

Para cartões de não pagamento HCE, a propriedade SmartCardEmulationCategory deve ser definida como Other, e a propriedade SmartCardEmulationType deve ser definida como Host.For non-payment HCE cards, the SmartCardEmulationCategory property should be set to Other and the SmartCardEmulationType property should be set to Host.

public static byte[] AID_OTHER =
        {
            (byte)'1', (byte)'2', (byte)'3', (byte)'4',
            (byte)'5', (byte)'6', (byte)'7', (byte)'8',
            (byte)'O', (byte)'T', (byte)'H', (byte)'E', (byte)'R'
        };

var appletIdGroup = new SmartCardAppletIdGroup(
                        "Example DisplayName",
                                new List<IBuffer> {AID_OTHER.AsBuffer()},
                                SmartCardEmulationCategory.Other,
                                SmartCardEmulationType.Host);

Você pode incluir até 9 AIDs (de 5 a 16 bytes cada) por grupo de AIDs.You can include up to 9 AIDs (of length 5-16 bytes each) per AID group.

Use o método RegisterAppletIdGroupAsync para registrar seu grupo de AIDs no sistema, o que retornará um objeto SmartCardAppletIdGroupRegistration.Use the RegisterAppletIdGroupAsync method to register your AID group with the system, which will return a SmartCardAppletIdGroupRegistration object. Por padrão, a propriedade ActivationPolicy do objeto de registro é definida como Disabled.By default, the ActivationPolicy property of the registration object is set to Disabled. Isso significa que, embora seus AIDs estejam registrados no sistema, eles não estão habilitados ainda e não receberão tráfego.This means even though your AIDs are registered with the system, they are not enabled yet and won’t receive traffic.

reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);

Você pode habilitar seus cartões registrados (grupos de AIDs) usando o método RequestActivationPolicyChangeAsync da classe SmartCardAppletIdGroupRegistration conforme mostrado a seguir.You can enable your registered cards (AID groups) by using the RequestActivationPolicyChangeAsync method of theSmartCardAppletIdGroupRegistration class as shown below. Como apenas um cartão de pagamento de cada vez pode ser habilitado no sistema, definir o ActivationPolicy de um grupo de AIDs de pagamento como Enabled é o mesmo que definir o cartão de pagamento padrão.Because only a single payment card can be enabled at a time on the system, setting the ActivationPolicy of a payment AID group to Enabled is the same as setting the default payment card. O usuário será solicitado a autorizar esse cartão como um cartão de pagamento padrão, independentemente do fato de haver um cartão de pagamento padrão já selecionado ou não.The user will be prompted to allow this card as a default payment card, regardless of whether there is a default payment card already selected or not. Esta instrução não será true se o aplicativo já for o aplicativo de pagamento padrão, e estará simplesmente alternando entre seus próprios grupos de AIDs.This statement is not true if your app is already the default payment application, and is merely changing between it’s own AID groups. Você pode registrar até 10 grupos de AIDs por aplicativo.You can register up to 10 AID groups per app.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);

É possível consultar seus grupos de AIDs do seu aplicativo registrados no sistema operacional e verificar sua política de ativação usando o método GetAppletIdGroupRegistrationsAsync.You can query your app’s registered AID groups with the OS and check their activation policy using the GetAppletIdGroupRegistrationsAsync method.

Os usuários serão avisados quando você alterar a política de ativação de um cartão de pagamento de Disabled para Enabled, somente se seu aplicativo ainda não for o aplicativo de pagamento padrão.Users will be prompted when you change the activation policy of a payment card from Disabled to Enabled, only if your app is not already the default payment app. Os usuários só serão avisados quando você alterar a política de ativação de um cartão de não pagamento de Disabled para Enabled se houver um conflito de AID.Users will only be prompted when you change the activation policy of a non-payment card from Disabled to Enabled if there is an AID conflict.

var registrations = await SmartCardEmulator.GetAppletIdGroupRegistrationsAsync();
    foreach (var registration in registrations)
    {
registration.RequestActivationPolicyChangeAsync (AppletIdGroupActivationPolicy.Enabled);
    }

Notificação de evento quando a política de ativação mudaEvent notification when activation policy change

Em sua tarefa em segundo plano, você pode se registrar para receber eventos para quando a política de ativação de um de seus grupos de AIDs mudar fora do aplicativo.In your background task, you can register to receive events for when the activation policy of one of your AID group registrations changes outside of your app. Por exemplo, o usuário pode alterar o aplicativo de pagamento padrão no menu de configurações de NFC de um dos cartões para outro cartão hospedado por outro aplicativo.For example, the user may change the default payment app through the NFC settings menu from one of your cards to another card hosted by another app. Se seu aplicativo precisar saber sobre essa alteração de configuração interna, como a atualização de blocos dinâmicos, você poderá receber notificações de eventos para essa alteração e agir da forma adequada no aplicativo.If your app needs to know about this change for internal setup such as updating live tiles, you can receive event notifications for this change and take action in your app accordingly.

var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorAppletIdGroupRegistrationChanged));
bgTask = taskBuilder.Register();

Comportamento de substituição em primeiro planoForeground override behavior

Você pode alterar o ActivationPolicy de qualquer um dos seus registros de grupo de AIDs para ForegroundOverride enquanto seu aplicativo estiver em primeiro plano sem avisar o usuário.You can change the ActivationPolicy of any of your AID group registrations to ForegroundOverride while your app is in the foreground without prompting the user. Quando o usuário toca no dispositivo em um terminal enquanto seu aplicativo está em primeiro plano, o tráfego é roteado para o aplicativo, mesmo que nenhum de seus cartões de pagamento tenha sido escolhido pelo usuário como o cartão de pagamento padrão.When the user taps their device to a terminal while your app is in the foreground, the traffic is routed to your app even if none of your payment cards were chosen by the user as their default payment card. Quando você altera a política de ativação de um cartão para ForegroundOverride, essa alteração é temporária somente até o aplicativo sair do primeiro plano, e não mudará o cartão de pagamento padrão atual definido pelo usuário.When you change a card’s activation policy to ForegroundOverride, this change is only temporary until your app leaves the foreground and it will not change the current default payment card set by the user. Você pode alterar o ActivationPolicy de seus cartões de pagamento ou de não pagamento de seu aplicativo em primeiro plano conforme explicado a seguir.You can change the ActivationPolicy of your payment or non-payment cards from your foreground app as follows. Observe que o método RequestActivationPolicyChangeAsync só pode ser chamado de um aplicativo em primeiro plano, e não de uma tarefa em segundo plano.Note that the RequestActivationPolicyChangeAsync method can only be called from a foreground app and cannot be called from a background task.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);

Além disso, você pode registrar um grupo de AIDs que consiste em um único AID de comprimento 0 que fará o sistema rotear todas as APDUs, independentemente do AID e incluindo quaisquer APDUs de comando enviadas antes de um comando SELECT AID ser recebido.Also, you can register an AID group consisting of a single 0-length AID which will cause the system to route all APDUs regardless of the AID and including any command APDUs sent before a SELECT AID command is received. Entretanto, esse grupo de AIDs funciona apenas enquanto seu aplicativo está em primeiro plano, pois ele só pode ser definido como ForegroundOverride e não pode ser habilitado permanentemente.However, such an AID group only works while your app is in the foreground because it can only be set to ForegroundOverride and cannot be permanently enabled. Além disso, esse mecanismo funciona para os valores Host e UICC da enumeração SmartCardEmulationType para rotear todo o tráfego para sua tarefa em segundo plano de HCE ou para o cartão SIM.Also, this mechanism works both for Host and UICC values of the SmartCardEmulationType enumeration to either route all traffic to your HCE background task, or to the SIM card.

public static byte[] AID_Foreground =
        {};

var appletIdGroup = new SmartCardAppletIdGroup(
                        "Example DisplayName",
                                new List<IBuffer> {AID_Foreground.AsBuffer()},
                                SmartCardEmulationCategory.Other,
                                SmartCardEmulationType.Host);
reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);
reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);

Verifique se há suporte para NFC e HCECheck for NFC and HCE support

Seu aplicativo deve verificar se um dispositivo tem hardware NFC, oferece suporte ao recurso de emulação de cartão e oferece suporte à emulação de cartão do host antes de oferecer esses recursos ao usuário.Your app should check whether a device has NFC hardware, supports the card emulation feature, and supports host card emulation prior to offering such features to the user.

O recurso de emulação de cartão inteligente NFC é habilitado apenas no Windows 10 Mobile; portanto, a tentativa de usar APIs do emulador de cartão inteligente em outras versões do Windows 10 causará erros.The NFC smart card emulation feature is only enabled on Windows 10 Mobile, so trying to use the smart card emulator APIs in any other versions of Windows 10, will cause errors. Você pode verificar se há suporte para a API do cartão inteligente no trecho de código a seguir.You can check for smart card API support in the following code snippet.

Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Devices.SmartCards.SmartCardEmulator");

Além disso, você pode verificar se o dispositivo tem o hardware NFC com capacidade para alguma forma de emulação de cartão verificando se o método SmartCardEmulator.GetDefaultAsync retorna null.You can additionally check to see if the device has NFC hardware capable of some form of card emulation by checking if the SmartCardEmulator.GetDefaultAsync method returns null. Se tiver, nenhuma emulação de cartão NFC será compatível com o dispositivo.If it does, then no NFC card emulation is supported on the device.

var smartcardemulator = await SmartCardEmulator.GetDefaultAsync();<

O suporte para roteamento UICC baseado em AID e HCE está disponível apenas em dispositivos lançados recentemente, como Lumia 730, 830, 640 e 640 XL.Support for HCE and AID-based UICC routing is only available on recently launched devices such as the Lumia 730, 830, 640, and 640 XL. Todos os novos dispositivos compatíveis com NFC que executem o Windows 10 Mobile e versões posteriores devem dar suporte a HCE.Any new NFC capable devices running Windows 10 Mobile and after should support HCE. Seu aplicativo pode verificar se há suporte a HCE como se segue.Your app can check for HCE support as follows.

Smartcardemulator.IsHostCardEmulationSupported();

Comportamento da tela de bloqueio e da tela desligadaLock screen and screen off behavior

O Windows 10 Mobile tem configurações de emulação de cartão em nível de dispositivo que podem ser definidas pela operadora móvel ou pelo fabricante do dispositivo.Windows 10 Mobile has device-level card emulation settings, which can be set by the mobile operator or the manufacturer of the device. Por padrão, a alternância de "tocar para pagar" é desabilitada e a "política de capacitação em nível de dispositivo" é definida como "Sempre", a menos que o OEM ou o MO substitua esses valores.By default, "tap to pay" toggle is disabled and the "enablement policy at device level" is set to "Always", unless the MO or OEM overwrites these values.

Seu aplicativo pode consultar o valor de EnablementPolicy no nível do dispositivo e executar uma ação para cada caso, dependendo do comportamento desejado de seu aplicativo em cada estado.Your application can query the value of the EnablementPolicy at device level and take action for each case depending on the desired behavior of your app in each state.

SmartCardEmulator emulator = await SmartCardEmulator.GetDefaultAsync();

switch (emulator.EnablementPolicy)
{
case Never:
// you can take the user to the NFC settings to turn "tap and pay" on
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-nfctransactions:"));
break;

 case Always:
return "Card emulation always on";

 case ScreenOn:
 return "Card emulation on only when screen is on";

 case ScreenUnlocked:
 return "Card emulation on only when screen unlocked";
}

A tarefa em segundo plano do seu aplicativo será iniciada mesmo se o telefone estiver bloqueado e/ou a tela estiver desligada somente se o leitor externo selecionar um AID que seja resolvido para o seu aplicativo.Your app's background task will be launched even if the phone is locked and/or the screen is off only if the external reader selects an AID that resolves to your app. Você pode responder aos comandos do leitor na sua tarefa em segundo plano, mas, se precisar de qualquer entrada do usuário ou se quiser mostrar uma mensagem ao usuário, você poderá iniciar seu aplicativo em primeiro plano com alguns argumentos.You can respond to the commands from the reader in your background task, but if you need any input from the user or if you want to show a message to the user, you can launch your foreground app with some arguments. Sua tarefa em segundo plano pode iniciar seu aplicativo em primeiro plano com o comportamento a seguir.Your background task can launch your foreground app with the following behavior.

  • Sob a tela de bloqueio do dispositivo (o usuário verá seu aplicativo em primeiro plano somente depois de desbloquear o dispositivo)Under the device lock screen (the user will see your foreground app only after she unlocks the device)
  • Acima da tela de bloqueio do dispositivo (depois que o usuário ignora o seu aplicativo, o dispositivo ainda está em estado bloqueado)Above the device lock screen (after the user dismisses your app, the device is still in locked state)
        if (Windows::Phone::System::SystemProtection::ScreenLocked)
        {
            // Launch above the lock with some arguments
            var result = await eventDetails.TryLaunchSelfAsync("app-specific arguments", SmartCardLaunchBehavior.AboveLock);
        }

Registro de AID e outras atualizações para aplicativos baseados em SIMAID registration and other updates for SIM based apps

Os aplicativos de emulação de cartão que usam o SIM como o elemento seguro podem se registrar no serviço Windows para declarar os AIDs com suporte no SIM.Card emulation apps that use the SIM as the secure element can register with the Windows service to declare the AIDs supported on the SIM. Esse registro é muito semelhante ao registro de um aplicativo baseado em HCE.This registration is very similar to an HCE-based app registration. A única diferença é o SmartCardEmulationType que deve ser definido como UICC para aplicativos baseados em SIM.The only difference is the SmartCardEmulationType, which should be set to Uicc for SIM-based apps. Como resultado do registro de cartão de pagamento, o nome de exibição do cartão também será populado no menu de configuração NFC.As the result of the payment card registration, the display name of the card will also be populated in the NFC setting menu.

var appletIdGroup = new SmartCardAppletIdGroup(
                        "Example DisplayName",
                                new List<IBuffer> {AID_PPSE.AsBuffer()},
                                SmartCardEmulationCategory.Payment,
                                SmartCardEmulationType.Uicc);

Importante

O suporte à intercepção de SMS binário herdado no Windows Phone 8.1 foi removido e substituído pelo novo suporte a SMS mais abrangente do Windows 10 Mobile, mas todos os aplicativos Windows Phone 8.1 herdados que dependem disso devem ser atualizados para usar as novas APIs de SMS do Windows 10 Mobile.The legacy binary SMS intercept support in Windows Phone 8.1 has been removed and replaced with new broader SMS support in Windows 10 Mobile, but any legacy Windows Phone 8.1 apps relying on that must update to use the new Windows 10 Mobile SMS APIs.