int CTradeConsume::DoPack(SAConnection *saConn, void * pNode,unsigned char * pBuffer, unsigned & iBufLen) { if(saConn == NULL || pNode == NULL || pBuffer == NULL) { trace_log(ERR, "Paramter error!"); return RET_SYSEXP; } trace_log(DBG,"-----Consume-----"); TRADEDATA * pData = (TRADEDATA *)pNode; int nTlvLen=0; char cICCID[4]={0},cICData[256]={0}; CTLVTemplet tlvObj; if(1 != tlvObj.UnPackTLVData(pData->TransData.TlvDataLen, pData->TransData.TlvData)) { trace_log(ERR, "UnPackTLVData fail!"); return RET_SYSEXP; } bool bFlag = true; bool bHasPin = false, bHasTrack = false; //0消息类型 bFlag &= sndObj.SetValueByStr(0 , "0200"); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //2账号 bFlag &= sndObj.SetValueByStr(2 ,pData->TransData.HeadData.Account ); trace_log(DBG,"pData->TransData.HeadData.Account2:%s",pData->TransData.HeadData.Account); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //3处理码 bFlag &= sndObj.SetValueByStr(3 , "190000"); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //4交易金额 bFlag &= sndObj.SetValueByStr(4 , pData->TransData.HeadData.ReqAmount); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //7交易金额 bFlag &= sndObj.SetValueByHex(7 ,(unsigned char*) (pData->cDateTime+4),10); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //11流水号 bFlag &= sndObj.SetValueByStr(11, pData->VouchNo); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //本地交易时间 bFlag &= sndObj.SetValueByHex(12,(unsigned char*) (pData->cDateTime+8),6); //本地交易日期 bFlag &= sndObj.SetValueByHex(13, (unsigned char*) (pData->cDateTime+4),4); //F22服务点输入码 bFlag &= sndObj.SetValueByStr(22,(char *)pData->TransData.HeadData.SvrPointCode );//"022" if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //F23 卡片序列号 nTlvLen= tlvObj.GetTLVItemByHex(TAG_ICCID, (BYTE *)cICCID, sizeof(cICCID)); if(nTlvLen>0) { char cICNO[5]={0}; BcdToAsc((BYTE *)cICNO,(BYTE *)cICCID,nTlvLen); bFlag &= sndObj.SetValueByStr(23, cICNO+1); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } } //F25 服务点条件码 bFlag &= sndObj.SetValueByStr(25, "82"); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //F26 服务点PIN获取码 if('1'==pData->TransData.HeadData.SvrPointCode[2]) { bFlag &= sndObj.SetValueByStr(26, "12"); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } } //F32 受理机构标识码 bFlag &= sndObj.SetValueByStr(32, pData->RcvBrchCode); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //F33 发送机构标识码 bFlag &= sndObj.SetValueByStr(33, pData->SndBrchCode); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } /**< 磁道处理*/ if(SetTrack(pData, tlvObj, bHasTrack)!=0) { trace_log(ERR, "SetTrack faile"); return -1; }else{ trace_log(DBG, "SetTrack SUCCESS"); } //F37 检索参考号 bFlag &= sndObj.SetValueByStr(37, pData->cReference); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //41终端号 bFlag &= sndObj.SetValueByStr(41, pData->TransData.HeadData.arrRTermNo); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //42商户号 bFlag &= sndObj.SetValueByStr(42,pData->TransData.HeadData.arrRMerchNo); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //43受卡方名称地址 char cDest[41]={0}; GBK2UTF8(pData->TransData.HeadData.RPrintMerName,cDest); bFlag &= sndObj.SetValueByStr(43, cDest);//"ME31S" if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //49货币代码 bFlag &= sndObj.SetValueByStr(49, "156"); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } /**< 52密码*/ trace_log(DBG,"pData->TransData.HeadData.Account3:%s",pData->TransData.HeadData.Account); if(SetPinKey(pData, tlvObj, bHasPin)!=0) { trace_log(ERR, "SetPinKey faile"); return -1; }else{ trace_log(DBG, "SetPinKey SUCCESS"); } //53安全控制信息 bFlag &= sndObj.SetValueByStr(53, "2600000000000000"); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //55 C卡数据域 nTlvLen= tlvObj.GetTLVItemByHex(TAG_FIELD55_RSP, (BYTE *)cICData, sizeof(cICData)); if(nTlvLen>0) { bFlag &= sndObj.SetValueByHex(55, (BYTE *)cICData,nTlvLen); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } } //128MAC bFlag &= sndObj.SetValueByHex(128, (unsigned char*)"00000000", 8); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } /**< 组包*/ iBufLen = PACK_MAXLEN; bFlag &= sndObj.Pack(pBuffer, iBufLen); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } trace_log(DBG,"sndObj.Pack:"); trace_mem(pBuffer, iBufLen); /**< 计算Mac */ BYTE bMac[9] = {0}; int nMacLen = 8; if(0!=GenMacData(pData,sndObj,bMac)) { return RET_GETMACERR; } memcpy(pBuffer + iBufLen -nMacLen, bMac, nMacLen); return RET_SUCCESS; }
static int parse_mobile_info_amazon(struct page_t* page, struct mobile_info* info) { char* rbuf; int rsize; char* left = NULL; char* right = "</td></tr>"; char* str_get = NULL; char* find_pos = NULL; char* find_str = NULL; int ret = 0; char buf_left[URL_LEN] = {0}; char buf_right[URL_LEN] = {0}; if (NULL == page || NULL == page->page_buf) { return -1; } ret = get_rbuf_of_page_buf(page->page_buf, &rbuf, &rsize); if (-1 == ret) { return -1; } info->store_c = PRO_MOBILE_AMAZON; strcpy_s(info->url, URL_LEN, page->url); // 获取title left = "<span id=\"btAsinTitle\">"; right = "</span>"; regex(rbuf, left, right, &str_get); if (str_get != NULL) { // 存储数据 char buf_tmp[1024] = {0}; UTF82GBK(str_get, strlen(str_get), buf_tmp, 1024); strcpy_s(info->details, sizeof(info->details), buf_tmp); free(str_get); str_get = NULL; } // 品牌 // 先移到title处 find_str = "品牌: <a href=\""; memset(buf_left, 0, URL_LEN); GBK2UTF8(find_str, strlen(find_str), buf_left, URL_LEN); find_str = buf_left; find_pos = find(rbuf, find_str); if (NULL == find_pos) { fprintf(stderr, "品牌字段为空,丢掉!\n"); return -1; } left = "\">"; right = "</a>"; regex(find_pos, left, right, &str_get); if (str_get != NULL) { char buf_tmp[64] = {0}; UTF82GBK(str_get, strlen(str_get), buf_tmp, 64); strcpy_s(info->brand, sizeof(info->brand), buf_tmp); free(str_get); str_get = NULL; } else { fprintf(stderr, "品牌字段为空,丢掉!\n"); return -1; } // 型号 left = "<li><b>型号:</b> "; memset(buf_left, 0, URL_LEN); GBK2UTF8(left, strlen(left), buf_left, URL_LEN); left = buf_left; right = "</li>"; regex(rbuf, left, right, &str_get); if (str_get != NULL) { char buf_tmp[64] = {0}; UTF82GBK(str_get, strlen(str_get), buf_tmp, 64); // 将型号转换成大写 // strupr(buf_tmp); // 不严谨,比如iphone strcpy_s(info->model, sizeof(info->model), buf_tmp); free(str_get); str_get = NULL; } // 价格 left = "<span id=\"actualPriceValue\"><b class=\"priceLarge\">"; right = "</b></span>"; regex(rbuf, left, right, &str_get); if (str_get != NULL) { char buf_tmp[512] = {0}; UTF82GBK(str_get, strlen(str_get), buf_tmp, 512); repalce_of(buf_tmp, ",", ""); repalce_of(buf_tmp, " ", ""); repalce_of(buf_tmp, "¥", ""); strcpy_s(info->str_price, sizeof(info->str_price), buf_tmp); free(str_get); str_get = NULL; } // img url // img 在上层获取 strcpy_s(info->img_url, URL_LEN, page->img_url); // left = "function(){var i=new Image;i.src = \""; // right = "\";}"; // regex(rbuf, left, right, &str_get); // if (NULL == str_get) // { // fprintf(stderr, "获取img url失败...\n"); // } // // if (str_get != NULL) // { // strcpy_s(info->img_url, URL_LEN, str_get); // free(str_get); // str_get = NULL; // } // 评论总数 find_str = "<span class='sl-title-tab-title'>总体不错</span>"; memset(buf_left, 0, URL_LEN); GBK2UTF8(find_str, strlen(find_str), buf_left, URL_LEN); find_str = buf_left; find_pos = find(rbuf, find_str); if (NULL == find_pos) { //fprintf(stderr, "获取‘总评数’失败...\n"); // 获取失败有可能是还没有开卖呢 //return -1; } left = "<span class='sl-title-tab-count'>("; right = ")</span>"; regex(find_pos, left, right, &str_get); if (str_get != NULL) { info->judge_count = atoi(str_get); free(str_get); str_get = NULL; } // 好评率 left = "<span style='float:right'>"; right = "%</span>"; regex(find_pos, left, right, &str_get); if (str_get != NULL) { info->good_judge_rate = atoi(str_get); free(str_get); str_get = NULL; } // 如果好评率没有,则通过4星、5星来转换 if (0 == info->judge_count) { int good_judge_count = 0; find_str = "条评论</b>"; memset(buf_left, 0, URL_LEN); GBK2UTF8(find_str, strlen(find_str), buf_left, URL_LEN); find_str = buf_left; find_pos = find(rbuf, find_str); if (NULL == find_pos) { return 0; } // 将find_pos向前移动,移到数字前面去 find_pos -= 16; left = "<b>"; right = "条评论</b>"; memset(buf_left, 0, URL_LEN); GBK2UTF8(right, strlen(right), buf_left, URL_LEN); right = buf_left; regex(find_pos, left, right, &str_get); // 去掉评论总数中的',' repalce_of(str_get, ",", ""); info->judge_count = atoi(str_get); free(str_get); str_get = NULL; if (info->judge_count <= 0) { return 0; } // 获取5星个数 find_str = "5 星</a>"; memset(buf_left, 0, URL_LEN); GBK2UTF8(find_str, strlen(find_str), buf_left, URL_LEN); find_str = buf_left; find_pos = find(rbuf, find_str); if (NULL == find_pos) { return 0; } left = " ("; right = ")</td>"; regex(find_pos, left, right, &str_get); good_judge_count += atoi(str_get); free(str_get); str_get = NULL; // 获取4星个数 find_str = "4 星</a>"; memset(buf_left, 0, URL_LEN); GBK2UTF8(find_str, strlen(find_str), buf_left, URL_LEN); find_str = buf_left; find_pos = find(rbuf, find_str); if (NULL == find_pos) { goto calc_rate; } left = " ("; right = ")</td>"; regex(find_pos, left, right, &str_get); good_judge_count += atoi(str_get); free(str_get); str_get = NULL; calc_rate: // 计算好评率 info->good_judge_rate = (int)((float)(good_judge_count) / (float)(info->judge_count) * 100); } return 0; }