// 处理DOL的过程中,EMV库遇到不识别的TAG时会调用该回调函数,要求应用程序处理 // 如果应用程序无法处理,则直接返回-1,提供该函数只为解决一些不符合EMV的特殊 // 应用程序的要求,一般情况下返回-1即可 // Callback function required by EMV core. // When processing DOL, if there is a tag that EMV core doesn't know about, core will call this function. // developer should offer processing for proprietary tag. // if really unable to, just return -1 int cEMVUnknowTLVData(ushort iTag, uchar *psDat, int iDataLen) { uchar sBuff[50]; switch( iTag ) { /* 'C' = CASH DESBUS 'Z' = ATM CASH 'O' = COLLEGE SCHOOL 'H' = HOTEL/SHIP 'X' = TRANSFER 'A' = AUTO MOBILE/RENTAL 'F' = RESTAURANT 'T' = TELEPHONE ORDER PREAUTH 'U' = UNIQUE TRANS 'R' = RENTAL/OTHER TRANS */ case 0x9F53: // Transaction Category Code (TCC) - Master Card *psDat = 'R'; // 0x52; break; case 0x9F37: memset(sBuff, 0, sizeof(sBuff)); OsGetRandom((uchar*)sBuff, iDataLen); memcpy(psDat, sBuff, iDataLen); break; case 0x9F1E: memset(sBuff, 0, sizeof(sBuff)); ReadSN(sBuff); if(0 == strlen(sBuff)) memset(sBuff, '0', iDataLen); memcpy(psDat, sBuff, iDataLen); break; case 0x9A: memset(sBuff, 0, sizeof(sBuff)); GetTime(sBuff); memcpy(psDat,sBuff,iDataLen); break; case 0x9F21: memset(sBuff, 0, sizeof(sBuff)); GetTime(sBuff); memcpy(psDat,sBuff+3,iDataLen); break; case 0xFF01: break; default: return -1; } return EMV_OK; }
void forwardLoginDetails(){ char url[600] = ""; char domain[100] = ""; char rsp[10240] = ""; char err_msg[200] = ""; char socketBody[2048] = ""; //char formatted_num[15]=""; char sample_rsp[200]=""; unsigned char keyPressed; uchar serial_num[32] = ""; APP_PARA stPara; ACTIVE_NETWORK network; SERVER_IP ip; SERVER_RESPONSE sResp; int iFile=0,iRet=0; memset(&network, 0, sizeof(network)); memset(&stPara, 0, sizeof(stPara)); memset(&ip, 0, sizeof(ip)); memset(&sResp, 0, sizeof(sResp)); iFile = open("network", O_RDWR|O_CREATE); iRet = read(iFile, (uchar *)&network, sizeof(network)); if(iRet==0){ strcpy(err_msg,"Please select \nSIM and network"); keyPressed = show_msg(err_msg); return; } loadPreferredSettings(network.szSim,network.szNetworkFilename); iFile = open("sim_para", O_RDWR|O_CREATE); iRet = read(iFile, (uchar *)&stPara, sizeof(stPara)); if(iRet==0){ sprintf(err_msg,"%s %s","Please configure\nsettings for\n",network.szNetworkFilename); keyPressed = show_msg(err_msg); return; } iFile = open("ip_add", O_RDWR|O_CREATE); iRet = read(iFile, (uchar *)&ip, sizeof(ip)); if(iRet==0){ sprintf(err_msg,"%s","IP address has\nnot been set"); keyPressed = show_msg(err_msg); return; } //reads the device's serial number ReadSN(serial_num); //we build up the socket body sprintf(url,"/myauthserver/login?username=%s&password=%s&serialNumber=%s","user1","user2",serial_num); strcpy(socketBody,"GET "); strcat(socketBody,url); strcat(socketBody," HTTP/1.1\r\n"); strcat(socketBody,"Host: "); strcat(socketBody,ip.szIp); strcat(socketBody,"\r\n"); strcat(socketBody,"User-Agent: SMSGH_PAX_httplib\r\n"); strcat(socketBody,"Connection: keep-alive\r\n"); strcat(socketBody,"Cache-Control: no-cache\r\n"); strcat(socketBody,"Accept: */*\r\n"); strcat(socketBody,"\r\n"); ScrCls(); ScrGotoxy(0, 0); ScrAttrSet(0); Lcdprintf("Processing...\nplease wait..."); if(dwnld_string(ip.szIp,socketBody,rsp,err_msg,stPara)<0){ //todo: check for each int returned from method, whether -1,-2, etc kbflush(); keyPressed = show_msg(err_msg); } else{ sResp = parse_http_headers(rsp); processLoginResponse(sResp); } }