Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Next »

Table of Contents

1.1.      Introduction.

1.2.      About the SUNMI SDK.

1.3.      System Requirements.

1.4.      Library Dependency.

1.6.      LOA and Certifications.

1.7.      Transaction Type.

1.7 Transaction and Field matrix.

1.7.1 MyWrapperClass.

1.7.2 register Listener.

1.7.3 sunmiWrapperListener.activateDevice.

1.7.4 sunmiWrapperListener.saleTransactionStartCardCheck.

1.7.5 sunmiWrapperListener.voidTransactionStartCardCheck.

1.7.6 sunmiWrapperListener.completionTransactionStartCardCheck.

1.7.7 sunmiWrapperListener.refundTransactionStartCardCheck.

1.7.9 responseObject.

1.7.10 printReceipt.

1.7.11 injectCapKeys.

1.7.12 getHistory.

1.8 Result Code.

1.9 Kernel Response Code.

 

 

1.1. Introduction

This document provides instructions for software developers who wants to integrate their software solutions with SUNMI SDK and perform transactions.

 

1.2. About the SUNMI SDK

Sunmi SDK is a EMV certified solution which has the core functionalities of EMV and can be integrated with the merchant solution.

1.3. System Requirements 

  •        Development Environment: Android Studio 4 and above. 

  •        Android Operating System: 4.4.2 and above  

 

1.4. Library Dependency 

  •        Sunmi-firstdata_v0.0.1.aar

  •        PayLib-release-2.0.07.aar

  •        LaineyUI-release.aar

 

1.5. Device List

  •        P2 PRO

  •        P2

  •        P2 MINI

1.6. LOA and Certifications

Sunmi keeps the EMV kernel up to date. Each version of the EMV kernel is certified fully. Contact the Sunmi team to get the LOAs.

 

Contact EMV certified L2 Kernel versions

Card brands: Visa, Mastercard, Discover, American Express, JCB, China UnionPay.

1.7.Transaction Type

  •        Connect/Disconnect Service

  •        Register/Unregister Service

  •        Merchant Registration

  •        Download/Update CAPK Keys

  •        SRED Enable

  •        Sale

  •        Auth

  •        VOID

  •        Keyed - In

  •         Completion

  •        Refund

  •        Credit

  •        History

  •        Print

 

      Transaction and Field matrix

      1.7.1 MyWrapperClass

The MyWrapperClass will create a bridge between the POS UI app and the SUNMI SDK. It has various functions that can be used based on the business logic. It is a very important class, and an instance of it should be created in the POS UI application.

public class MyWrapperClass {

    Context mContext;
    Activity mActivity;
    public PayDetail mPayDetail;
    private ReadCardOptV2 mReadCardOptV2;
    private NewSaleSwingCardClass newSaleSwingCardClass;
    private KeySettingClass mKeySettingClass;
    private MerchantSettingClass merchantSettingClass;
    private MerchantOperation merchantOperation;
    private SystemParamsOperation mSystemParamsOperation;
    private TransactionOtherOperation transactionOtherOperation;
    private MyWrapperListener myWrapperListener;
    private PayDetailModel mPayDetailModel;

    public MyWrapperClass(Activity activity, MyWrapperListener myWrapperListener) {
        this.mActivity = activity;
        this.myWrapperListener = myWrapperListener;
    }

    public MyWrapperClass(Context context, MyWrapperListener myWrapperListener) {
        this.mContext = context;
        this.myWrapperListener = myWrapperListener;
    }

    public MyWrapperClass(Activity activity) {
        this.mActivity = activity;
    }

    public MyWrapperClass(MyWrapperListener myWrapperListener) {
        this.myWrapperListener = myWrapperListener;
    }

    public void saleTransactionStartCardCheck(PayDetail mPayDetail, int type) {
        // Sale transaction type = 1;
        refund = false;
        newSaleSwingCardClass = new NewSaleSwingCardClass(mActivity, this.myWrapperListener, type);
        newSaleSwingCardClass.transactionStartCardCheck(mPayDetail);
    }

    public void saleTransactionManual(String cardNo, String year, String month, String cvv, int type, PayDetail mPayDetail) {
        // Sale transaction type = 1;
        refund = false;
        newSaleSwingCardClass = new NewSaleSwingCardClass(mActivity, this.myWrapperListener, type);

        newSaleSwingCardClass.manualTransaction(cardNo, year, month, cvv, mPayDetail);

    }

    public void setHandler(Handler handler) {
        TradeData mTradeData = GlobalParams.getTradeData();
        mTradeData.setHandler(handler);
        GlobalParams.serviceHandler = handler;

    }

    public void voidTransactionStartCardCheck(PayDetail mPayDetail, long amount) {
        // void transaction type = 2;
        refund = false;
        newSaleSwingCardClass = new NewSaleSwingCardClass(mActivity, this.myWrapperListener, 2);
        newSaleSwingCardClass.transactionStartCardCheck(mPayDetail, amount);
    }

    public void refundTransactionStartCardCheck(long amount, PayDetail mPayDetail) {
        refund = true;
        newSaleSwingCardClass = new NewSaleSwingCardClass(mActivity, this.myWrapperListener, 3);
        newSaleSwingCardClass.transactionStartCardCheck(amount, mPayDetail);
    }

    public void settlementTransactionStartCardCheck(PayDetail mPayDetail) {
        refund = false;
        newSaleSwingCardClass = new NewSaleSwingCardClass(mActivity, this.myWrapperListener, 3);
        newSaleSwingCardClass.transactionStartCardCheck(mPayDetail);
    }

    public void refundTransactionManual(long amount, PayDetail mPayDetail, String cardNo, String year, String month) {
        refund = true;
        newSaleSwingCardClass = new NewSaleSwingCardClass(mActivity, this.myWrapperListener, 3);
        newSaleSwingCardClass.manualTransactionRefund(amount, mPayDetail, cardNo, year, month);
    }

    public void authTransactionStartCardCheck(PayDetail mPayDetail) {
        // auth transaction type = 4;
        refund = false;
        newSaleSwingCardClass = new NewSaleSwingCardClass(mActivity, this.myWrapperListener, 4);
        newSaleSwingCardClass.transactionStartCardCheck(mPayDetail);
    }

    public void completionTransactionStartCardCheck(PayDetail mPayDetail, long partialAmount) {
        // void transaction type = 2;
        refund = false;
        newSaleSwingCardClass = new NewSaleSwingCardClass(mActivity, this.myWrapperListener, 6);
        newSaleSwingCardClass.transactionStartCardCheck(mPayDetail, partialAmount);
    }

    public void activateDevice(String Mid, String Tid) {
        merchantSettingClass = new MerchantSettingClass(mActivity, this.myWrapperListener);
        merchantSettingClass.merchantOnboard(Mid, Tid);
        mKeySettingClass = new KeySettingClass(mActivity);
        mKeySettingClass.read();

    }

    public void injectTAKey() {
        if (MyApplication.isSredEnabled) {
            RSAUtil rsaUtil = new RSAUtil(mActivity, this.myWrapperListener);
            RSAUtil.TACertRequest();
        } else {
            myWrapperListener.onResponse("SRED is not enabled in this device!");
        }
    }

    public void pullTMSConfig() {
        TMSClass tmsClass = new TMSClass(mActivity, this.myWrapperListener);
        tmsClass.loadConfigTMS(mActivity);

    }

    public SystemParamsSetting getSystemParamsOperation() {
        mSystemParamsOperation = new SystemParamsOperation();
        return mSystemParamsOperation.getSystemParamsSetting();
    }

    public TransactionOtherSetting getTransParamsOperation() {
        transactionOtherOperation = new TransactionOtherOperation();
        return transactionOtherOperation.getTransactionOtherSetting();
    }

    public void saveTAInjectKeyStatus(boolean stat) {
        transactionOtherOperation = new TransactionOtherOperation();
        transactionOtherOperation.saveIsTAKeyInjected(stat);
    }

    public void saveTransactionID(String a) {
        mSystemParamsOperation = new SystemParamsOperation();
        mSystemParamsOperation.saveTransactionID(a);
    }

    public MerchantSetting getMerchantSettings() {
        merchantOperation = new MerchantOperation();
        return merchantOperation.getMerchantSetting();
    }

    public Boolean getPayDetail(Long id) {
        mPayDetailModel = new PayDetailModel();
        PayDetail pay = mPayDetailModel.getPayDetailByID(id);
        return pay.isCanceled;
    }

    public PayDetail getPayDetailByOrderNo(String orderNum) {
        mPayDetailModel = new PayDetailModel();
        return mPayDetailModel.getPayDetailByOrderNo(orderNum);
    }

    public void saveMerchantSettings(String val, int number) {
        merchantOperation = new MerchantOperation();
        switch (number) {
            case 1:
                merchantOperation.saveMerchantNum(val);
                break;
            case 2:
                merchantOperation.saveTerminalNum(val);
                break;
            case 3:
                merchantOperation.saveMerchantName(val);
                break;
            case 4:
                merchantOperation.saveGroupID(val);
                break;
            case 5:
                merchantOperation.saveTPPID(val);
                break;
            case 6:
                merchantOperation.saveMerchantFlag(val);
                break;
            case 7:
                merchantOperation.saveStreet(val);
                break;
            case 8:
                merchantOperation.saveCity(val);
                break;
            case 9:
                merchantOperation.saveState(val);
                break;
            case 10:
                merchantOperation.saveZip(val);
                break;
            case 11:
                merchantOperation.savePhone(val);
                break;
            case 12:
                merchantOperation.saveMCC(val);
                break;
            case 13:
                merchantOperation.saveDID(val);
                break;
            case 14:
                merchantOperation.saveMerchantFooter(val);
                break;
            case 15:
                merchantOperation.saveCustomerFooter(val);
                break;
            case 16:
                merchantOperation.saveSRED(val);
                break;
            case 17:
                merchantOperation.saveUserName(val);
                break;
            case 18:
                merchantOperation.savePassword(val);
                break;
        }

    }

    public void loadCapKeys() {
        if (TextUtils.isEmpty(SharedPreferencesUtil.getCurrFileCreationDt(MyApplication.getInstance()))) {
            injectCapKeys();
        } else {
            updateCapKeys(SharedPreferencesUtil.getCurrFileCreationDt(MyApplication.getInstance()), SharedPreferencesUtil.getFileSize(MyApplication.getInstance()), SharedPreferencesUtil.getFileCRC16(MyApplication.getInstance()));
        }
    }

    public void injectCapKeys() {
        EmvUtil emvUtil = new EmvUtil(mActivity, this.myWrapperListener);
        EmvUtil.injectCAPK();
    }

    public boolean loadConfig() {
        EmvUtil emvUtil = new EmvUtil(mActivity, this.myWrapperListener);
        return EmvUtil.loadConfig(mActivity);
    }

    public boolean loadConfigService() {
        EmvUtil emvUtil = new EmvUtil(mContext, this.myWrapperListener);
        return EmvUtil.loadConfig(mContext);
    }

    public boolean reloadConfig() {
        EmvUtil emvUtil = new EmvUtil(mActivity, this.myWrapperListener);
        return emvUtil.reloadConfig(mActivity);
    }

    public boolean reloadConfigService() {
        EmvUtil emvUtil = new EmvUtil(mContext, this.myWrapperListener);
        return emvUtil.reloadConfig(mContext);
    }

    public void setVisaPrtyInd(boolean visaPrtyInd, boolean msdPrtyInd) {
        EmvUtil emvUtil = new EmvUtil(mActivity, this.myWrapperListener);
        EmvUtil.initAidAndRid(visaPrtyInd, msdPrtyInd);
    }

    public void setDuplicateTransactionStatus(boolean transactionStatus) {
        SharedPreferencesUtil.setDuplicateTransactionStatus(MyApplication.getContext(), transactionStatus);
    }

    public void setMSDPrtyInd(boolean visaPrtyInd, boolean msdPrtyInd) {
        EmvUtil emvUtil = new EmvUtil(mActivity, this.myWrapperListener);
        EmvUtil.initAidAndRid(visaPrtyInd, msdPrtyInd);
    }

    public void enableSRED(Context mActivity) {
        EmvUtil emvUtil = new EmvUtil(mActivity, this.myWrapperListener);
        EmvUtil.enableSRED();
    }

    public void injectWhiteList() {
        EmvUtil emvUtil = new EmvUtil(mActivity, this.myWrapperListener);
        EmvUtil.injectWhiteListFile();
    }

    public void updateCapKeys(String currFileCreationDt, String fileSize, String fileCRC16) {
        EmvUtil emvUtil = new EmvUtil(mActivity, this.myWrapperListener);
        EmvUtil.checkCapkUpdate(currFileCreationDt, fileSize, fileCRC16);
    }

