MasterpassQRCoreSDK 2.0.5

MasterpassQRCoreSDK 2.0.5

测试已测试
语言语言 Obj-CObjective C
许可证 自定义
发布最新版本2021年5月

由以下人员维护:Muhammad AzeemMastercard LabsMani Tiwaree



  • Mastercard

Masterpass QR Core SDK

此 SDK 为解析 Push Payment QR 码提供了解析器。

您可以通过填充数据并使用 PushPaymentData.generatePushPaymentString() 来生成 Push Payment QR 码字符串。有关更多信息,请参阅文档。

此 sdk 仅处理实际的 QR 码字符串。因此,您需要使用单独的 QR 扫描 SDK 来获取 QR 码字符串。您可以使用 Masterpass QR Scan SDK

此 SDK 使用 Objective-C 开发,并与 Swift 兼容。

要求

  1. Xcode 9.0+
  2. iOS 8.0+

功能

  1. 解析和验证 Push Payment QR 码字符串的能力。
  2. 生成 Push Payment QR 码字符串。

文档

代码文档可以在 Github 链接 这里 找到。

安装

Cocoapods

  • 在您的 Podfile 中写下以下内容

    use_frameworks!
    pod 'MasterpassQRCoreSDK'
    
  • 执行 pod install

  • 现在已设置完成

手动

Swift
  • 下载 Masterpass QR Core SDK 的最新版本。

  • 解压文件。

  • 前往 Xcode 项目目标“通用”设置。将 MasterpassQRCoreSDK.framework 拖动到“已嵌入的二进制文件”部分。一定要选择 需要时复制 并单击完成。

  • 在您的应用程序目标的“构建阶段”中创建一个新的 运行脚本阶段,并将以下片段粘贴到脚本文本字段中

    bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/MasterpassQRCoreSDK.framework/strip-frameworks.sh"

    此步骤是解决在存档通用二进制文件时 App Store 提交错误的必需步骤。

Objective-C
  • 遵循与 Swift 相同的说明

用法

解析

Swift

import MasterpassQRCoreSDK

func parseQRCode(code: String) {
  do {
      // Parse qr code
      let pushData = try MPQRParser.parse(string:code)
      // Print data in string format
      print(pushData.dumpData())
  } catch let error as MPQRError{
      if let str = error.getString(){
           print("Error: \(str)")
      }else
      {
          print("Unknown error occurred \(error)")
      }
  } catch {
      print("Unknown error occurred \(error)")
  }
}

Objective-C

@import MasterpassQRCoreSDK;

- (void)parseQRCode:(NSString *)code {
    PushPaymentData *pushPaymentData;
    NSString* (^handleError)(MPQRError *) = ^NSString* (MPQRError* error) {
        if (error.domain == MPQRErrorDomain) {
            return [NSString stringWithFormat:@"Error: %@", [error getString]];
        }
        return [NSString stringWithFormat:@"Unkown error occured %@", error];
    };

    MPQRError *error;
    pushPaymentData = [MPQRParser parse:code error:&error];

    if (error) {
        NSLog(handleError(error));
    }else
    {
        NSLog([pushPaymentData dumpData]);
    }
}

生成

Swift

import CoreImage

func generateQRCode(from string: String) -> UIImage? {
    let data = string.data(using: String.Encoding.utf8)

    if let filter = CIFilter(name: "CIQRCodeGenerator") {
        filter.setValue(data, forKey: "inputMessage")
        // Set scale according to your device display. If the qr code is blurry then increase scale
        let transform = CGAffineTransform(scaleX: 3, y: 3)

        if let output = filter.outputImage?.applying(transform) {
            return UIImage(ciImage: output)
        }
    }
    return nil
}

func generatePushPaymentQR() {
    // Generate
    let pushPaymentData = PushPaymentData()

    // Set required properties on push payment data e.g pushPaymentData.payloadFormatIndicator = "01"

    // Payload format indicator
    pushPaymentData.payloadFormatIndicator = "01"

    // Point of initiation method
    pushPaymentData.pointOfInitiationMethod = "12"

    // Merchant identifier Visa with tag `02`
    pushPaymentData.merchantIdentifierVisa02 = "4600678934521435"

    // Merchant identifier Visa with tag `03`
    pushPaymentData.merchantIdentifierVisa03 = "4600678934521467"

    // Merchant identifier MasterCard with tag `04`
    pushPaymentData.merchantIdentifierMastercard04 = "555544443333111"

    // Merchant identifier MasterCard with tag `05`
    pushPaymentData.merchantIdentifierMastercard05 = "555544443333222"

    // Merchant identifier NPCI with tag `06`
    pushPaymentData.merchantIdentifierNPCI06 = "5600678934521435"

    // Merchant identifier NPCI with tag `07`
    pushPaymentData.merchantIdentifierNPCI07 = "5600678934521459"

    //Merchant identifier (EMVCo)IFSCCode
    pushPaymentData.merchantIdentifierIFSCCODE08 = "6800678934521565"

    //Merchant identifier (Discover)
    pushPaymentData.merchantIdentifierDISCOVER09 = "7800678934521675"

    //Merchant identifier (Discover)
    pushPaymentData.merchantIdentifierDISCOVER10 = "7900678934521655"

    //Merchant identifier (Amex)
    pushPaymentData.merchantIdentifierAMEX11 = "3200678934521434"

    //Merchant identifier (Amex)
    pushPaymentData.merchantIdentifierAMEX12 = "3400678934521469"

    //Merchant identifier (JCB)
    pushPaymentData.merchantIdentifierJCB13 = "5700678934521457"

    //Merchant identifier (JCB)
    pushPaymentData.merchantIdentifierJCB14 = "5800678934521435"

    //Merchant identifier (UnionPay)
    pushPaymentData.merchantIdentifierUNIONPAY15 = "5800678934524535"

    //Merchant identifier (UnionPay)
    pushPaymentData.merchantIdentifierUNIONPAY16 = "4850678934521598"

    //17 - 25 for merchant identifier EMVCO
    try! pushPaymentData.setMerchantIdentifierEMVCODataForTagString("17", data: "4657678934521449")


    //Merchant Identifier data 26-51
    let maiData = MAIData()
    var rootTag = "26"
    maiData.setRootTag(rootTag)
    maiData.AID = "AID0349509H"
    try! maiData.setPaymentNetworkSpecific("PNS93484jf", forTag:"01")
    try! maiData.setDynamicPaymentNetworkSpecific("PNSDyn8494738")
    var str01 = try!maiData.getPaymentNetworkSpecific(forTag: "01")
    var arr = maiData.getAllDynamicPaymentNetworkSpecificTags()!
    print("testSamplePushPaymentData = \(str01) \(arr)")
    try! pushPaymentData.setMAIDataForTagString(rootTag, data: maiData)

    // Merchant category code
    pushPaymentData.merchantCategoryCode = "1434"

    // Transaction currency code
    pushPaymentData.transactionCurrencyCode = "156"

    // Transaction amount
    pushPaymentData.transactionAmount = "83.80"

    let tipType = TipConvenienceIndicator.percentageConvenienceFee
    switch tipType {
    case .promptedToEnterTip:
        // Tip or convenience indicator
        pushPaymentData.tipOrConvenienceIndicator = "01"
    case .flatConvenienceFee:
        // Tip or convenience indicator
        pushPaymentData.tipOrConvenienceIndicator = "02"
        // Value of convenience fee fixed
        pushPaymentData.valueOfConvenienceFeeFixed = "10"
    case .percentageConvenienceFee:
        // Tip or convenience indicator
        pushPaymentData.tipOrConvenienceIndicator = "03"
        // Value of convenience fee percentage
        pushPaymentData.valueOfConvenienceFeePercentage = "5"
    case .unknownTipConvenienceIndicator:
        print("do nothing")
    }

    // Country code
    pushPaymentData.countryCode = "CN"

    // Merchant name
    pushPaymentData.merchantName = "BEST TRANSPORT"

    // Merchant city
    pushPaymentData.merchantCity = "BEIJING"

    // Postal code
    pushPaymentData.postalCode = "56748"


    // Additional data
    let addData = AdditionalData()
    addData.storeId = "A6008"
    addData.loyaltyNumber = "***"
    addData.terminalId = "A6008667"
    addData.additionalConsumerDataRequest = "ME"

    var rootSubTag = "50"
    var additionalUnrestrictedData = UnrestrictedData()
    additionalUnrestrictedData.setRootTag(rootSubTag)
    additionalUnrestrictedData.AID = "GUI123"
    try! additionalUnrestrictedData.setContextSpecific("CONT", forTag: "01")
    try! additionalUnrestrictedData.setDynamicContextSpecific("DYN6")
    str01 = try!additionalUnrestrictedData.getContextSpecificData(forTag: "01")
    arr = additionalUnrestrictedData.getAllDynamicContextSpecificDataTags()!
    try! addData.setUnreserved(additionalUnrestrictedData, forTag: rootSubTag)

    rootSubTag = "51"
    additionalUnrestrictedData = UnrestrictedData()
    additionalUnrestrictedData.AID = "GUI2"
    try! additionalUnrestrictedData.setContextSpecific("CON", forTag: "01")
    try! additionalUnrestrictedData.setDynamicContextSpecific("DYN22")
    str01 = try!additionalUnrestrictedData.getContextSpecificData(forTag: "01")
    arr = additionalUnrestrictedData.getAllDynamicContextSpecificDataTags()!
    try! addData.setDynamicTag(additionalUnrestrictedData)

    pushPaymentData.additionalData = addData

    // CRC
    pushPaymentData.crc = "6403"

    // Language Data
    let langData = LanguageData()
    langData.languagePreference = "ZH"
    langData.alternateMerchantCity = "北京"
    langData.alternateMerchantName = "最佳运输"
    pushPaymentData.languageData = langData

    //unrestricted data
    rootTag = "88"
    let unrestrictedData = UnrestrictedData()
    unrestrictedData.setRootTag(rootTag)
    unrestrictedData.AID = "GUI12319494"
    try! unrestrictedData.setContextSpecific("CONT7586F", forTag: "01")
    try! unrestrictedData.setDynamicContextSpecific("DYN647382")
    str01 = try!unrestrictedData.getContextSpecificData(forTag: "01")
    arr = unrestrictedData.getAllDynamicContextSpecificDataTags()!
    try! pushPaymentData.setUnreservedDataForTagString(rootTag, data: unrestrictedData)

    var ppdString:String?
    do {
        // Validate generated data
        ppdString = try pushPaymentData.generatePushPaymentString()
    } catch {
        print("Error occurred during validation \(error)")
        return
    }
    
    // Generate image
    let image = generateQRCode(from: ppdString!)
}

Objective-C

@import CoreImage;

- (UIImage *)generateQRCode:(NSString *)string {
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    if (!filter || !data)
        return nil;

    [filter setValue:data forKey:@"inputMessage"];
    CGAffineTransform transform = CGAffineTransformMakeScale(3, 3);
    CIImage *image = [[filter outputImage] imageByApplyingTransform:transform];
    return [UIImage imageWithCIImage:image];
}

- (void)generatePushPaymentQR {
    // Generate
    PushPaymentData *pushPaymentData = [[PushPaymentData alloc] init];

    // Set required properties on push payment data e.g pushPaymentData.payloadFormatIndicator = @"01"

    // Payload format indicator
    pushPaymentData.payloadFormatIndicator = @"01";

    // Point of initiation method
    pushPaymentData.pointOfInitiationMethod = @"12";

    // Merchant identifier Visa with tag `02`
    pushPaymentData.merchantIdentifierVisa02 = @"4600678934521435";

    // Merchant identifier Visa with tag `03`
    pushPaymentData.merchantIdentifierVisa03 = @"4600678934521467";

    // Merchant identifier MasterCard with tag `04`
    pushPaymentData.merchantIdentifierMastercard04 = @"555544443333111";

    // Merchant identifier MasterCard with tag `05`
    pushPaymentData.merchantIdentifierMastercard05 = @"555544443333222";

    // Merchant identifier NPCI with tag `06`
    pushPaymentData.merchantIdentifierNPCI06 = @"5600678934521435";

    // Merchant identifier NPCI with tag `07`
    pushPaymentData.merchantIdentifierNPCI07 = @"5600678934521459";

    //Merchant identifier (EMVCo)IFSCCode
    pushPaymentData.merchantIdentifierIFSCCODE08 = @"6800678934521565";

    //Merchant identifier (Discover)
    pushPaymentData.merchantIdentifierDISCOVER09 = @"7800678934521675";

    //Merchant identifier (Discover)
    pushPaymentData.merchantIdentifierDISCOVER10 = @"7900678934521655";

    //Merchant identifier (Amex)
    pushPaymentData.merchantIdentifierAMEX11 = @"3200678934521434";

    //Merchant identifier (Amex)
    pushPaymentData.merchantIdentifierAMEX12 = @"3400678934521469";

    //Merchant identifier (JCB)
    pushPaymentData.merchantIdentifierJCB13 = @"5700678934521457";

    //Merchant identifier (JCB)
    pushPaymentData.merchantIdentifierJCB14 = @"5800678934521435";

    //Merchant identifier (UnionPay)
    pushPaymentData.merchantIdentifierUNIONPAY15 = @"5800678934524535";

    //Merchant identifier (UnionPay)
    pushPaymentData.merchantIdentifierUNIONPAY16 = @"4850678934521598";

    //17 - 25 for merchant identifier EMVCO
    MPQRError* error;
    [pushPaymentData setMerchantIdentifierEMVCODataForTagString:@"17" data:@"4657678934521449" error:&error];

    //Merchant Identifier data 26-51
    MAIData* maiData = [MAIData new];
    NSString* rootTag = @"26";
    [maiData setRootTag:rootTag];
    maiData.AID = @"AID0349509H";
    [maiData setPaymentNetworkSpecific:@"PNS93484jf" forTag:@"01" error:&error];
    [maiData setDynamicPaymentNetworkSpecific:@"PNSDyn8494738" error:&error];
    NSString* strValue01 = [maiData getPaymentNetworkSpecificForTag:@"01" error:&error];
    NSArray* arrTags = [maiData getAllDynamicPaymentNetworkSpecificTags];
    [pushPaymentData setMAIDataForTagString:rootTag data:maiData error:&error];

    // Merchant category code
    pushPaymentData.merchantCategoryCode = @"1434";

    // Transaction currency code
    pushPaymentData.transactionCurrencyCode = @"156";

    // Transaction amount
    pushPaymentData.transactionAmount = @"83.80";

    TipConvenienceIndicator tipType = percentageConvenienceFee;
    switch (tipType) {
        case promptedToEnterTip:
            // Tip or convenience indicator
            pushPaymentData.tipOrConvenienceIndicator = @"01";
            break;
        case flatConvenienceFee:
            // Tip or convenience indicator
            pushPaymentData.tipOrConvenienceIndicator = @"02";
            // Value of convenience fee fixed
            pushPaymentData.valueOfConvenienceFeeFixed= @"10";
            break;
        case percentageConvenienceFee:
            // Tip or convenience indicator
            pushPaymentData.tipOrConvenienceIndicator = @"03";
            // Value of convenience fee percentage
            pushPaymentData.valueOfConvenienceFeePercentage = @"5";
        default:
            break;
    }

    // Country code
    pushPaymentData.countryCode = @"CN";

    // Merchant name
    pushPaymentData.merchantName = @"BEST TRANSPORT";

    // Merchant city
    pushPaymentData.merchantCity = @"BEIJING";

    // Postal code
    pushPaymentData.postalCode = @"56748";

    // Additional data
    AdditionalData* addData = [AdditionalData new];
    addData.storeId = @"A6008";
    addData.loyaltyNumber = @"***";
    addData.terminalId = @"A6008667";
    addData.additionalConsumerDataRequest = @"ME";

    NSString* rootSubTag = @"50";
    UnrestrictedData* additionalUnrestrictedData = [UnrestrictedData new];
    [additionalUnrestrictedData setRootTag:rootSubTag];
    additionalUnrestrictedData.AID = @"GUI123";
    [additionalUnrestrictedData setContextSpecificData:@"CONT" forTag:@"01" error:&error];
    [additionalUnrestrictedData setDynamicContextSpecificData:@"DYN6" error:&error];
    strValue01 = [additionalUnrestrictedData getContextSpecificDataForTag:@"01" error:&error];
    arrTags = [additionalUnrestrictedData getAllDynamicContextSpecificDataTags];
    [addData setUnreservedData:additionalUnrestrictedData forTag:rootSubTag error:&error];

    rootSubTag = @"51";
    additionalUnrestrictedData = [UnrestrictedData new];
    additionalUnrestrictedData.AID = @"GUI2";
    [additionalUnrestrictedData setContextSpecificData:@"CON" forTag:@"01" error:&error];
    [additionalUnrestrictedData setDynamicContextSpecificData:@"DYN22" error:&error];
    strValue01 = [additionalUnrestrictedData getContextSpecificDataForTag:@"01" error:&error];
    arrTags = [additionalUnrestrictedData getAllDynamicContextSpecificDataTags];
    [addData setDynamicTag:additionalUnrestrictedData error:&error];

    pushPaymentData.additionalData = addData;

    // CRC
    pushPaymentData.crc = @"6403";

    // Language Data
    LanguageData* langData = [LanguageData new];
    langData.languagePreference = @"ZH";
    langData.alternateMerchantCity = @"北京";
    langData.alternateMerchantName = @"最佳运输";
    pushPaymentData.languageData = langData;

    //unrestricted data
    rootTag = @"88";
    UnrestrictedData* unrestrictedData = [UnrestrictedData new];
    [unrestrictedData setRootTag:rootTag];
    unrestrictedData.AID = @"GUI12319494";
    [unrestrictedData setContextSpecificData:@"CONT7586F" forTag:@"01" error:&error];
    [unrestrictedData setDynamicContextSpecificData:@"DYN647382" error:&error];
    strValue01 = [unrestrictedData getContextSpecificDataForTag:@"01" error:&error];
    arrTags = [unrestrictedData getAllDynamicContextSpecificDataTags];
    [pushPaymentData setTagInfoValue:unrestrictedData forTagString:rootTag error:&error];

    NSString* strQRCode = [pushPaymentData generatePushPaymentString:&error];

    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        // Generate image
        UIImage *image = [self generateQRCode: strQRCode];
    }
}