5. How to use PayOn khqr library

@PayOn development group

PayOn khqr library is follow to Khqr spec and add more spec for PayOn app to use.

5.1 Generate QR data

First we create new PayloadAPI and set id, value (setId(), setValue()) according to we need the field, then add payloadAPI object to map by use field id for map key.

ID

Sub ID

Name

Variable

Length

"00"

payload format indicator

payload_format_indicator_value

02

"01"

point of initiation method

point_of_initiation_method_value

02

RFU

merchant account information template

merchant_account_template

02

RFU

merchant account information

merchant_account_info_id (input ),

merchant_account_info_value (input value)

Var. up to 99

"52"

merchant category code

country_code_value

04

"53"

transaction currency

transaction_currency_value

03

"58"

country code

country_code_value

02

"54"

transaction amount

transaction_amount_value

Var. up to 13

"89"

merchant name

merchant_name_value

Var. up to 25

"60"

merchant city

transaction_currency_value

Var. up to 15

"55"

convenience indicator

tip_or_con_indicator_value

02

"61"

postal code

postal_code_value

10

"56"

convenience fee fixed

value_of_convenience_fee_fixed_value

Var. up to 13

"57"

convenience fee percentage

value_of_con_fee_percentage_value

Var. up to 05

"62"

additional data

Var. up to 99

"01"

bill number

bill_number_value

Var. up to 25

"02"

mobile number

mobile_number_value

Var. up to 25

"03"

store label

store_label_value

Var. up to 25

"04"

loyalty number

loyalty_number_value

Var. up to 25

"05"

reference label

reference_label_value

Var. up to 25

"06"

customer label

customer_label_value

Var. up to 25

"07"

terminal id

terminal_label_value

Var. up to 25

"08"

purpose of transaction

purpose_of_transaction_value

Var. up to 25

"09"

consumer

add_consumer_data_req_value

Var. up to 25

"10" to "49"

emvco

reserved_for_emvco_value

Var. up to 25

"50"

fps

reserved_for_fps_value

Var. up to 25

"51" tp "55"

wg

reserved_for_the_wg_value

Var. up to 25

"56"-"99"

cambodia payment

reserved_for_cam_pay_opt_value

Var. up to 25

"81"

transaction id (PayOn)

transaction_id_value

Var. up to 16

"82"

terminal id (PayOn)

terminal_id_value

10

"83"

transaction type (PayOn)

transaction_type_value

2

"84"

api mode (PayOn)

api_mode_value

1

"85"

request date (PayOn)

req_date_value

14

"86"

merchant id (PayOn)

merchant_value

8

"87"

product id (PayOn)

product_value

8

"88"

ticket (PayOn)

ticket_value

16

"89"

purchase datetime (PayOn)

purchase_datetime_value

14

"90"

product name (PayOn)

product_name_value

Var. up to 50

"91"

product image (PayOn)

product_image_value

Var. up to 50

"92"

member id (PayOn)

member_value

Var. up to 50

"93"

quantity gifton (PayOn)

quantity_value

Var. up to 50

"64"

merchant information - language template

Var. up to 99

"00"

language preference

language_preference_value

02

"01"

merchant name - alternate language

merchant_name_alt_lang_value

Var. up to 25

"02"

merchant city alternate language

merchant_city_alt_lang_value

Var. up to 25

"03" to "99"

rfu for emvco

Var. up to 99

PayloadAPIMap payloadAPIMap = new PayloadAPIMap();
PayloadAPI khqrPayLoad;

// Main 00
ArrayList<PayloadAPI> payloadFormatIndicator = new ArrayList<>();
khqrPayLoad = new PayloadAPI();
khqrPayLoad.setId("00");
khqrPayLoad.setValue("01");
payloadFormatIndicator.add(khqrPayLoad);
payloadAPIMap.put(0, payloadFormatIndicator); // Main 01

// Main 01
ArrayList<PayloadAPI> pointOfInitMethod = new ArrayList<>();
khqrPayLoad = new PayloadAPI();
khqrPayLoad.setId("01");
khqrPayLoad.setValue("12");
pointOfInitMethod.add(khqrPayLoad);
payloadAPIMap.put(1, pointOfInitMethod); // Main 01

// Main 52
ArrayList<PayloadAPI> merchantCategoryCode = new ArrayList<>();
khqrPayLoad = new PayloadAPI();
khqrPayLoad.setId("52");
khqrPayLoad.setValue("0000");
merchantCategoryCode.add(khqrPayLoad);
payloadAPIMap.put(52, merchantCategoryCode); // Main 52

// Main 53
ArrayList<PayloadAPI> transactionCurrency = new ArrayList<>();
khqrPayLoad = new PayloadAPI();
khqrPayLoad.setId("53");
khqrPayLoad.setValue("840");
transactionCurrency.add(khqrPayLoad);
payloadAPIMap.put(53, transactionCurrency); // Main 53

// Main 54
ArrayList<PayloadAPI> transactionAmount= new ArrayList<>();
khqrPayLoad = new PayloadAPI();
khqrPayLoad.setId("54");
khqrPayLoad.setValue("100");
transactionAmount.add(khqrPayLoad);
payloadAPIMap.put(54, transactionAmount); // Main 54

// Main 58
ArrayList<PayloadAPI> countryCode = new ArrayList<>();
khqrPayLoad = new PayloadAPI();
khqrPayLoad.setId("58");
khqrPayLoad.setValue("KH");
countryCode.add(khqrPayLoad);
payloadAPIMap.put(58, countryCode); // Main 58

// Main 59
ArrayList<PayloadAPI> merchantName = new ArrayList<>();
khqrPayLoad = new PayloadAPI();
khqrPayLoad.setId("59");
khqrPayLoad.setValue("Cafe PayOn");
merchantName.add(khqrPayLoad);
payloadAPIMap.put(59, merchantName); // Main 59

// Main 60
ArrayList<PayloadAPI> merchantCity = new ArrayList<>();
khqrPayLoad = new PayloadAPI();
khqrPayLoad.setId("60");
khqrPayLoad.setValue("Phnom Penh");
merchantCity.add(khqrPayLoad);
payloadAPIMap.put(60, merchantCity); // Main 60

// Additional Data Template
ArrayList<PayloadAPI> additionalDataTemp = new ArrayList<>();
khqrPayLoad = new PayloadAPI(); // 01
khqrPayLoad.setId("01");
khqrPayLoad.setValue("2104200000007145");
additionalDataTemp.add(khqrPayLoad);
khqrPayLoad = new PayloadAPI(); // 03
khqrPayLoad.setId("03");
khqrPayLoad.setValue("MC900001");
additionalDataTemp.add(khqrPayLoad);
khqrPayLoad = new PayloadAPI(); // 06
khqrPayLoad.setId("06");
khqrPayLoad.setValue("Cafe PayOn");
additionalDataTemp.add(khqrPayLoad);
khqrPayLoad = new PayloadAPI(); // 07
khqrPayLoad.setId("07");
khqrPayLoad.setValue("OT02000002");
additionalDataTemp.add(khqrPayLoad);
khqrPayLoad = new PayloadAPI(); // 83
khqrPayLoad.setId("83");
khqrPayLoad.setValue("10");
additionalDataTemp.add(khqrPayLoad);
khqrPayLoad = new PayloadAPI(); // 84
khqrPayLoad.setId("84");
khqrPayLoad.setValue("2");
additionalDataTemp.add(khqrPayLoad);
khqrPayLoad = new PayloadAPI(); // 85
khqrPayLoad.setId("85");
khqrPayLoad.setValue("20042021090404");
additionalDataTemp.add(khqrPayLoad);
payloadAPIMap.put(62, additionalDataTemp); // MainID = 62

ArrayList<PayloadAPI> customizedMerchantInformation = new ArrayList<>();
khqrPayLoad = new PayloadAPI(); // 00
khqrPayLoad.setId("91");
khqrPayLoad.setValue("kh.com.payon");
customizedMerchantInformation.add(khqrPayLoad);
khqrPayLoad = new PayloadAPI(); // 01
khqrPayLoad.setId("01");
khqrPayLoad.setValue("PAYON");
customizedMerchantInformation.add(khqrPayLoad);
payloadAPIMap.put(91, customizedMerchantInformation); // Main 91

PayloadAPIEncoding encoding = new PayloadAPIEncoding();
encoding.setPayloadAPIMap(payloadAPIMap);
ResponseAPI responseAPI = encoding.generatePayload();

System.out.println("data : " + responseAPI.getQrdata()); // out put qr string

5.2 Read QR data

Input QR string in EMVCoParser.parse(qr String). Use field Id to get value from map. EMVCoParser.parseTlv(EMVCoParser.parse(qr String)) to get sub-data, Use field Id and sub field Id to sub value from map.

String qrStr = "000201010212520458115802KH5921PAYON PAYMENT GATEWAY6010PHNOM PENH5303840540126257011616194936179170000308C00001430710CT030000038302108401991250012kh.com.payon0105PAYON63049E84";

final Map<Integer, EmvcoTlvBean> emvcoTlvBeanMap = EMVCoParser.parse(qrStr);

EMVCoParser.printTag(emvcoTlvBeanMap);

System.out.println(emvcoTlvBeanMap.get(52).getValue()); // get value of ID 52

final Map<Integer, Map<Integer, EmvcoTlvBean>> parseSubTlv = EMVCoParser.parseSubTlv(emvcoTlvBeanMap);
for (Map.Entry<Integer, Map<Integer, EmvcoTlvBean>> subs : parseSubTlv.entrySet()) {
  System.out.println();
  EMVCoParser.printOneTlv(emvcoTlvBeanMap.get(subs.getKey()), subs.getKey());
  System.out.println("Print\tSubTag");
  EMVCoParser.printTag(subs.getValue());
}

System.out.println("Hello : " + parseSubTlv.get(91).get(1).getValue()); // get value ot ID 91 and Sub ID 01

Last updated