📄 scomm_cups.c
字号:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <time.h>
#include "gaps_head.h"
typedef struct TAG_CTLMSG
{
long mtype;
int msglen;
int pid;
long msgtime;
int stat;
}CTLMSG;
typedef struct TAG_MSG
{
mtyp_t mtype;
char mtext[MAX_PKG];
}TMSG;
#define COMMCLIINI "clicomm.ini"
#define MSGSTAT_SENDWAIT 1 /*消息状态:发送等待*/
#define MSGSTAT_SENDSUCC 2 /*消息状态:发送成功*/
#define MSGSTAT_RECVSUCC 6 /*消息状态:接收成功*/
#define MAXMSGLIVETIME 360 /*最大消息存活时间(十分钟)*/
int _WriteAbortmsg(int mtype,char *msgtext,int msglen,CTLMSG ctrlmsg);
IRESULT SCOMM_CUPS(HXMLTREE lXmlhandle)
{
int iParas;
char sCommbuf[MAX_PKG];
char sBuf[MAX_PKG];
char strBwlx[21];
char sendflag[10];
char szAddress[10];
int srlen,iPkglen;
int iRet;
fpub_InitSoComp(lXmlhandle);
memset(strBwlx, 0, sizeof(strBwlx));
memset(sendflag, 0, sizeof(sendflag));
memset(szAddress, 0, sizeof(szAddress));
COMP_PARACOUNTCHK(3)
COMP_GETPARSEPARAS(1, strBwlx, "报文类型")
COMP_GETPARSEPARAS(2, sendflag, "发送标记")
COMP_GETPARSEPARAS(3, szAddress, "获取目的地")
LOG(LM_DEBUG,Fmtmsg("组件[%s]执行开始",fpub_GetCompname(lXmlhandle)),"")
LOG(LM_DEBUG,Fmtmsg("报文类型[%s]!",strBwlx),fpub_GetCompname(lXmlhandle))
LOG(LM_DEBUG,Fmtmsg("发送标记[%s]!",sendflag),fpub_GetCompname(lXmlhandle))
LOG(LM_DEBUG,Fmtmsg("获取目的地[%s]!",szAddress),fpub_GetCompname(lXmlhandle))
trim(strBwlx);
/* 设置报文数据内容到内部XML中 */
if((srlen=xml_GetBinElement(lXmlhandle,XMLNM_COMMBUF,sCommbuf,sizeof(sCommbuf)))<=0)
{
fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
Fmtmsg(MSG_SYS_COMPEXEC,fpub_GetCompname(lXmlhandle)));
fpub_SetCompStatus(lXmlhandle,-1);
return -1;
}
/**/
/*8583报文预处理*/
if (strncmp(strBwlx,"8583",4) == 0)
{
memset(sBuf, 0, sizeof(sBuf));
sBuf[0] = 41;
sBuf[1] = 1;
sprintf(sBuf+2, "%4.4d00000000000000000000000000000000000", srlen+41);
memcpy(sBuf+41, sCommbuf, srlen);
memset(sCommbuf, 0, sizeof(sCommbuf));
memcpy(sCommbuf,sBuf,srlen+41);
srlen = srlen + 41;
}
if(sendflag[0]=='0')/*返回应答包*/
{
if((iRet=SndCUPS(szAddress, sCommbuf,sizeof(sCommbuf),&srlen))<0)
{
switch( iRet )
{
case -1:
fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
Fmtmsg("银联通讯发送失败",fpub_GetCompname(lXmlhandle)));
break;
case -3:
fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
Fmtmsg("银联通讯配置错误",fpub_GetCompname(lXmlhandle)));
break;
}
fpub_SetCompStatus(lXmlhandle,iRet);
return iRet;
}
}
else/*发送请求包并接受返回*/
{
if((iRet=SndandRcvCUPS(szAddress, sCommbuf,sizeof(sCommbuf),&srlen))<0)
{
switch( iRet )
{
case -1:
fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
Fmtmsg("银联通讯发送失败",fpub_GetCompname(lXmlhandle)));
break;
case -2:
fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
Fmtmsg("银联通讯接收失败",fpub_GetCompname(lXmlhandle)));
break;
case -3:
fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
Fmtmsg("银联通讯配置错误",fpub_GetCompname(lXmlhandle)));
break;
}
fpub_SetCompStatus(lXmlhandle,iRet);
return iRet;
}
LOG(LM_STD,Fmtmsg("接收发卡系统应答成功!长度[%d]内容[%s]", srlen,sCommbuf), "")
if(xml_SetBinElement(lXmlhandle,XMLNM_COMMBUF,sCommbuf,srlen)<0)
{
fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
Fmtmsg(MSG_SYS_COMPEXEC,fpub_GetCompname(lXmlhandle)));
fpub_SetCompStatus(lXmlhandle,-2);
return -2;
}
}
/* 设置返回状态 */
fpub_SetCompStatus(lXmlhandle,COMPSTATUS_SUCC);
LOG(LM_DEBUG,Fmtmsg("组件[%s]执行结束",fpub_GetCompname(lXmlhandle)),"")
return 0;
}
static int iTimeout=0;
void Bitalarm()
{
iTimeout=1;
alarm(0);
}
/*************************************************
函数:SndCUPS
功能:发送交易应答到银联
参数:1.通讯缓冲
2.通讯缓冲长度
3.发送/接收长度
返回:
=0 成功
-1 发送错误
-3 系统配置错误
消息的键值指定方法:8583第11域跟踪号作为键值
*************************************************/
int SndCUPS(char *szAddress, char * buffer,int buflen,int * srlen)
{
key_t msgskey,msgrkey,msgctrlkey;
char sinifile[100],cfgbuf[100];
int msgsid,msgrid,msgctrlid;
int timeout,t0,ilen,ilen2,iret;
char sFklsh[11];
TMSG Smsg,Rmsg;
CTLMSG Sctlmsg;
if(getenv("GAPSETCDIR")==NULL)
snprintf(sinifile,sizeof(sinifile),"%s/etc/%s",getenv("HOME"),COMMCLIINI);
else snprintf(sinifile,sizeof(sinifile),"%s/%s",getenv("GAPSETCDIR"),COMMCLIINI);
memset(cfgbuf,0,sizeof(cfgbuf));
if(ExGetCfgItem(sinifile,"CUPS","SNDMSGKEY",cfgbuf,sizeof(cfgbuf))<0)
{
LOG(LM_DEBUG,Fmtmsg("银联处理[%s]配置文件配置项[%s]错误",sinifile,"SNDMSGKEY"),"")
return -3;
}
msgskey=atoi(cfgbuf);
memset(cfgbuf,0,sizeof(cfgbuf));
if(ExGetCfgItem(sinifile,"CUPS","RCVMSGKEY",cfgbuf,sizeof(cfgbuf))<0)
{
LOG(LM_DEBUG,Fmtmsg("银联处理[%s]配置文件配置项[%s]错误",sinifile,"RCVMSGKEY"),"")
return -3;
}
msgrkey=atoi(cfgbuf);
memset(cfgbuf,0,sizeof(cfgbuf));
if(ExGetCfgItem(sinifile,"CUPS","CTRLMSGKEY",cfgbuf,sizeof(cfgbuf))<0)
{
LOG(LM_DEBUG,Fmtmsg("银联处理[%s]配置文件配置项[%s]错误",sinifile,"CTRLMSGKEY"),"")
return -3;
}
msgctrlkey=atoi(cfgbuf);
memset(cfgbuf,0,sizeof(cfgbuf));
if(ExGetCfgItem(sinifile,"CUPS","TIMEOUT",cfgbuf,sizeof(cfgbuf))<0)
{
LOG(LM_DEBUG,Fmtmsg("银联处理[%s]配置文件配置项[%s]错误",sinifile,"TIMEOUT"),"")
return -3;
}
timeout=atoi(cfgbuf);
if((msgsid=msgget(msgskey,0666))<0)
{
LOG(LM_DEBUG,Fmtmsg("银联处理通讯服务未启动"),"")
return -3;
}
memset(&Smsg, 0, sizeof(TMSG));
Smsg.mtype=atol(szAddress);
memcpy(Smsg.mtext,buffer,*srlen);
/*写控制队列*/
memset(&Sctlmsg,0,sizeof(Sctlmsg));
Sctlmsg.mtype=Smsg.mtype;
Sctlmsg.msglen=*srlen;
Sctlmsg.pid=getpid();
Sctlmsg.msgtime=time(NULL);
Sctlmsg.stat=MSGSTAT_SENDWAIT;
/* if( (iret=msgsnd(msgctrlid,&Sctlmsg,sizeof(Sctlmsg)-sizeof(long),IPC_NOWAIT))!=0)
{
LOG(LM_DEBUG,Fmtmsg("Send err %d %d %d %d %s",msgctrlid,Smsg.mtype,iret,errno,strerror(errno)),"")
return -1;
}*/
/*写发送队列*/
if( (iret=msgsnd(msgsid,&Smsg,*srlen,IPC_NOWAIT))!=0)
{
LOG(LM_DEBUG,Fmtmsg("Send err %d %d %d %d %s",msgsid,Smsg.mtype,iret,errno,strerror(errno)),"")
/* ilen=msgrcv(msgctrlid,&Sctlmsg,sizeof(Sctlmsg),Smsg.mtype,IPC_NOWAIT);*/
return -1;
}
LOG(LM_DEBUG,Fmtmsg("sendlen=%d,mtype=%d",*srlen,Smsg.mtype),buffer)
return 0;
}
/**********************************************************
配置说明:相关的配置参数设置在etc下的clicomm.ini的CUPS区下
具体内容如下:
[CUPS]
SNDMSGKEY= #发送消息队列键值
RCVMSGKEY= #接收消息队列键值
CTRLMSGKEY= #控制消息队列键值
TIMEOUT= #通讯超时时间
AMSGFILE= #异常消息重定向文件,相对$HOME路径或绝对路径
***********************************************************/
/*************************************************
函数:SndandRcvCUPS
功能:发送交易请求到银联,并返回结果
参数:1.通讯缓冲
2.通讯缓冲长度
3.发送/接收长度
返回:
=0 成功
-1 发送错误
-2 接收错误
-3 系统配置错误
消息的键值指定方法:8583第11域跟踪号作为键值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -