Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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 = "&nbsp;(";
        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 = "&nbsp;(";
        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;
}