PPC_CMD_PROCCHIP
Este comando continua o processo de tratamento de cartões com chip caso o comando PPC_CMD_GETCARD tenha sido executado previamente com sucesso para um cartão EMV com contato EMV (PPC_OUT_CARDTYPE = “Emv”) ou contactless EMV (PPC_OUT_CARDTYPE = “ContactlessEmv”).
Caso haja necessidade de validar a senha do portador, este comando já efetua o processo de captura.
Este comando é blocante, portanto deve ser usado com as funções PPC_StartExecCmd e PPC_FinishExecCmd.
Parâmetros de entrada
| Constante | Presença | Observação |
|---|---|---|
| PPC_INP_TRNTYPE | O | Se não informado, assume o valor passado em PPC_CMD_GETCARD. |
| PPC_INP_AMOUNT | O | Se não informado, assume o valor passado em PPC_CMD_GETCARD. JSONPayment.Amount |
| PPC_INP_CASHBACK | O | Se não informado, assume o valor passado em PPC_CMD_GETCARD. |
| PPC_INP_FLRLIMIT | O | Se não informado, assume o valor zero. JSONEmv.NatEmvConctactRiskFloorLimit ou JSONEmv.IntEmvConctactRiskFloorLimit |
| PPC_INP_THRSVAL | O | Se não informado, assume o valor zero. JSONEmv.NatEmvConctactRiskMinValue ou JSONEmv.IntEmvConctactRiskMinValue |
| PPC_INP_TGTPRCT | O | Se não informado, assume o valor zero. JSONEmv.NatEmvConctactRiskMinPercent ou JSONEmv.IntEmvConctactRiskMinPercent |
| PPC_INP_MAXTPRCT | O | Se não informado, assume o valor zero. JSONEmv.NatEmvConctactRiskMaxPercent ou JSONEmv.IntEmvConctactRiskMaxPercent |
| PPC_INP_TAGLIST | M | Lista de tags dos objetos EMV requeridos na resposta. JSONEmv.TagsFirst |
Dados de resposta
| Constante | Observação |
|---|---|
| PPC_OUT_RESULT | Resultado do processamento: “0” = Transação aprovada offline; “1” = Transação negada offline; ou “2” = Transação requer autorização online. |
| PPC_OUT_AUTHMET | Método de autenticação do portador. JSONCreditCard.AuthenticationMethod |
| PPC_OUT_PINBLK | PIN criptografado, se PPC_OUT_AUTHMET = “OnlineAuthentication”. JSONPinBlock.EncryptedPinBlock |
| PPC_OUT_PINKSN | Key Serial Number, se PPC_OUT_AUTHMET = “OnlineAuthentication”. JSONPinBlock.KsnIdentification |
| PPC_OUT_ENCTYPE | Tipo de criptografia de PIN, se PPC_OUT_AUTHMET = “OnlineAuthentication”. JSONPinBlock.EncryptionType |
| PPC_OUT_EMVDATA | Lista dos objetos TLV requeridos por PPC_INP_TAGLIST. JSONEmvData |
| PPC_OUT_APLCRYPT | Criptograma gerado pelo cartão (“ARQC”) para impressão no comprovante. |
Retornos
| Retorno | Descrição |
|---|---|
| PPC_OK | Sucesso. |
| PPC_NOTOPEN | Comando PPC_CMD_OPEN não foi previamente chamado. |
| PPC_INVCALL | Comando PPC_CMD_GETCARD não foi executado previamente com sucesso para cartão EMV contato ou contactless. |
| PPC_ERRMANDAT | Parâmetro mandatório não foi fornecido. |
| PPC_INVPARAM | Parâmetro fornecido possui valor inválido. |
| PPC_ERRCARD | Erro de comunicação do terminal com o cartão com chip. |
| PPC_CANCEL | Portador cancelou a captura de senha (PIN). |
Outros retornos: Ver Códigos de retorno.
Exemplo
char gszEmvData[1025], gszAuthenticationMethod[25],
gszEncryptedPinBlock[17], gszKsnIdentification[21],
gszEncryptionType[17];
extern char gszTagsFirst[], gszTagsSecond[], gszEmvResponseData[];
int iProcessaChip (void)
{
char sNotifyMsg[32], szRes[2], szRetCode[4];
int iSt;
PPC_SetParam (PPC_INP_TAGLIST, gszTagsFirst, -1);
iSt = PPC_StartExecCmd (PPC_CMD_PROCCHIP)
if (iSt != PPC_OK) return iSt;
do {
iSt = PPC_FinishExecCmd (sNotifyMsg);
if (iSt == PPC_NOTIFY) ShowNotifyMessage (sNotifyMsg);
if (WishToAbort () == TRUE) {
PPC_AbortCmd ();
return APP_ABORTED;
}
} while (iSt == PPC_PROCESSING || iSt == PPC_NOTIFY);
if (iSt != PPC_OK) return iSt;
iSt = PPC_GetResp (PPC_OUT_RESULT, sizeof (szRes), szRes);
if (iSt != PPC_OK) return iSt;
PPC_GetResp (PPC_OUT_EMVDATA, sizeof(gszEmvData), gszEmvData);
if (szRes[0] = ‘0’) return APP_TRANS_APROVADA_OFFLINE;
if (szRes[0] = ‘1’) return APP_TRANS_NEGADA_OFFLINE;
/*--------- Requer autorização online!! -----------*/
PPC_GetResp (PPC_OUT_AUTHMET, 25, gszAuthenticationMethod);
if (!strcmp (gszAuthenticationMethod, “OnlineAuthentication”) {
PPC_GetResp (PPC_OUT_PINBLK, 17, gszEncryptedPinBlock);
PPC_GetResp (PPC_OUT_PINKSN, 21, gszKsnIdentification);
PPC_GetResp (PPC_OUT_ENCTYPE, 17, gszEncryptionType);
}
iSt = iSendOnlineAuthorization (szRetCode);
if (iSt == PPC_OK) {
PPC_SetParam (PPC_INP_RETCODE, szRetCode, -1);
PPC_SetParam (PPC_INP_EMVDATA, gszEmvResponseData, -1);
PPC_SetParam (PPC_INP_TAGLIST, gszTagsSecond, -1);
}
iSt = PPC_StartExecCmd (PPC_CMD_FINISHCHIP);
if (iSt != PPC_OK) return iSt;
do {
iSt = PPC_FinishExecCmd (sNotifyMsg);
if (iSt == PPC_NOTIFY) ShowNotifyMessage (sNotifyMsg);
if (WishToAbort () == TRUE) {
PPC_AbortCmd ();
return APP_ABORTED;
}
} while (iSt == PPC_PROCESSING || iSt == PPC_NOTIFY);
if (iSt != PPC_OK) {
if (!strcmp (szRetCode, “0”)) {
EnviaDesfazimento ();
}
return iSt;
}
iSt = PPC_GetResp (PPC_OUT_FINALRES, sizeof (szRes), szRes);
if (iSt != PPC_OK) return iSt;
if (szRes[0] == “1” || szRes[0] == “3”) {
if (szRes[0] == “3”) EnviaDesfazimento ();
return APP_TRANS_NEGADA;
}
if (szRes[0] == “0”) return APP_TRANS_APROVADA_OFFLINE;
return TRANS_APROVADA;
} Updated about 1 month ago
Did this page help you?