获取并了解磁条数据

本主题介绍如何使用通用 Windows 平台 (UWP) 服务点 (POS) API 从磁条阅读器获取数据并进行解释。

订阅 *DataReceived 事件

使用服务点入门中概述的步骤在应用程序中设置磁条阅读器后,你就可以开始从中获取数据了。

每当读卡器识别出刷卡时,它将引发以下三个事件之一:

你的应用程序只需要订阅磁条阅读器支持的事件。 你可以查看 MagneticStripeReader.SupportedCardTypes 支持哪些类型的卡片。

以下代码演示了订阅三个 *DataReceived 事件:

private void SubscribeToEvents(ClaimedMagneticStripeReader claimedReader, MagneticStripeReader reader)
{
    foreach (var type in reader.SupportedCardTypes)
    {
        if (item == MagneticStripeReaderCardTypes.Aamva)
        {
            claimedReader.AamvaCardDataReceived += Reader_AamvaCardDataReceived;
        }
        else if (item == MagneticStripeReaderCardTypes.Bank)
        {
            claimedReader.BankCardDataReceived += Reader_BankCardDataReceived;
        }
        else if (item == MagneticStripeReaderCardTypes.ExtendedBase)
        {
            claimedReader.VendorSpecificDataReceived += Reader_VendorSpecificDataReceived;
        }
    }
}

事件处理程序将传递 ClaimedMagneticStripeReader 和一个 args 对象,其类型将根据事件而有所不同:

获取数据

对于 AamvaCardDataReceivedBankCardDataReceived 事件,你可以直接从 args 对象中获取一些数据。 以下示例演示了获取一些属性并将它们分配给成员变量:

private string _accountNumber;
private string _expirationDate;
private string _firstName;

private void Reader_BankCardDataReceived(
    ClaimedMagneticStripeReader sender, 
    MagneticStripeReaderBankCardDataReceivedEventArgs args)
{
    _accountNumber = args.AccountNumber;
    _expirationDate = args.ExpirationDate;
    _firstName = args.FirstName;
    // etc...
}

但是,某些数据,包括来自 VendorSpecificDataReceived 事件的所有数据,必须通过 Report 对象检索,该对象是 args 参数的一个属性。 这是 MagneticStripeReaderReport 类型。

你可以使用 CardType 属性来确定已刷卡的类型,然后使用它来告知你如何解释来自 Track1Track2, Track3Track4 的数据。

每个轨迹的数据都表示为 MagneticStripeReaderTrackData 对象。 从这个类中,你可以获得以下类型的数据:

以下代码片段获取报告和跟踪数据,然后检查卡类型:

private void GetTrackData(MagneticStripeReaderBankCardDataReceivedEventArgs args)
{
    MagneticStripeReaderReport report = args.Report;
    IBuffer track1 = report.Track1.Data;
    IBuffer track2 = report.Track2.Data;
    IBuffer track3 = report.Track3.Data;
    IBuffer track4 = report.Track4.Data;

    if (report.CardType == MagneticStripeReaderCardTypes.Aamva)
    {
        // Card type is AAMVA
    }
    else if (report.CardType == MagneticStripeReaderCardTypes.Bank)
    {
        // Card type is bank card
    }
    else if (report.CardType == MagneticStripeReaderCardTypes.ExtendedBase)
    {
        // Card type is vendor-specific
    }
    else if (report.CardType == MagneticStripeReaderCardTypes.Unknown)
    {
        // Card type is unknown
    }
}

支持和反馈

查找问题的答案

有问题? 请在文档问答论坛上使用 UWP 标记或在 Stack Overflow 上使用 pointofservice 标记向我们提问。

帮助我们找到你的问题:

  • 在 Stack Overflow 上,将 pointofservice 标记添加到你的问题中。
  • 在问答论坛上,将“UWP”一词添加到你的帖子中

另请参阅