📄 cispub.cpp
字号:
/****************************************** 小额支付系统支票截留业务公共处理函数******************************************/#include <sys/time.h>#include <stdlib.h>#include <stdio.h>#include <math.h>#include <netdb.h>#include <sys/select.h>#include <sys/socket.h>#include <sys/time.h>#include <arpa/inet.h>#include "sybdblib.hpp"#include "CisPub.hpp"#include "libcore.h"#include "md5.h"#include "CBase64.h"#include "cnapstag.hpp"#include "mblib.h"#define CISINFO "CisIdx, MbfeIdx, doflag, rsflag, OprNo, PkgType, TrxsType,\ PreDate, TrxNo, RecverBKCD, RecverACC, RecverName,PayerBKCD, \ PayerACC,PayerName, MEYSYB, Amount, AccKind, AccNo, ChkDate,\ AccDate, AccPsw, Info, Remark, SysDate, RtnLimted, SRCFlag,\ ChkSatus, PicFront,PicBack,SignInfo,RedoCount, RedoInfo,CisData,\ TagData" //全局变量extern SybServer m_clsSybServer;extern int errno;//typedef unsigned short WORD;//typedef unsigned char UCHAR;//typedef unsigned char BYTE;SybCommand clsSybCommand(m_clsSybServer);SybResultset clsSybResultset(m_clsSybServer);///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////判断字符串是否为空BOOL IsEmptyStr( char *in_data ){ int i,j = 0; char tmp[1024]; memset(tmp,0,sizeof(tmp)); for(i = 0;i < strlen(in_data);i++) { if(in_data[i] != ' ') tmp[j++] = in_data[i]; } if( strlen(tmp) == 0 ) { return FALSE; } return TRUE;}//去字符串空格函数 BOOL StrTrim( char *in_data ){ int i,j = 0; char tmp[1024]; memset(tmp,0,sizeof(tmp)); for(i = 0;i < strlen(in_data);i++) { if(in_data[i] != ' ') tmp[j++] = in_data[i]; } strcpy( in_data , tmp); return TRUE;}BOOL BinToAsc(unsigned char* inPut, int inLen, char* outPut, int outLen){ if(inPut == NULL || outPut == NULL) { return FALSE; } if(outLen != 2*inLen) { return FALSE; } int tmp = 0; for (int i=0;i<inLen;i++) { //高位处理 tmp = (inPut[i]>> 4) & 0X0F; if (tmp < 10) outPut[2*i] = tmp + 48 ; else outPut[2*i] = tmp + 55 ; //低位处理 tmp = inPut[i] & 0X0F; if (tmp < 10) outPut[2*i+1] = tmp + 48 ; else outPut[2*i+1] = tmp + 55 ; } filelog(CIS_SRV_LOG, "BinToAsc::OutPut=[d][%s]", outLen, outPut); return TRUE;}//BASE64加密算法int SH_EncodeBase64(char *pASCSrc,char *pBase64Res){ int srcLen; char cMap[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char *pCurSrc,*pCurRes; int i,j,k,group; char ch_Asc[4],ch_Base[4],ch,cha; if(!pASCSrc || !pBase64Res) return -1; srcLen = strlen(pASCSrc); if(srcLen<1) { *pBase64Res = 0; return -1; } group = srcLen/3; i = 0; pCurSrc = pASCSrc; pCurRes = pBase64Res; while(i<group) { for(j=0;j<3;j++) { if(pCurSrc[j]!=0) { ch_Asc[j] = *(pCurSrc+j); } else { for(k=j;k<4;k++) { ch_Asc[k] = 0; } } } ch_Base[0] = ((ch_Asc[0]>>2)&0x3f); *pCurRes = cMap[ch_Base[0]]; ch_Base[1] = ((ch_Asc[0]<<4)&0x30); ch_Base[1] += ((ch_Asc[1]>>4)&0x0f); *(pCurRes+1) = cMap[ch_Base[1]]; ch_Base[2] = (ch_Asc[1]<<2)&0x3c; ch_Base[2] += ((ch_Asc[2]>>6)&0x03); *(pCurRes+2) = cMap[ch_Base[2]]; ch_Base[3] = (ch_Asc[2]&0x3f); *(pCurRes+3) = cMap[ch_Base[3]]; i++; pCurSrc+=3; pCurRes+=4; } if((srcLen%3) == 1) { ch = *pCurSrc; ch = ch>>2; ch = ch&(0x3f); *(pCurRes++) = cMap[ch]; ch = *pCurSrc; ch = ch<<4; ch = ch&(0x30); *(pCurRes++) = cMap[ch]; *(pCurRes++) = '='; *(pCurRes++) = '='; *pCurRes = 0; } else if((srcLen%3) == 2) { ch = *pCurSrc; ch = (ch>>2); ch = ch&(0x3f); *(pCurRes++) = cMap[ch]; ch = *pCurSrc; cha = *(pCurSrc+1); ch = ch<<4; ch = ch&(0x30); cha = (cha>>4); cha = cha&(0x0f); cha += ch; *(pCurRes++) = cMap[cha]; ch = *(pCurSrc+1); ch = ch<<2; ch = (ch&(0x3c)); *(pCurRes++) = cMap[ch]; *(pCurRes++) = '='; *pCurRes = 0; } else *pCurRes = 0; return 1;}//BASE64加密算法int SH_DecodeBase64(char *pBase64Src,char *pASCRes){ int srcLen; char *pCurSrc,*pCurRes; int i=0,j,group; char ch[4],ch_Asc[4]; srcLen = strlen(pBase64Src); if(srcLen % 4 != 0) { *pASCRes = 0; return -1; } group = srcLen/4; pCurSrc = pBase64Src; pCurRes = pASCRes; do { for(j=0;j<4;j++) { ch[j] = *(pCurSrc+j); if(ch[j]>='A' && ch[j]<='Z') { ch_Asc[j] = ch[j] - 'A'; } else if(ch[j]>='a' && ch[j]<='z') { ch_Asc[j] = ch[j] -'a' + 26; } else if(ch[j]>='0' && ch[j]<='9') { ch_Asc[j] = ch[j] - '0' + 52; } else if(ch[j] == '+') { ch_Asc[j] = 62; } else if(ch[j] == '/') { ch_Asc[j] = 63; } else if(ch[j] == '=') { ch_Asc[j] = '='; } else { *pASCRes = 0; return -1; } } *pCurRes = (ch_Asc[0]<<2) + (((ch_Asc[1]&0x30)>>4)&0x0f); if(ch[2]!='=') *(pCurRes+1) = ((ch_Asc[1]&0x0f)<<4) + (((ch_Asc[2]&0x3c)>>2)&0x3f); else { *(pCurRes+1) = (ch_Asc[1]&0x0f)<<4; *(pCurRes+2) = 0; return 1; } if(ch[3]!='=') *(pCurRes+2) = ((ch_Asc[2]&0x03)<<6) + ch_Asc[3]; else { *(pCurRes+2) = (ch_Asc[2]&0x03)<<6; *(pCurRes+3) = 0; return 1; } i++; pCurRes += 3; pCurSrc += 4; }while(i<group); *(pCurRes) = 0; return 1;}//和行内对接int SndRcvData( char *ip, WORD port, char *pSBuf, char *pRBuf ,WORD iSlen,WORD *iRlen){ struct sockaddr_in dst_addr; struct linger tcp_linger; int ret = 0; int nsocket = 0; long optval; long optlen; struct fd_set fds; struct timeval waittime; optval = 1; optlen = sizeof(optval); nsocket = socket(AF_INET, SOCK_STREAM, 0); if (nsocket == -1) { printf("产生加密套接字失败!\n"); return -2; } bzero((char *)&dst_addr, sizeof(dst_addr)); dst_addr.sin_family= AF_INET; dst_addr.sin_port = htons(port); /*加密机端口*/ dst_addr.sin_addr.s_addr = inet_addr(ip); ret = connect(nsocket, (struct sockaddr *)&dst_addr, sizeof(dst_addr)); if (ret == -1) { printf("连接失败[%d][%s]\n",ret,strerror(errno)); close(nsocket); return -1; } tcp_linger.l_onoff = 1; /* Linger On */ tcp_linger.l_linger= 0; /* 0 seconds */ ret = setsockopt(nsocket,SOL_SOCKET,SO_LINGER,&tcp_linger,sizeof(struct linger)); if(ret == -1) { printf("设置参数失败[%d][%s]!\n",ret,strerror(errno)); close(nsocket); return -1; } ret = setsockopt(nsocket, SOL_SOCKET, SO_REUSEADDR, &optval, optlen); if(ret == -1) { printf("设置参数失败[%d][%s]!\n",ret,strerror(errno)); close(nsocket); return -1; } ret = setsockopt(nsocket, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen); if(ret == -1) { printf("设置参数失败[%d][%s]!\n",ret,strerror(errno)); close(nsocket); return -1; } /* 检查是否可以发送 */ waittime.tv_sec = 3; waittime.tv_usec = 0; FD_ZERO(&fds); FD_SET(nsocket,&fds); ret = select(nsocket + 1,NULL,&fds,NULL,&waittime); if ( ret <=0 ) { return -1; } /* 发送数据 */ ret = send(nsocket,pSBuf,iSlen,0); if (ret < 0) { return -1; } /* 是否有接收数据 */ FD_ZERO(&fds); FD_SET(nsocket,&fds); ret = select(nsocket + 1, &fds,NULL,NULL, &waittime); if(ret <= 0){ return -1; } /* 接收数据 */ memset(pRBuf,0,sizeof(pRBuf)); ret = recv(nsocket,pRBuf,4096,0); printf("IN SndRcvData:ret = [%d]",ret); /*返回的结果太少*/ if ( ret < 1){ return -1; } *iRlen = ret; return 0; }//和行内对接int MbAPI( int type, char *brchno, char *tellerno, char *pwd, char *workdate, char *strNo,char *ip, int port){ char pSBuf[255], pRBuf[255]; WORD iSlen = 0, iRlen = 0; memset( pSBuf, 0, sizeof( pSBuf )); memset( pRBuf, 0, sizeof( pRBuf )); char strno[10]; memset(strno,0,sizeof(strno)); int len=strlen(brchno); strcpy(strno,brchno+6); /* 小心通讯流水号 */ if ( type == 0 )// sprintf(pSBuf, "0053000104000001001000000051100104p2 10406 %-16.16s2007/04/0323:13:3300",pwd); sprintf(pSBuf, "0053000%s%s001000000%9.9sp2 %5.5s %-16.16s%10.10s11:12:2200", strno,strNo,brchno, tellerno, pwd, workdate ); else sprintf(pSBuf, "0053000%s%s001010000%9.9sp2 %5.5s %-16.16s%10.10s11:12:2200", strno,strNo,brchno, tellerno, pwd, workdate ); iSlen = strlen( pSBuf ); if ( SndRcvData( ip, port, pSBuf, pRBuf ,iSlen, &iRlen) <> 0 ) { printf("通讯失败!\n"); return -1; } printf("[%.4s]\n", pRBuf+21); if (memcmp( pRBuf + 21, "0000", 4 ) == 0) return 0; return -1;}//格式化金额int GetAmount(char *in_data,char *out_data){ char sAmount[100],sAmount0[100]; char tmp[100]; int i,j,k; int len; char RMB[4],TmpOut[50]; // printf("Enter GetAmount....\n"); memset(sAmount,0,sizeof(sAmount)); memset(sAmount0,0,sizeof(sAmount0)); memset(tmp,0,sizeof(tmp)); memset(RMB,0,sizeof(RMB)); memset(TmpOut,0,sizeof(TmpOut)); memcpy( RMB , in_data , 3 ); len = strlen(in_data)-3; strcpy(tmp,in_data+3); for(i = 0;i<len;i++) { if(tmp[i] <= '9' && tmp[i] > '0') { strcpy(sAmount,&tmp[i]); break; } } len = strlen(sAmount); if( len == 0) { sprintf( out_data , "%s0.0",RMB); printf("Before = [%s] After = [%s]\n", in_data,out_data); return 0; } if( len == 1) { sprintf( out_data , "%s0.0%s",RMB,sAmount); printf("Before = [%s] After = [%s]\n", in_data,out_data); return 0; } if( len == 2) { sprintf( out_data , "%s0.%s",RMB,sAmount); printf("Before = [%s] After = [%s]\n", in_data,out_data); return 0; } memset(tmp,0,sizeof(tmp)); for(i = 0;i < len;i++) tmp[i] = sAmount[len - i - 1]; memset(sAmount,0,sizeof(sAmount)); sAmount[0] = tmp[0]; sAmount[1] = tmp[1]; sAmount[2] = '.'; for(i = 3,j = 0,k = 2;j <= len ; j++) { if( j%4 == 3) { sAmount[i++] = ','; } else { sAmount[i++] = tmp[k++]; } } memset(tmp,0,sizeof(tmp)); len = strlen(sAmount); for( i = 0;i < len;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -