{"id":37022633,"url":"https://github.com/mvallim/emv-qrcode","last_synced_at":"2026-01-14T02:42:23.503Z","repository":{"id":46750655,"uuid":"283865430","full_name":"mvallim/emv-qrcode","owner":"mvallim","description":"Java Based EMV QR Code Generator and Parser (MPM, CPM)","archived":false,"fork":false,"pushed_at":"2023-06-21T03:55:10.000Z","size":3983,"stargazers_count":116,"open_issues_count":11,"forks_count":53,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-08-02T15:42:35.982Z","etag":null,"topics":["brcode","cpm","decode","emv","emv-qr","emv-qrcode","emv-qrcps","emvco","emvco-qr","fintech","java","kotlin","mpm","parser","payment-systems","pix","qr","qrcode","qrcps"],"latest_commit_sha":null,"homepage":"https://mvallim.github.io/emv-qrcode/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mvallim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-30T19:57:37.000Z","updated_at":"2025-07-25T08:13:17.000Z","dependencies_parsed_at":"2022-07-25T04:00:05.460Z","dependency_job_id":null,"html_url":"https://github.com/mvallim/emv-qrcode","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/mvallim/emv-qrcode","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvallim%2Femv-qrcode","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvallim%2Femv-qrcode/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvallim%2Femv-qrcode/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvallim%2Femv-qrcode/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mvallim","download_url":"https://codeload.github.com/mvallim/emv-qrcode/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvallim%2Femv-qrcode/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408712,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["brcode","cpm","decode","emv","emv-qr","emv-qrcode","emv-qrcps","emvco","emvco-qr","fintech","java","kotlin","mpm","parser","payment-systems","pix","qr","qrcode","qrcps"],"created_at":"2026-01-14T02:42:22.755Z","updated_at":"2026-01-14T02:42:23.485Z","avatar_url":"https://github.com/mvallim.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EMV QRCode\n\n![Java CI with Maven](https://github.com/mvallim/emv-qrcode/workflows/Java%20CI%20with%20Maven/badge.svg)\n[![CodeQL](https://github.com/mvallim/emv-qrcode/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/mvallim/emv-qrcode/actions/workflows/codeql-analysis.yml)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=emv-qrcode\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=emv-qrcode)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=emv-qrcode\u0026metric=coverage)](https://sonarcloud.io/dashboard?id=emv-qrcode)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.mvallim/emv-qrcode/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.mvallim/emv-qrcode)\n[![Hex.pm](https://img.shields.io/hexpm/l/plug.svg)](http://www.apache.org/licenses/LICENSE-2.0)\n\nJava Based EMV QR Code Generator and Parser (MPM, CPM)\n\n## Features\n\n* _**Compatible JDK 8, 11, 15, 16 and 17**_\n\n* Ready of specification for **Merchant Presented Mode v1.1**\n  * Encode MPM\n  * Decode MPM\n  * Check CRC16\n  * Checking duplicate tags\n  * Checking invalid tags\n  * Validation\n  * Supports BRCode aswell\n  * Thread safe\n  * Production ready (uses in several projects)\n  \n* Ready of specification for **Consumer Presented Mode v1.1**\n  * Encode CPM\n  * Decode CPM\n  * Validation\n  * Checking duplicate tags\n  * Thread safe\n\n## Specification\n\n* [EMV QR Code Specification for Payment Systems: Merchant Presented Mode v1.1](docs/EMVCo-Merchant-Presented-QR-Specification-v1-1.pdf)\n* [EMV QR Code Specification for Payment Systems: Consumer Presented Mode v1.1](docs/EMVCo-Consumer-Presented-QR-Specification-v1-1.pdf)\n* [EMV Book 3 Application Specification](docs/EMV_v4.3_Book_3_Application_Specification_20120607062110791.pdf)\n* [EMV Book 4 Other Interfaces](docs/EMV_v4.3_Book_4_Other_Interfaces_20120607062305603.pdf)\n\n## 1. Quick Start\n\nThis chapter will show you how to get started with EMV QR Code.\n\n### 1.1 Prerequisite\n\nIn order to use EMV QR Code within a Maven project, simply add the following dependency to your pom.xml. There are no other dependencies for EMV QR Code, which means other unwanted libraries will not overwhelm your project.\n\nYou can pull it from the central Maven repositories:\n\n#### Maven\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.mvallim\u003c/groupId\u003e\n    \u003cartifactId\u003eemv-qrcode\u003c/artifactId\u003e\n    \u003cversion\u003e0.1.2\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nIf you want to try a snapshot version, add the following repository:\n\n```xml\n\u003crepository\u003e\n    \u003cid\u003esonatype-snapshots\u003c/id\u003e\n    \u003cname\u003eSonatype Snapshots\u003c/name\u003e\n    \u003curl\u003ehttps://oss.sonatype.org/content/repositories/snapshots\u003c/url\u003e\n    \u003csnapshots\u003e\n        \u003cenabled\u003etrue\u003c/enabled\u003e\n    \u003c/snapshots\u003e\n\u003c/repository\u003e\n```\n\n#### Gradle\n\n```groovy\nimplementation 'com.github.mvallim:emv-qrcode:0.1.2'\n```\n\nIf you want to try a snapshot version, add the following repository:\n\n```groovy\nrepositories {\n    maven {\n        url \"https://oss.sonatype.org/content/repositories/snapshots\"\n    }\n}\n```\n\n### MPM (Merchant Presented Mode) Encode\n\n```java\nfinal AdditionalDataFieldTemplate additionalDataField = getAddtionalDataField();\nfinal MerchantAccountInformationTemplate merchanAccountInformationReservedAdditional = getMerchanAccountInformationReservedAdditional();\nfinal MerchantAccountInformationTemplate merchanAccountInformationReserved = getMerchanAccountInformationReserved();\nfinal MerchantInformationLanguageTemplate merchantInformationLanguage = getMerchantInformationLanguage();\nfinal UnreservedTemplate unreserved = getUnreserved();\nfinal TagLengthString rFUforEMVCo = new TagLengthString(\"65\", \"00\");\n\nfinal MerchantPresentedMode merchantPresentMode = new MerchantPresentedMode();\nmerchantPresentMode.setAdditionalDataField(additionalDataField);\nmerchantPresentMode.setCountryCode(\"CN\");\nmerchantPresentMode.setMerchantCategoryCode(\"4111\");\nmerchantPresentMode.setMerchantCity(\"BEIJING\");\nmerchantPresentMode.setMerchantInformationLanguage(merchantInformationLanguage);\nmerchantPresentMode.setMerchantName(\"BEST TRANSPORT\");\nmerchantPresentMode.setPayloadFormatIndicator(\"01\");\nmerchantPresentMode.setPointOfInitiationMethod(\"11\");\nmerchantPresentMode.setPostalCode(\"1234567\");\nmerchantPresentMode.setTipOrConvenienceIndicator(\"01\");\nmerchantPresentMode.setTransactionAmount(\"23.72\");\nmerchantPresentMode.setTransactionCurrency(\"156\");\nmerchantPresentMode.setValueOfConvenienceFeeFixed(\"500\");\nmerchantPresentMode.setValueOfConvenienceFeePercentage(\"5\");\nmerchantPresentMode.addMerchantAccountInformation(merchanAccountInformationReserved);\nmerchantPresentMode.addMerchantAccountInformation(merchanAccountInformationReservedAdditional);\nmerchantPresentMode.addRFUforEMVCo(rFUforEMVCo);\nmerchantPresentMode.addUnreserved(unreserved);\n\nSystem.out.println(merchantPresentMode.toString());\n  //0002010102110204000426160004hoge0104abcd520441115303156540523.7255020156035005\n  //70155802CN5914BEST TRANSPORT6007BEIJING610712345676295010512345020567890030509\n  //8760405543210505abcde0605fghij0705klmno0805pqres0905tuvxy5010000110101i6428000\n  //2ZH0102北京0204最佳运输0304abcd65020080320016A011223344998877070812345678630432B\n  //3\n\n// Primitive Payment System Merchant Account Information (IDs \"02\" to \"25\")\nprivate MerchantAccountInformationTemplate getMerchanAccountInformationReserved() {\n  final MerchantAccountInformationReserved merchantAccountInformationValue = new MerchantAccountInformationReserved(\"0004\");\n\n  return new MerchantAccountInformationTemplate(\"02\", merchantAccountInformationValue);\n}\n\n// Merchant Account Information Template (IDs \"26\" to \"51\")\nprivate MerchantAccountInformationTemplate getMerchanAccountInformationReservedAdditional() {\n  final TagLengthString paymentNetworkSpecific = new TagLengthString();\n  paymentNetworkSpecific.setTag(\"01\");\n  paymentNetworkSpecific.setValue(\"abcd\");\n\n  final MerchantAccountInformationReservedAdditional merchantAccountInformationValue = new MerchantAccountInformationReservedAdditional();\n  merchantAccountInformationValue.setGloballyUniqueIdentifier(\"hoge\");\n  merchantAccountInformationValue.addPaymentNetworkSpecific(paymentNetworkSpecific);\n\n  return new MerchantAccountInformationTemplate(\"26\", merchantAccountInformationValue);\n}\n\nprivate UnreservedTemplate getUnreserved() {\n  final TagLengthString contextSpecificData = new TagLengthString();\n  contextSpecificData.setTag(\"07\");\n  contextSpecificData.setValue(\"12345678\");\n\n  final Unreserved value = new Unreserved();\n  value.setGloballyUniqueIdentifier(\"A011223344998877\");\n  value.addContextSpecificData(contextSpecificData);\n\n  final UnreservedTemplate unreserved = new UnreservedTemplate();\n  unreserved.setValue(value);\n  unreserved.setTag(\"80\");\n\n  return unreserved;\n}\n\nprivate MerchantInformationLanguageTemplate getMerchantInformationLanguage() {\n\n  final TagLengthString rFUforEMVCo = new TagLengthString();\n  rFUforEMVCo.setTag(\"03\");\n  rFUforEMVCo.setValue(\"abcd\");\n\n  final MerchantInformationLanguage merchantInformationLanguageValue = new MerchantInformationLanguage();\n  merchantInformationLanguageValue.setLanguagePreference(\"ZH\");\n  merchantInformationLanguageValue.setMerchantName(\"北京\");\n  merchantInformationLanguageValue.setMerchantCity(\"最佳运输\");\n  merchantInformationLanguageValue.addRFUforEMVCo(rFUforEMVCo);\n\n  final MerchantInformationLanguageTemplate merchantInformationLanguage = new MerchantInformationLanguageTemplate();\n  merchantInformationLanguage.setValue(merchantInformationLanguageValue);\n\n  return merchantInformationLanguage;\n}\n\nprivate AdditionalDataFieldTemplate getAddtionalDataField() {\n  final PaymentSystemSpecific paymentSystemSpecific = new PaymentSystemSpecific();\n  paymentSystemSpecific.setGloballyUniqueIdentifier(\"1\");\n  paymentSystemSpecific.addPaymentSystemSpecific(new TagLengthString(\"01\", \"i\"));\n\n  final PaymentSystemSpecificTemplate paymentSystemSpecificTemplate = new PaymentSystemSpecificTemplate();\n  paymentSystemSpecificTemplate.setTag(\"50\");\n  paymentSystemSpecificTemplate.setValue(paymentSystemSpecific);\n\n  final AdditionalDataField additionalDataFieldValue = new AdditionalDataField();\n  additionalDataFieldValue.setAdditionalConsumerDataRequest(\"tuvxy\");\n  additionalDataFieldValue.setBillNumber(\"12345\");\n  additionalDataFieldValue.setCustomerLabel(\"fghij\");\n  additionalDataFieldValue.setLoyaltyNumber(\"54321\");\n  additionalDataFieldValue.setMobileNumber(\"67890\");\n  additionalDataFieldValue.setPurposeTransaction(\"pqres\");\n  additionalDataFieldValue.setReferenceLabel(\"abcde\");\n  additionalDataFieldValue.setStoreLabel(\"09876\");\n  additionalDataFieldValue.setTerminalLabel(\"klmno\");\n  additionalDataFieldValue.addPaymentSystemSpecific(paymentSystemSpecificTemplate);\n\n  final AdditionalDataFieldTemplate additionalDataField = new AdditionalDataFieldTemplate();\n  additionalDataField.setValue(additionalDataFieldValue);\n\n  return additionalDataField;\n}\n```\n\n### MPM (Merchant Presented Mode) Decode\n\n```java\n@Test\npublic void testSuccessDecode() throws MerchantPresentedModeException {\n\n  final String encoded = \"00020101021102160004hoge0104abcd520441115303156540523\"\n      + \".7255020256035005802CN5914BEST TRANSPORT6007BEIJING6107123456762800205\"\n      + \"678900305098760505abcde0705klmno0805pqres0903tuv1004abcd50160004123401\"\n      + \"04ijkl64280002ZH0102北京0204最佳运输0304abcd65020080320016A0112233449988\"\n      + \"7707081234567863046325\";\n\n  final MerchantPresentedMode merchantPresentedMode = DecoderMpm.decode(encoded, MerchantPresentedMode.class);\n\n  assertThat(merchantPresentedMode.getCountryCode().getValue(), equalTo(\"CN\"));\n  assertThat(merchantPresentedMode.getMerchantCategoryCode().getValue(), equalTo(\"4111\"));\n  assertThat(merchantPresentedMode.getMerchantCity().getValue(), equalTo(\"BEIJING\"));\n  assertThat(merchantPresentedMode.getMerchantName().getValue(), equalTo(\"BEST TRANSPORT\"));\n  assertThat(merchantPresentedMode.getPayloadFormatIndicator().getValue(), equalTo(\"01\"));\n  assertThat(merchantPresentedMode.getPointOfInitiationMethod().getValue(), equalTo(\"11\"));\n  assertThat(merchantPresentedMode.getPostalCode().getValue(), equalTo(\"1234567\"));\n  assertThat(merchantPresentedMode.getTipOrConvenienceIndicator().getValue(), equalTo(\"02\"));\n  assertThat(merchantPresentedMode.getTransactionAmount().getValue(), equalTo(\"23.72\"));\n  assertThat(merchantPresentedMode.getTransactionCurrency().getValue(), equalTo(\"156\"));\n  assertThat(merchantPresentedMode.getValueOfConvenienceFeeFixed().getValue(), equalTo(\"500\"));\n}\n\n@Test\npublic void testeFailDuplicateTag() throws MerchantPresentedModeException {\n\n  final String encoded = \"00020101021102160004hoge0104abcd5204411153031565303156\"\n      + \"540523.725502015603500570155802CN5914BEST TRANSPORT6007BEIJING610712345\"\n      + \"6762950105123450205678900305098760405543210505abcde0605fghij0705klmno08\"\n      + \"05pqres0905tuvxy5010000110101i64280002ZH0102北京0204最佳运输0304abcd65020\"\n      + \"080320016A011223344998877070812345678\";\n\n  final MerchantPresentedModeException merchantPresentedModeException = catchThrowableOfType(() -\u003e \n      DecoderMpm.decode(encoded, MerchantPresentedMode.class), MerchantPresentedModeException.class);\n\n  assertThat(merchantPresentedModeException, instanceOf(DuplicateTagException.class));\n\n  final DuplicateTagException duplicateTagException = DuplicateTagException.class.cast(merchantPresentedModeException);\n\n  assertThat(duplicateTagException.getTag(), equalTo(\"53\"));\n  assertThat(duplicateTagException.getValue(), equalTo(\"5303156\"));\n}\n```\n\n### MPM (Merchant Presented Mode) Validate\n\n```java\n@Test\npublic void testSuccessValidate() {\n\n  final MerchantPresentedMode merchantPresentMode = new MerchantPresentedMode();\n\n  merchantPresentMode.setCountryCode(\"CN\");\n  merchantPresentMode.setMerchantCategoryCode(\"4111\");\n  merchantPresentMode.setMerchantCity(\"BEIJING\");\n  merchantPresentMode.setMerchantName(\"BEST TRANSPORT\");\n  merchantPresentMode.setPayloadFormatIndicator(\"01\");\n  merchantPresentMode.setPointOfInitiationMethod(\"11\");\n  merchantPresentMode.setPostalCode(\"1234567\");\n  merchantPresentMode.setTipOrConvenienceIndicator(\"02\");\n  merchantPresentMode.setTransactionAmount(\"23.72\");\n  merchantPresentMode.setTransactionCurrency(\"156\");\n  merchantPresentMode.setValueOfConvenienceFeeFixed(\"500\");\n\n  final ValidationResult validationResult = MerchantPresentedModeValidate.validate(merchantPresentMode);\n\n  assertTrue(validationResult.isValid());\n}\n```\n\n### MPM (Merchant Presented Mode) Validate CRC16\n\n```java\n@Test\npublic void testSuccessCrc16Sample1() {\n\n  final String encoded = \"00020101021229300012D156000000000510A93FO3230Q31280012\"\n      + \"D15600000001030812345678520441115802CN5914BEST TRANSPORT6007BEIJING6420\"\n      + \"0002ZH0104最佳运输0202北京540523.7253031565502016233030412340603***0708A6\"\n      + \"0086670902ME91320016A0112233449988770708123456786304A13A\";\n\n  final ValidationResult validationResult = Crc16Validate.validate(encoded);\n\n  assertThat(validationResult.isValid(), equalTo(true));\n}\n\n@Test\npublic void testFailValidateWhenWithoutCRCDecoded() {\n\n  final String encoded = \"00020101021102160004hoge0104abcd520441115303156540523\"\n      + \".7255020256035005802CN5914BEST TRANSPORT6007BEIJING6107123456762800205\"\n      + \"678900305098760505abcde0705klmno0805pqres0903tuv1004abcd50160004123401\"\n      + \"04ijkl64280002ZH0102北京0204最佳运输0304abcd65020080320016A0112233449988\"\n      + \"77070812345678\";\n\n  final ValidationResult validationResult = Crc16Validate.validate(encoded);\n\n  assertThat(validationResult.isValid(), equalTo(false));\n  assertThat(validationResult.getErrors(), hasSize(1));\n  assertThat(validationResult.getErrors(), hasItem(hasProperty(\"message\", equalTo(\"Invalid CRC16\"))));\n  assertThat(validationResult.getErrors(), hasItem(hasProperty(\"attemptedValue\", equalTo(\"5678\"))));\n}\n```\n\n### CPM (Consumer Presented Mode) Encode\n\n```java\nfinal ConsumerPresentedMode consumerPresentedMode = new ConsumerPresentedMode();\n\nfinal ApplicationTemplate applicationTemplate1 = new ApplicationTemplate();\napplicationTemplate1.setApplicationDefinitionFileName(\"A0000000555555\");\napplicationTemplate1.setApplicationLabel(\"Product1\");\n\nfinal ApplicationTemplate applicationTemplate2 = new ApplicationTemplate();\napplicationTemplate2.setApplicationDefinitionFileName(\"A0000000666666\");\napplicationTemplate2.setApplicationLabel(\"Product2\");\n\nfinal CommonDataTransparentTemplate commonDataTransparentTemplate = new CommonDataTransparentTemplate();\ncommonDataTransparentTemplate.setIssuerApplicationData(\"06010A03000000\");\ncommonDataTransparentTemplate.setApplicationCryptogram(\"584FD385FA234BCC\");\ncommonDataTransparentTemplate.setApplicationTransactionCounter(\"0001\");\ncommonDataTransparentTemplate.setUnpredictableNumber(\"6D58EF13\");\n\nfinal CommonDataTemplate commonDataTemplate = new CommonDataTemplate();\ncommonDataTemplate.setApplicationPAN(\"1234567890123458\");\ncommonDataTemplate.setCardholderName(\"CARDHOLDER/EMV\");\ncommonDataTemplate.setLanguagePreference(\"ruesdeen\");\ncommonDataTemplate.setCommonDataTransparentTemplate(commonDataTransparentTemplate);\n\nconsumerPresentedMode.setPayloadFormatIndicator(new PayloadFormatIndicator());\nconsumerPresentedMode.addApplicationTemplate(applicationTemplate1);\nconsumerPresentedMode.addApplicationTemplate(applicationTemplate2);\nconsumerPresentedMode.setCommonDataTemplate(commonDataTemplate);\n\nassertThat(consumerPresentedMode.toHex(), equalTo(\"8505435056303161134F07A000000\"\n  + \"0555555500850726F647563743161134F07A0000000666666500850726F647563743262495A\"\n  + \"0812345678901234585F200E43415244484F4C4445522F454D565F2D08727565736465656E6\"\n  + \"4219F100706010A030000009F2608584FD385FA234BCC9F360200019F37046D58EF13\"));\n\nassertThat(consumerPresentedMode.toBase64(), equalTo(\"hQVDUFYwMWETTwegAAAAVVVVUA\"\n  + \"hQcm9kdWN0MWETTwegAAAAZmZmUAhQcm9kdWN0MmJJWggSNFZ4kBI0WF8gDkNBUkRIT0xERVIvR\"\n  + \"U1WXy0IcnVlc2RlZW5kIZ8QBwYBCgMAAACfJghYT9OF+iNLzJ82AgABnzcEbVjvEw==\"));\n```\n\n### CPM (Consumer Presented Mode) Decode\n\n```java\n@Test\npublic void testSuccessDecode() throws Exception {\n  final String encoded = \"hQVDUFYwMWETTwegAAAAVVVVUAhQcm9kdWN0MWETTwegAAAAZmZmUA\"\n    + \"hQcm9kdWN0MmJJWggSNFZ4kBI0WF8gDkNBUkRIT0xERVIvRU1WXy0IcnVlc2RlZW5kIZ8QBwY\"\n    + \"BCgMAAACfJghYT9OF+iNLzJ82AgABnzcEbVjvEw==\";\n\n  final ConsumerPresentedMode consumerPresentedMode = DecoderCpm.decode(encoded, ConsumerPresentedMode.class);\n\n  final PayloadFormatIndicator payloadFormatIndicator = consumerPresentedMode.getPayloadFormatIndicator();\n  assertThat(payloadFormatIndicator.getTag(), equalTo(ConsumerPresentedModeFieldCodes.ID_PAYLOAD_FORMAT_INDICATOR));\n  assertThat(payloadFormatIndicator.getStringValue(), equalTo(\"CPV01\"));\n\n  final ApplicationTemplate applicationTemplate1 = consumerPresentedMode.getApplicationTemplates().get(0);\n  assertThat(applicationTemplate1.getTag(), equalTo(ConsumerPresentedModeFieldCodes.ID_APPLICATION_TEMPLATE));\n  assertThat(applicationTemplate1.getApplicationDefinitionFileName().getTag(), equalTo(TagTransactionProcessingCodes.ID_APPLICATION_DEFINITION_FILE_NAME));\n  assertThat(applicationTemplate1.getApplicationDefinitionFileName().getStringValue(), equalTo(\"A0000000555555\"));\n  assertThat(applicationTemplate1.getApplicationLabel().getTag(), equalTo(TagTransactionProcessingCodes.ID_APPLICATION_LABEL));\n  assertThat(applicationTemplate1.getApplicationLabel().getStringValue(), equalTo(\"Product1\"));\n\n  final ApplicationTemplate applicationTemplate2 = consumerPresentedMode.getApplicationTemplates().get(1);\n  assertThat(applicationTemplate2.getTag(), equalTo(ConsumerPresentedModeFieldCodes.ID_APPLICATION_TEMPLATE));\n  assertThat(applicationTemplate2.getApplicationDefinitionFileName().getTag(), equalTo(TagTransactionProcessingCodes.ID_APPLICATION_DEFINITION_FILE_NAME));\n  assertThat(applicationTemplate2.getApplicationDefinitionFileName().getStringValue(), equalTo(\"A0000000666666\"));\n  assertThat(applicationTemplate2.getApplicationLabel().getTag(), equalTo(TagTransactionProcessingCodes.ID_APPLICATION_LABEL));\n  assertThat(applicationTemplate2.getApplicationLabel().getStringValue(), equalTo(\"Product2\"));\n\n  final CommonDataTemplate commonDataTemplate = consumerPresentedMode.getCommonDataTemplate();\n  assertThat(commonDataTemplate.getTag(), equalTo(ConsumerPresentedModeFieldCodes.ID_COMMON_DATA_TEMPLATE));\n  assertThat(commonDataTemplate.getApplicationPAN().getTag(), equalTo(TagTransactionProcessingCodes.ID_APPLICATION_PAN));\n  assertThat(commonDataTemplate.getApplicationPAN().getStringValue(), equalTo(\"1234567890123458\"));\n  assertThat(commonDataTemplate.getCardholderName().getTag(), equalTo(TagTransactionProcessingCodes.ID_CARDHOLDER_NAME));\n  assertThat(commonDataTemplate.getCardholderName().getStringValue(), equalTo(\"CARDHOLDER/EMV\"));\n  assertThat(commonDataTemplate.getLanguagePreference().getTag(), equalTo(TagTransactionProcessingCodes.ID_LANGUAGE_PREFERENCE));\n  assertThat(commonDataTemplate.getLanguagePreference().getStringValue(), equalTo(\"ruesdeen\"));\n  \n  final CommonDataTransparentTemplate commonDataTransparentTemplate = commonDataTemplate.getCommonDataTransparentTemplate();\n  assertThat(commonDataTransparentTemplate.getTag(), equalTo(ConsumerPresentedModeFieldCodes.ID_COMMON_DATA_TRANSPARENT_TEMPLATE));\n  assertThat(commonDataTransparentTemplate.getIssuerApplicationData().getTag(), equalTo(TagTransactionProcessingCodes.ID_ISSUER_APPLICATION_DATA));\n  assertThat(commonDataTransparentTemplate.getIssuerApplicationData().getStringValue(), equalTo(\"06010A03000000\"));\n  assertThat(commonDataTransparentTemplate.getApplicationCryptogram().getTag(), equalTo(TagTransactionProcessingCodes.ID_APPLICATION_CRYPTOGRAM));\n  assertThat(commonDataTransparentTemplate.getApplicationCryptogram().getStringValue(), equalTo(\"584FD385FA234BCC\"));\n  assertThat(commonDataTransparentTemplate.getApplicationTransactionCounter().getTag(), equalTo(TagTransactionProcessingCodes.ID_APPLICATION_TRANSACTION_COUNTER));\n  assertThat(commonDataTransparentTemplate.getApplicationTransactionCounter().getStringValue(), equalTo(\"0001\"));\n  assertThat(commonDataTransparentTemplate.getUnpredictableNumber().getTag(), equalTo(TagTransactionProcessingCodes.ID_UNPREDICTABLE_NUMBER));\n  assertThat(commonDataTransparentTemplate.getUnpredictableNumber().getStringValue(), equalTo(\"6D58EF13\"));\n}\n```\n\n### CPM (Consumer Presented Mode) Validate\n\n```java\n@Test\npublic void testSuccessValidate() {\n  final String encoded = \"hQVDUFYwMWETTwegAAAAVVVVUAhQcm9kdWN0MWETTwegAAAAZmZmUAhQcm9k\"\n      + \"dWN0MmJJWggSNFZ4kBI0WF8gDkNBUkRIT0xERVIvRU1WXy0IcnVlc2RlZW5kIZ8QBwYBCgMAAACfJ\"\n      + \"ghYT9OF+iNLzJ82AgABnzcEbVjvEw==\";\n\n  final ConsumerPresentedMode consumerPresentedMode = DecoderCpm.decode(encoded, ConsumerPresentedMode.class);\n\n  final ValidationResult validationResult = ConsumerPresentedModeValidate.validate(consumerPresentedMode);\n\n  assertTrue(validationResult.isValid());\n}\n\n@Test\npublic void testFailValidate() throws IOException {\n  final String encoded = \"hQVDUFYwMWEiTwegAAAAVVVVUAhQcm9kdWN0MV8gDE1hc3RlciBDbGFzc2E\"\n      + \"TTwegAAAAZmZmUAhQcm9kdWN0MmJJWggSNFZ4kBI0WF8gDkNBUkRIT0xERVIvRU1WXy0IcnVlc2R\"\n      + \"lZW5kIZ8QBwYBCgMAAACfJghYT9OF+iNLzJ82AgABnzcEbVjvEw==\";\n\n  final ConsumerPresentedMode consumerPresentedMode = DecoderCpm.decode(encoded, ConsumerPresentedMode.class);\n\n  final ValidationResult validationResult = ConsumerPresentedModeValidate.validate(consumerPresentedMode);\n\n  assertFalse(validationResult.isValid());\n  assertThat(validationResult.getErrors(), hasSize(1));\n  assertThat(validationResult.getErrors(), hasItem(hasProperty(\"code\", equalTo(\"5F20\"))));\n  assertThat(validationResult.getErrors(), hasItem(hasProperty(\"message\", equalTo(\"Duplicate definition tag on CommonDataTemplate\"))));\n  assertThat(validationResult.getErrors(), hasItem(hasProperty(\"attemptedValue\", equalTo(\"CARDHOLDER/EMV\"))));\n}\n```\n\n## Contributing\n\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.\n\n## Versioning\n\nWe use [GitHub](https://github.com/mvallim/emv-qrcode) for versioning. For the versions available, see the [tags on this repository](https://github.com/mvallim/emv-qrcode/tags).\n\n## Authors\n\n* **Marcos Vallim** - *Initial work, Development, Test, Documentation* - [mvallim](https://github.com/mvallim)\n\nSee also the list of [contributors](CONTRIBUTORS.txt) who participated in this project.\n\n## License\n\nThis project is licensed under the Apache License - see the [LICENSE](LICENSE) file for details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmvallim%2Femv-qrcode","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmvallim%2Femv-qrcode","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmvallim%2Femv-qrcode/lists"}