    public void print(Context mContext, PayDetail mPayDetail, int copy) {

        new ResultClass(mContext, mPayDetail, this.myWrapperListener, copy);
    }

    public void printReport(Context mContext, String date, int copy) {

        new ResultClass(mContext, this.myWrapperListener, date, copy);
    }

    public String getTradeTime(PayDetail payDetail) {
        return SystemDateTime.getTimeByPayDetail(payDetail);
    }

    public List getHistory(Context mContext) {
        List<PayDetail> saleList = PayDetailModel.getInstance().getListByAll();
        return saleList;
    }

    public List getAllTransactions(String date) {
        List<PayDetail> transactionList = PayDetailModel.getInstance().getListOfOverAllTransactionsData(date);
        return transactionList;
    }

    public String[] getURL() {
        JSONObject parentObject = readAppConfigDataByName(MyApplication.getContext(), "FDRCBuilder");
        String[] urls = new String[4];
        String stageURL = "";
        String recoveryStageURL = "";
        String productionURL = "";
        String recoveryProductionURL = "";
        try {
            stageURL = parentObject.getString("STG_POST_URL");
            recoveryStageURL = parentObject.getString("SERVICE_RECOVERY_URL_STG");
            productionURL = parentObject.getString("PRD_POST_URL");
            recoveryProductionURL = parentObject.getString("SERVICE_RECOVERY_URL_PRD");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        urls[0] = stageURL;
        urls[1] = recoveryStageURL;
        urls[2] = productionURL;
        urls[3] = recoveryProductionURL;

//        SharedPreferencesUtil.saveURL(MyApplication.getInstance(),urls);

        return urls;
    }

    public void updateBuildType(boolean flag){
        SharedPreferencesUtil.saveIsProd(MyApplication.getInstance(),flag);
    }

    public boolean getIsProdStatus() {
        return SharedPreferencesUtil.getIsProd(MyApplication.getInstance());
    }

    public String[] getSavedURL(){
        return SharedPreferencesUtil.getURL(MyApplication.getInstance());
    }

    public void onBack() {
        if (newSaleSwingCardClass != null) {
            newSaleSwingCardClass.onBackPressed();
        }
    }

    EMVOptV2 mEMVOptV2;

    public void abortCheckCard() {
        try {
            LogUtil.e(Constant.TAG, "BACK HOME PAGE");
            mEMVOptV2 = MyApplication.getInstance().mEMVOptV2;
            mReadCardOptV2 = MyApplication.getInstance().mReadCardOptV2;
            abortTransact();
        } catch (Exception e) {
            Logger.getLogger(e.toString());
        }
    }

    public void abortTransact() {
        try {
            mEMVOptV2.abortTransactProcess();
            mReadCardOptV2.cardOff(AidlConstants.CardType.NFC.getValue());
            mReadCardOptV2.cancelCheckCard();

        } catch (Exception e) {
            Logger.getLogger(e.toString());
        }
    }

    public void resetData() {
        GlobalParams.resetTradeData();
    }

    public interface MyWrapperListener {
        void onReturnMsg(String message);

        void onResult(PayDetail mPayDetail);

        void onResponse(String response);

        void showLoadingDialog();

        void showLoadingDialog(String msg);

        void dismissLoadingDialog();
    }

 

        1.7.2 register Listener

 

          The methods of MyWrapperListener should be overridden so that the SDK can return the data back to the UI   application using these methods.

              Once the MyWrapperListener methods are created, pass them to MyWrapperClass and create its instance.

  

1.7.3 sunmiWrapperListener.activateDevice

          This service is used for merchant registration.

 sunmiWrapperClass?.activateDevice(
    binding.etMid.text.toString(),
    binding.etTid.text.toString()
)

 

Parameters

Field

Data Type

Request

Value

Description

 

Mid

String

M

“846649064884”

Merchant Id

 

Tid

String

M

“1675766”

Terminal ID

 

1.7.4 sunmiWrapperListener.saleTransactionStartCardCheck

 

This is a common service used for transaction processing like sales and authorization. Create an instance of the PayDetail object

 

val mPayDetail = PayDetail()
    mPayDetail.amount = MoneyUtil.stringMoney2LongCent(
   binding.etEnterAmount.text.toString().replace(",","").drop(1)
   )
   if(binding.etCashback.text.toString().isNotEmpty()) {
     mPayDetail.cashBackAmount = MoneyUtil.stringMoney2LongCent(
    binding.etCashback.text.toString().replace(",","").drop(1)
     )
   }
    mPayDetail.taxAmt = 0
    mPayDetail.paymentType = tType
    if(binding.etTipAmount.text.toString().isNotEmpty()) {
     mPayDetail.tips = MoneyUtil.stringMoney2LongCent(
    binding.etTipAmount.text.toString().replace(",","").drop(1)
  )
    }
    mPayDetail.surchrgPercentage =
    binding.etSurcharge.text?.dropLast(1).toString()
    mPayDetail.ebtType = if (tType.equals("EBT")) ebtType else ""
    if (mPayDetail.surchrgPercentage.isNotEmpty())
    mPayDetail.surchrg = MoneyUtil.stringMoney2LongCent(
    caculateSurcharge(
    binding.etEnterAmount.text?.drop(1).toString(),
    mPayDetail.surchrgPercentage
    )
    )
 sunmiWrapperClass!!.saleTransactionStartCardCheck(mPayDetail,1)

 

 

Parameter1 passed as Paydetail Object

 

Field

Data Type

Request

 

Value

Description

Amount

Long

M

   000000001000

Transaction amount

paymentType

String

M

 “Credit”/ ”Debit” / ”EBT”

Credit -> Credit payment

Debit -> Debit payment

EBT -> EBT payment

ebtType

String

C

 “Cash”/ ”SNAP”

Mandatory for EBT

EBT CASH -> EBT cash

SNAP -> EBT Snap

cashBackAmount

Long

O

  000000000200

Cashback amount

Tips

Long

O

  000000000100

 Tip amount

surchrgPercentage

String

O

   “5.00”

Percentage of surcharge

Surchrg

Long

O

  000000000050

Surcharge amount

 

Parameter2 – Transaction Type

type

Int

M

    1

1 -> Sale

3 -> Credit/Refund

4 -> Auth

10->Verification

13->Balance Enquiry

 1.7.5 sunmiWrapperListener.voidTransactionStartCardCheck

 

mpayDetail = sunmiWrapperClass
!!.getPayDetailByOrderNo(binding.etOrderId.text.toString())

if (mpayDetail != null) {

    if(mpayDetail!!.transType.equals("Void")){

        showToastOnUI("Already Transaction has been completed for this order Id")

        return

    }

    amount = mpayDetail!!.amount

    sunmiWrapperClass!!.voidTransactionStartCardCheck(mpayDetail!!, amount)

 1.7.6 sunmiWrapperListener.completionTransactionStartCardCheck

 

mpayDetail =  sunmiWrapperClass!!.getPayDetailByOrderNo(binding.etOrderId.text.toString())

  if (mpayDetail != null) {

   strTip = binding.etTipAmount.text.toString().drop(1).replace(",", "")

if (binding.etTipAmount.text.toString().isNotEmpty()) {

    mpayDetail!!.tips = MoneyUtil.stringMoney2LongCent(strTip)

  }
    strAmount =
    MoneyUtil.stringMoney2LongCent(mpayDetail!!.amount.toString())
           .toString()
 binding.tvResult.visibility = View.GONE

 binding.etResult.visibility = View.GONE

 if (mpayDetail!!.transType.equals("Completion")) {

   showToastOnUI("Already Transaction has been completed for this order Id")

 return

  }

 sunmiWrapperClass!!.completionTransactionStartCardCheck(

 mpayDetail!!,

 mpayDetail!!.amount

  )

 

1.7.7 sunmiWrapperListener.refundTransactionStartCardCheck

 

var mpayDetail =

    sunmiWrapperClass!!.getPayDetailByOrderNo(binding.etOrderId.text.toString())

if (mpayDetail != null) {

    if (refundType.equals("fullAmount")) {

        amount = mpayDetail.amount

    } else {

        amount = MoneyUtil.stringMoney2LongCent(

            binding.etEnterAmount.text.toString().replace(",", "")

                .drop(1)
        )
    }

    binding.tvResult.visibility = View.GONE

    binding.etResult.visibility = View.GONE

    // if amount is 0 means it's a full refund

    if(mpayDetail.transType.equals("Refund") || mpayDetail.transType.equals("Void")){

        showToastOnUI("Already Transaction has been completed for this order Id")

        return

    }

    sunmiWrapperClass!!.refundTransactionStartCardCheck(amount, mpayDetail)

    binding.tvInserttapswipe.visibility = View.VISIBLE

    binding.posIcon.visibility = View.VISIBLE

  

Parameter : Refund Amount

Field

Data Type

Request

 

        Value

Description

Amount

String

M

 

   “000000001000”

Amount to be refunded

refundOrderNumber

String

M

 

   “00000035”

Transaction order number

 

refundType

 

String

 

M

    

  “fullAmount”

Full refund -> fullAmount

Partial refund -> partialAmount

 1.7.7 sunmiWrapperListener.saleTransactionManual

 

val mPayDetail = PayDetail()

mPayDetail.amount = MoneyUtil.stringMoney2LongCent(binding.etEnterAmount.text.toString().replace(",","").drop(1))

mPayDetail.cashBackAmount = MoneyUtil.stringMoney2LongCent(binding.etCashback.text.toString().replace(",","").drop(1))

mPayDetail.taxAmt = 0

mPayDetail.paymentType = tType

mPayDetail.tips = MoneyUtil.stringMoney2LongCent(binding.etTipAmount.text.toString().replace(",","").drop(1))

mPayDetail.surchrgPercentage = binding.etSurcharge.text?.dropLast(1).toString()

if (mPayDetail.surchrgPercentage.isNotEmpty())

    mPayDetail.surchrg = MoneyUtil.stringMoney2LongCent(

        caculateSurcharge(binding.etEnterAmount.text.toString().replace(",","").drop(1), mPayDetail.surchrgPercentage)
    )

mPayDetail.ebtType = if(tType.equals("EBT")) ebtType else ""

try {

    sunmiWrapperClass!!.saleTransactionManual(

        cardNumber.text.toString(),

        monthYear.text.substring(3, 7),

        monthYear.text.substring(0, 2),

        cvv.text.toString(),

        1,

        mPayDetail

    )

 

Parameters: Card number

Field

Data Type

Request

 

     Value

Description

cardNo

String

M

    “6510000000000810”

Card number

Year

String

M

    “2026”

YYYY

Month

String

M

    “08”

MM

CVV

String

M

     “121”

Card CVV number

txnType

Int

M

       1

1 -> Sale

2 -> Void

3 -> Refund or credit

4 -> Auth

 

1.7.9 responseObject

 

          A generic response object for SALE, VOID, REFUND, COMPLETION.

 

Field

Data Type

 

   Value

Description

PymtType

String

 “Credit”

Payment type

“Credit”/ ”Debit” / ”EBT”

TxnType

String

  “Sale”

Transaction type

    1 -> Sale

    2 -> Void

    3 -> Refund or credit

    4 -> Auth

   10->Verification

   13->Balance Enquiry

LocalDateTime

String

 “20240507123815”

Local date time

TrnmsnDateTime

String

 “20240507070815”

Transmission data time

STAN

String

 “000022”

STAN

RefNum

String

 “715065695390”

Transaction reference number

OrderNum

String

 “00000038”

Order number

TermID

String

 “01675766”

TID

MerchID

String

 “846649064884”

MID

TxnAmt

String

 “1050”

Transaction amount

TxnCrncy

String

 “840”

Transaction currency code

KeyID

String

 “66257982466”

TA key id

Tkn

String

 “1152266530310810”

Token

SctyKeyUpdInd

String

 “ “

Security key update indicator

TAExpDate

String

 “0826”

Token expiry

RespCode

String

 “000”

Response code

AuthID

String

 “OK9494”

Auth id

AddtlRespData

String

“APPROVAL”

Additional response data

AthNtwkID

String

 “04”

Authorizing network id

AthNtwkNm

String

 “DISCOVER”

Authorizing network name

 

1.7.10 printReceipt

  

var mpayDetail =
    sunmiWrapperClass!!.getPayDetailByOrderNo(binding.etOrderId.text.toString())
if (mpayDetail != null)
    sunmiWrapperClass!!.print(mActivity, mpayDetail, copyType)

 

Parameters : Order number

Field

Data Type

Request

 

 Value

Description

orderNumber

    String

     M

   “00000038”

Transaction order number

copyType

Int

M

 

     2

 

1 -> Customer copy

2 -> Merchant copy

1.7.11 injectCapKeys

injectCapKeys service is used for download or update EMV CAPKs.

1.7.12 getHistory

getHistory service is used to retrieve transaction history.

Response: String array.

1.8 Result Code

 

Response Code

Description

000

Approve

001

Schema Validation Error

002

Approve for partial amount

003

Approve VIP

100

Do not honor

101

Expired card

102

Suspected fraud

103

Unable to process TeleCheck recurring transaction with this payment type (not associated with insufficient or uncollected funds)

104

Restricted card

105

Call acquirer’s security department

106

Allowable PIN tries exceeded

107

Call for authorization

108

Refer to issuer’s special conditions

109

Invalid merchant. The merchant is not in the merchant database, or the merchant is not permitted to use this particular card

110

Invalid amount

111

Invalid Host Totals Date

112

DES Encryption not allowed from the device / terminal

113

Host Totals are Incomplete

114

Invalid account type

116

Not sufficient funds

117

Incorrect PIN or PIN length error

118

No card record

119

Transaction not permitted to cardholder

120

Transaction not permitted to terminal

121

Exceeds withdrawal amount limit

122

Security violation

123

Exceeds withdrawal frequency limit

124

Violation of law

129

Suspected counterfeit card

130

Invalid terminal

131

Invalid account number

132

Unmatched card expiry date

133

The TPP ID was not found

134

Not sufficient funds

150

Invalid merchant set up

151

Activation failed

152

Exceeds limit

153

Already redeemed

154

Over monthly limit

155

Recharge amount exceeded

156

Max number of recharges exceeded

157

Invalid entry

208

Lost Card / Lost Check

209

Stolen card

211

Invalid SKU number

212

Missing conditional data.

213

Invalid account number for card type.

214

Invalid payment type/card type for merchant ID

215

Invalid transaction for Merchant ID.

216

Invalid TransArmor request. Not supported for given Payment Type, or Merchant is not enabled for Transarmor

217

Missing or invalid secure payment data.

218

Merchant ID not enabled for Secure Code

219

Invalid Merchant Category Code

220

Customer service phone number missing

221

Merchant not enabled for soft descriptors, account updater or optimization processing.

222

Partial auth not allowed.

223

Customer under 18 years old.

224

Account blocked – possible compromise.

225

Bill-to address does not match ship-to

226

Invalid preapproval number

227

Invalid email address

228

Need more ID – request full SSN.

229

Previously declined/closed account

230

One time stop payment requested by cardholder

231

Stop payment requested for all payments.

232

Stop all payments – account closed.

233

Auth response date not valid.

234

Issuance under minimum amount

235

Outstanding auth – funds on hold.

236

Activation amount incorrect.

237

Deny – new card issued.

238

BIN blocked.

242

Customer opt-out.

243

Institution does not accept ACH payments

244

Original transaction not approved.

245

Invalid MICR data.

246

Declined due to high risk

247

Declined due to stand-in rules.

248

Conditional Approval – Hold shipping for 24 hours

250

Re-authorization request is declined. Original Auth could not be found.

251

Re-authorization request is declined. The customer account number, merchant id, or amount did not match the original authorization.

252

Re-authorization request is declined. The amount significantly exceeds the original request amount

253

Re-authorization request is declined. The timeframes for re-authorization have been exceeded.

254

Counter Offer to Supply Personal Guaranty.

300

Invalid EAN or SCV.

301

Lock has expired on prepaid card

302

Account closed. The account was closed, probably because the account balance was $0.00

303

Unknown account. The account could not be located, or the account does not exist in the account table

304

Inactive account. The account has not been activated by an approved location

308

Already active. The card is already active and does not need to be reactivated

311

Not lost or stolen

315

Bad mag stripe. The mag stripe could not be parsed for account information

316

Incorrect location. There was a problem with the merchant location

317

Max balance exceeded. The transaction, if completed, would cause the account balance to be exceeded by the max_balance as specified in the promotion. Some merchants set the max_balance to a value twice the max transaction amount

318

Invalid amount. There was a problem with the amount field in the transaction format – more or less than min/max amounts specified in the promotion for that transaction

319

Invalid clerk. The clerk field was either missing, when required, or the content did not match the requirements

320

Invalid password

321

Invalid new password. The new password does not meet the minimum security criteria

322

Exceeded account reloads. The clerk/user/location was only permitted to reload some number of accounts. That number was exceeded. (See your Business Manager in order to extend this limit.)

323

Password retry exceeded. The user account has been frozen because the user attempted access and was denied. Seek management assistance

326

Incorrect transaction version or format number for POS transactions

327

Request not permitted by this account

328

Request not permitted by this merchant location

329

Bad_repay_date

330

Bad checksum. The checksum provided is incorrect

331

Balance not available (denial). Due to an internal Fiserv Prepaid Closed Loop issue, information from this account could not be retrieved

332

Account locked

333

No previous transaction. The void or reversal transaction could not be matched to a previous (original) transaction. In the case of a redemption, the corresponding locking transaction could not be identified

334

Already reversed

336

Bad Authorization ID. The Authorization ID test failed

337

Too many transactions requested

338

No transactions available/no more transactions available. There are no transactions for this account or there are no transactions as determined by the specified first transaction number

339

Transaction history not available

340

New password required

341

Invalid status change. The status change requested (e.g., lost/stolen, freeze active card) cannot be performed

342

Void of activation after account activity

343

No phone service. Attempted a calling card transaction on an account which is not configured for calling card activity

344

Internet access disabled

345

Invalid Date or Time

350

Additional customer authentication required or, Customer Authentication Required (Decline – Discover only)

351

Customer PIN authentication required

355

Invalid currency. The provided currency is invalid.

356

Currency Not Supported

357

Currency conversion error

359

The terminal transaction number did not match (on a void or reversal).

367

Target embossed card entered, and Transaction count entered do not match

368

No account link

369

Invalid time zone

370

Account on hold or subscriber not active

372

Promo location restricted

373

Invalid Card Account

374

Product code(s) restricted

375

Bad Post Date. The Post Date is not a valid date.

376

Account status is void lock

377

Already active and reloadable

378

Account is Purged. The Account record was purged from the database.

380

Bulk activation error

381

Bulk activation unattempted error

382

Bulk activation package amount error

383

Store location zero not allowed

384

Account row locked

385

Accepted but not yet processed

402

TransArmor Service Unavailable

403

TransArmor Invalid Token or Account Number

404

TransArmor Key Error

414

Void/Full Reversal request unable to process due to network cut-off window elapsed. A Refund transaction is necessary to reconcile the cardholder’s account. Applicable to Debit networks only.

430

Prepaid Card Amount Over EU AMLD (Anti-Money Laundering Directive) Limit

500

Decline

501

Date of Birth Error for Check Processing

502

Invalid State Code

503

New Account Information

504

Do not try again

505

Please retry

506

Invalid Checking Account Number

507

New Account Information available

508

Try again later – Declined: Association ‘s payment cancellation advice code provided. Applies to recurring authorizations only. These are examples of what may have occurred: the account is over the credit limit try again in 72 hours.

509

Do not try again – Applies to recurring authorizations only. The card has expired

510

New Account Information – Applies to recurring authorizations only. The card has expired.

511

Try again later – Applies to recurring authorizations only. The card has expired. Get the new expiration date and try again.

512

Service not allowed or invalid surcharge amount

513

Decline. Transaction not permitted to acquirer or terminal.

514

Do not try again – Applies to recurring authorizations only. There was security violation.

515

Declined. No term record on Fiserv system

516

Please retry – Reasons for this error are one of the following: Format Error, Unable to route transaction, Switch, or issuer unavailable, System Busy, Timeout

517

CVV2 Declined

518

Invalid account/date or sales date in future

519

Invalid Effective Date

520

Reversal Rejected. Do not try again.

521

Enter lesser amount

522

Cash Back greater than total Transaction amount

523

Crypto box is offline

524

Debit Switch unavailable Timeout Retry – Communications link to debit/EBT network gateway is down or responded with a “System Malfunction (96)” message

525

Debit/EBT network gateway cannot get through to the ISSUER.

526

Undefined Card – Debit/EBT network gateway cannot route card based on Merchant Entitlement

527

Network Response indicates that Merchant ID / SE is invalid

528

Debit/EBT transaction count exceeds pre-determined limit in specified time/ Withdrawal limit exceeded.

529

Resubmission of transaction violates debit/EBT network frequency

530

The authorizing network has a problem decrypting the cryptogram in the request

531

Retry with 3DS data

532

The DUKPT Base Derivation key is missing or incorrect in the PIN pad, PIN key synchronization error, or Master session PIN key is missing.

533

Invalid encryption key offset sent by merchant

534

Invalid master session key id sent by merchant

539

No Checking Account

540

Edit Honor

541

No Savings Account

542

DUKPT: An error while processing the PIN block that is not related to the point- of-sale equipment. Contact the Help Desk for assistance.

550

Invalid Vehicle

551

Invalid Driver

552

Invalid Product

553

Exceeds transaction total limit per product class.

554

Over daily limit

555

Invalid Date/Time

556

Exceeds quantity

557

Invalid prompt entry

558

Invalid Track 2 data

559

Voyager ID problem

560

Invalid Odometer

561

Invalid Restriction Code

562

Pay at pump not allowed

563

Over fuel limit

564

Over cash limit

565

Fuel price error

566

Y or N required

567

Over repair limit

568

Over additive limit

569

Invalid user

570

Before 1400 and can’t cut. Wait until 2:00 pm Eastern.

571

Cut time too close to 1400

572

Checker/Manager not found

573

Security insufficient

574

No transaction security record

575

Insufficient data

576

Merchant has mail pending

577

No messages pending

578

The Visa OCT / MasterCard MoneySend activity has exceeded preset transaction count or amount limit within a rolling 24-hour period for given merchant

579

The Visa OCT / MasterCard MoneySend activity has exceeded preset transaction count or amount limit within a rolling 7-day period for given merchant.

580

The Visa OCT / MasterCard MoneySend activity has exceeded preset transaction count or amount limit within a rolling 30-day period for given merchant.

581

The Visa OCT / MasterCard MoneySend Funding activity has exceeded preset transaction count or amount limit within a rolling 24- hour period for this account number.

582

The Visa OCT / MasterCard MoneySend Funding activity has exceeded preset transaction count or amount limit within a rolling 7- day period for this account number.

583

The Visa OCT / MasterCard MoneySend Funding activity has exceeded preset transaction count or amount limit within a rolling 30- day period for this account number.

584

The Visa OCT / MasterCard MoneySend Payment activity has exceeded preset transaction count or amount limit within a rolling 24- hour period for this account number.

585

The Visa OCT / MasterCard MoneySend Payment activity has exceeded preset transaction count or amount limit within a rolling 7- day period for this account number.

586

The Visa OCT / MasterCard MoneySend Payment activity has exceeded preset transaction count or amount limit within a rolling 30- day period for this account number.

587

The single transaction amount limit was exceeded for a Visa OCT/ MasterCard MoneySend transaction for given merchant.

588

All Visa OCT / MasterCard MoneySend transactions are blocked for a rolling 24 hour period, or 7 day period (current and prior 6 days), or 30 day period (current and prior 29 days) for given merchant

601

Invalid Batch Number/ Invalid Batch ID or Invalid OpenBatch

602

No Open Batch

603

Close Unavailable

604

Close Not Valid

701

Approved EMV Key Load

702

EMV Key Download Error

703

Approved EMV Key Load, more key load data pending

704

Pick Up Card

708

Honor With Authentication

721

Invalid ZIP Code

722

Invalid value in the field / Host Totals Declined

723

Driver’s License or ID is Required

724

Referred – Not Active

726

Unable to Locate Record On File

727

Refer – Call Authorization

728

Referred – Skip Trace Info

729

Hard Negative Info On File

731

Rejected Lost/Stolen Checks

740

Totals Unavailable

767

Hard Capture; Pick Up

771

Amount Too Large

772

Duplicate Return

773

Unsuccessful

774

Duplicate Reversal

775

Subsystem Unavailable

776

Duplicate Completion

782

Count Exceeds Limit

785

No reason to decline– applicable to $0.00 verification requests and may be returned on Online Refund responses. Should be treated as an approval.

790

Not approved. Used only in Visa bill/recurring payment. Merchant must not resubmit same transaction but may continue billing process in subsequent billing period.

791

Not approved. Used only in Visa bill/recurring payment. Merchant must stop recurring payment requests.

792

See attendant.

800

Deferred authorization not cancelled

801

Over merchandise limit

802

Imprint card

803

Not on file

804

Fuel only

805

Velocity exceeded

806

Authorization ID needed

807

Over non-fuel limit

808

Invalid location

809

Over card velocity count

810

Over card velocity amount

811

Over issuer velocity count

812

Over issuer velocity amount

813

Over merchant daily velocity count

814

Over merchant daily velocity amount

815

Over merchant daily velocity both

816

Over merchant product velocity amount

817

Over merchant product velocity count

818

Over merchant product velocity both

819

Over chain daily velocity count

820

Over chain daily velocity amount

821

Over chain daily velocity both

822

Over chain product velocity count

823

Over chain product velocity both

824

Over chain product velocity amount

825

No chain ID for chain merchant

826

Signature required

827

Velocity exception error – pay inside

828

Exceeds merchant count for period – pay inside

829

Exceeds merchant amount for period – pay inside

830

Exceeds merchant count and amount for period – pay inside

831

Exceeds zip code count for period – pay inside

832

Exceeds zip code amount for period – pay inside

833

Exceeds zip code count and amount for period – pay inside

834

Exceeds state count for period – pay inside

835

Exceeds state amount for period – pay inside

836

Exceeds state count and amount for period – pay inside

837

Exceeds global count for period – pay inside

838

Exceeds global amount for period – pay inside

839

Exceeds global count and amount for period – pay inside

840

Unknown velocity error – pay inside

902

Invalid transaction. This merchant, card or terminal is not permitted to perform this transaction, or the transaction type is invalid, or Fiserv is unable to route a refund request to the network, or there is an issue with the xml message. If a 902 is returned when submitting a completion for the second time, the first completion submitted has been successfully applied, even if the device did not receive a response in the first completion.

903

Invalid Reversal Transaction – transaction already settled

904

Format error.

905

Unsupported message. Transaction was rejected. Call your helpdesk or operations support.

906

System Error. There is a problem with the host processing system. Call your helpdesk or operations support.

907

Card issuer or switch inoperative or processor not available

908

Transaction destination not found for routing.

909

System malfunction or timeout

911

Card issuer timed out.

913

Duplicate transaction.

914

Void/Full Reversal request unable to process due to settlement already occurred. A Refund transaction may be necessary to reconcile the cardholder’s account.

915

Timeout Reversal not supported. Resend the original transaction with the same Reference Number that timed out. Do not retry the timeout reversal

916

Void/Full Reversal request unable to process since the Original Authorization was not found.

920

Security H/W or S/W error – try again

921

Security H/W or S/W error – no action

923

Request in progress

924

Limit check failed

940

Error.

941

Invalid issuer.

942

Customer cancellation

944

Invalid response

950

Violation of business arrangement

954

CCV failed.

958

CCV2 failed

959

CAV failed

963

Acquirer channel unavailable

 

 

 

1.9 Kernel Response Code

 

 

Response Code

Response Message

-100

Incorrect number of parameters or length

-101

Unsupported command

-1000

System parameter error

-1001

Feature not supported

-1002

Initialization failed

-1003

System time year error

-1004

System time month error

-1005

System time day error

-1006

System time hour error

-1007

System time minute error

-1008

System time second error

-1009

Hardware failure

-1010

Buffer length error

-2000

Card parameter error

-2001

Have no card

-2002

Multiple cards

-2100

Magnetic card data decoding

-2500

Module detection failed

-2501

Drive core data structure error

-2502

Module is not powered

-2503

Carrier is not turned on

-2520

Communication timeout

-2521

Internal FIFO operation failed

-2522

Communication frame error

-2523

Communication character check error

-2524

Communication conflict

-2525

Signal in communication does not comply with the protocol

-2526

CRC check error in communication

-2527

M1 card password authentication error

-2528

Mifare authentication parameters are incorrect

-2529

Card exists

-2540

The number of data in the A card communication response does not match the expected

-2541

A card communication replies to the first character of the WUPA/REQA command is illegal

-2542

Card number checksum error of A card communication response

-2543

The first character of the card number answered by the A card communication is wrong.

-2544

A card communication response ATS TL byte is illegal

-2545

The A0 T0 byte of the A card communication response is illegal.

-2546

The A1 TA1 byte of the ATS communication is illegal.

-2547

The ATB TB1 byte of the A-card communication response is illegal.

-2548

A card communication response ATS TC1 byte is illegal

-2550

The number of data in the B card communication response does not match the expected

-2551

The first character of the B card communication response WUBP/REQB command is not 0x50

-2552

The fourth bit of the protocol type byte in ATQB is not '0'

-2553

The B-card communication responds to the difference in channel coding and setting in the ATTRIB command.

-2554

B card communication response HLTB command response non 0x00 error

-2560

Retransmitted to the limit if the correct reception is received

-2561

Block type coding error

-2562

I block PCB error or subsequent data length error

-2563

PICC uses I block response link block

-2564

Received I block serial number is incorrect

-2565

R block PCB error or subsequent data length error

-2566

PICC response NAK block

-2567

The received R block serial number is incorrect.

-2568

S block PCB error or subsequent data length error

-2569

S block non-S-WTX request sent by PICC

-2570

WTX parameter error requested (=0)

-2571

Card return data exceeds FSD

-2800

Verify error

-2801

Communication timeout

-2802

Module is not powered

-2803

ATR error

-2804

Communication error

-3000

Security parameter error

-3001

Root key error

-3002

Security system is locked

-3003

Security file read and write error

-3004

Key index error

-3005

Key verification error

-3006

No PIN entry

-3007

PIN input canceled

-3008

PIN input timeout

-3009

PIN input interval is too short

-3010

KCV mode error

-3011

KCV check error

-3012

KCV ODD check error

-3013

No matching key

-3014

Error of key type

-3015

Key length error

-3016

Key exponent length error

-3017

Destination key index error

-3018

Source key index error

-3019

Source key type error

-3020

Group index error

-3022

No KCV

-3023

DUKPT overflow

-3024

DUKPT key type error

-3025

DUKPT KSN needs to add 1

-3026

Try to use the key outside the scope of the key.

-3027

Incorrect use of the key, restricting only decrypted keys to encrypt data, such as calculate the Mac with the master key

-3028

Feature not yet supported

-3029

Feature key attribute does not match

-3030

Not certified

-4000

Transaction refuse

-4001

Please use other interfaces

-4002

Transaction terminated

-4005

Final select data error

-4100

Transaction terminated (command send and receive error)

-4101

Transaction terminated (command receipt timeout)

-4102

Transaction terminated (command receipt timeout)

-4103

Transaction terminated (status code error)

-4104

Transaction terminated (card locked)

-4105

Transaction terminated (application locked)

-4106

Transaction terminated (terminal not applied)

-4107

Transaction terminated (applications with no support for the terminal and card)

-4108

Transaction terminated (card return data error)

-4109

Transaction terminated (card return data element duplicate)

-4110

Transaction terminated (transaction not received)

-4111

Transaction terminated (card expired)

-4112

The list of preprocessing parameters is empty

-4113

Transaction terminated (L1 read card timeout)

-4114

Transaction terminated (L1 transmission error)

-4115

Transaction terminated (L1 protocol error)

-4116

Transaction terminated (L2 mandatory data error)

-4117

Transaction terminated (L2 card authentication failed (offline data authentication failed))

-4118

Transaction terminated (L2 status word error)

-4119

Transaction terminated (L2 data parsing failed)

-4120

Transaction terminated (L2 transaction amount exceeds the contactless transaction limit)

-4121

Transaction terminated (L2 card data error)

-4122

Transaction terminated (L2 does not support magnetic stripe card mode)

-4123

Transaction terminated (L2 card without PPSE)

-4124

Transaction terminated (L2 PPSE processing error)

-4125

Transaction terminated (L2 candidate list is empty)

-4126

Transaction terminated (L2 IDS read error)

-4127

Transaction terminated (L2 IDS write error)

-4128

Transaction terminated (L2 IDS data error)

-4129

Transaction terminated (L2 IDS has no matching AC)

-4130

Transaction terminated (L2 terminal data error)

-4131

Transaction terminated (L3 timeout)

-4132

Transaction terminated (L3 cancel)

-4133

Transaction terminated (L3 transaction amount does not exist)

-4134

Transaction terminated (re-presentation of the card)

-4135

Transaction terminated (using other cards (with Data Record))

-4136

Transaction terminated (using other cards)

-4137

Transaction terminated (GPO response error)

-4138

Transaction terminated (final selection of card data error)

-4139

Transaction terminated (L3 no DET data)

-4140

Kernel type is not supported

-4141

Contactless transaction limit exceeded

-4142

The amount is 0

-4144

Please use another interface (pre-processing failed)

-4500

Invalid parameter

-4501

Checksum error when downloading public key

-4502

Terminal parameters do not exist.

-4503

Error with terminal parameter data

-4504

The transaction log does not exist

-4505

Transaction log data error

-4506

EMV data does not exist

-4507

PBOC LOG format does not exist

-4825

Two present card

-4854

Complete command with empty

-4855

Complete command with ODOL

-4856

Complete command after reselect app

-4857

Read record command after reselect app

-7001

Printer error

-7002

Low battery voltage

-7003

Out of paper

-7004

Temperature is too high

-7005

Printer data error

-7006

Invalid print parameters

-7007

Device not open or device operation error

-7008

Print buffer overflow

-8001

Write data fail for tax control module

-8002

Read data fail for tax control module

-10100

Serial port closed

-10101

Serial port overtime

-10102

LRC check error

-10103

SP Out of sequence

-10104

SP is initializing

-10105

SP is rebooting

-10106

SP is reconnecting.

-10107

SP is busy

-10108

SP is sleep

-10200

Read OS file package error

-10201

SP is updating

-10202

Connect SP failed

-10203

Failed to open upgrade file

-10204

Packet timeout

-10205

Packet processing error

-10206

Upgrade string is too long

-10207

Upgrade unsuccessful

-10208

Did not get the sdk version number of this machine

-10209

The version is the same as the target upgrade version.

-10210

Query default information failed

-10211

Firmware version does not allow downgrade

-10212

Upgrade cancelled

-10300

Input parameter error

-10301

The length of the response packet data area is illegal.

-10302

Answer packet data parsing error

-10400

The kernel has been rebooted

-20001

Repeated call

-20002

Firmware is being upgraded

-20003

Parameter error

-20004

Thread was aborted

-20005

Firmware upgrade failed

-20006

Firmware verification failed

-30001

Failure to read card (unknown cause card failure, recommended to re-read the card operation)

-30002

Unknown card type

-30003

Failure of NFC check card

-30004

Failure of IC check card

-30005

Read card timeout

-30013

This card is a chip card and can not fallback.

-30014

Create candidate list timeout

-30015

Card interaction failure

-30016

Wrong card interaction parameters

-40002

Key length error

-40003

The check value error

-40004

Store key fail

-40005

Calculate MAC error

-40006

Encryption error

-40007

Return array data length error

-40008

The MAC algorithm type not support

-40009

Length of check value error

-40010

Key index error

-40011

Decrypt error

-40012

Length of key error

-40013

Get random error

-40014

Key does not exist

-40016

Verify signature fail

-40017

Failed to get alarm information code

-40018

Key partition has run out

-40019

Inject BDK error

-50002

Transaction preprocess fail

-50003

Transaction process fail

-50004

EMV kernel process fail

-50005

PAN format error

-50006

Call PINPAD fail

-50007

None kernel data

-50008

PINPAD parameter error

-50009

EMV process not finish

-50010

The transaction type not support

-50011

Checking card information fail or timeout.

-50012

CVM error

-50013

Database operation fail

-50014

No matching CAPK

-50015

Save terminal parameter error

-50016

No matching AID

-50017

Check card fail

-50018

Call interface order error

-50019

Transaction data invalid

-50020

PIN entry cancel

-50021

PIN entry error

-50022

The index of app select error

-50023

Cert verify error

-50024

Online process error

-50025

App final select timeout

-50026

App final select error

-50027

Signature error

-50028

Unknown CVM type

-60001

Input PIN timeout

-60002

Keyboard failed to activate password

-60003

PinPadType type error (when the incoming keyboard type is not 1 and 2, the error is returned)

-60004

Getting PinBlock failed

-60005

PIN status query thread is interrupted

-70001

Miss permisstion com.sunmi.perm.MSR

-70002

Miss permission com.sunmi.perm.ICC

-70003

Miss permission com.sunmi.perm. CONTACTLESS_CARD

-70004

Miss permission com.sunmi.perm. PINPAD

-70005

Miss permission com.sunmi.perm. SECURITY

-70006

Miss permission com.sunmi.perm. LED

 

  • No labels