VB.NET 连接 POS机 DLL接口出错,请高手指点!!!
POS机与pc通讯函数
函数原型:int ExchangeData(unsigned char TransType,
unsigned char *ToTerminal, unsigned short ReqLen
unsigned char *FrmTerminal, unsigned short *RepLen,
unsigned short TimeOut)
输入参数:
TransType 交易类型
ToTerminal 交易请求数据
ReqLen 交易请求数据长度
FrmTerminal 交易应答数据
RepLen 交易应答数据长度
TimeOut 交易处理超时时间
改成VB.NET:
Public Structure 查询
Public 交易类型 As Byte
Public 交易结果 As Byte
Public 返回数据 As String
End Structure
Private Declare Function ExchangeData Lib "zhsb_api.dll" Alias "ExchangeData" (ByVal _
TransType As Byte, ByVal _
ToTerminal As String, ByVal _
ReqLen As Integer, ByVal _
FrmTerminal As 查询, ByVal _
RspLen As Integer, ByVal _
TimeOut As Short _
) As Integer
查询时, 交易请求包为空,传入的长度参数为0
返回交易应答格式:
交易类型:(1字节,查询为0x31)
交易结果标志:(1字节)
交易数据:(交易成功426定长字节,内容见下,交易失败时,为中文提示信息)
运行程序后与POS机连接,POS机显示查询正确,但PC机显示:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
请各位大侠帮忙看看,先感谢各位!
附POS返回给电脑的数据包格式:
交易数据包
交易(查询)
交易请求包1(查询)
为空,传入的长度参数为0
交易响格式(查询)
交易类型(1字节,查询为0x31)
(1字节,交易结果标志
交易数据(交易成功426定长字节,内容见下,交易失败时,为中文提示信息)
交易结果标志:1字节,
0x00-成功,后面跟的是426个字节的交易数据
其他值 交易失败,后面以中文字符方式应答了失败原因,不需要处理其响应码
交易数据:426字节的交易数据(为了不更改以后接口用)
注:BCD码为压缩的十进制数,HEX为16进制数,为不可压缩数值。
卡的识别码 16字节 32位压缩BCD码
卡类别 1字节
规范版本 4字节 HEX码
初始化机构编号 12字节 24位压缩BCD码
发卡日期 4字节 8位压缩BCD码
失效日期 4字节 8位压缩BCD码
卡号 9字节 字符
公民身份证号码 18字节 字符
姓名 30字节 字符
性别 1字节 字符
民族 1字节 2位压缩BCD码
出生地 3字节 6位压缩BCD码
出生日期 4字节 8位压缩BCD码
基本医疗保险个人账户建立日期 4字节 8位压缩BCD码
定点医疗机构名称1 62字节 字符
定点医疗机构名称扩展1 8字节 字符
定点医疗机构代码1 9字节 字符
定点医疗机构名称2 62字节 字符
定点医疗机构名称扩展2 8字节 字符
定点医疗机构代码2 9字节 字符
定点医疗机构名称3 62字节 字符
定点医疗机构名称扩展3 8字节 字符
定点医疗机构代码3 9字节 字符
医疗证号 15字节 字符
基本医疗保险个人账户 10字节 字符
医疗人员类别 1字节
医疗保险用卡方式 1字节
基本医疗保险个人账户余额 4字节 高位在前的HEX码
年度个人自付累计金额 4字节 高位在前的HEX码
年度统筹基金支付累计金额 4字节 高位在前的HEX码
发卡行ID 8字节 16位BCD码(转换后取左三位上传)
最近审核日期 4字节 8位压缩BCD码
分散因子 8字节 HEX码
黑名单版本号 19字节
附上C语言结构
typedef struct
{
unsigned char card_id [0x10];
unsigned char card_type [0x01];
unsigned char criterion [0x04];
unsigned char initorgan [0x0c];
unsigned char issuer_dt [0x04];
unsigned char expire [0x04];
unsigned char cardno [0x09];
unsigned char personid [0x12];
unsigned char name [0x1e];
unsigned char sex [0x01];
unsigned char nation [0x01];
unsigned char homeplace [0x03];
unsigned char birthday [0x04];
unsigned char accreatedt [0x04];
unsigned char hospitalname1 [0x3e];
unsigned char hospitalnameext1 [0x08];
unsigned char hospitalcode1 [0x09];
unsigned char hospitalname2 [0x3e];
unsigned char hospitalnameext2 [0x08];
unsigned char hospitalcode2 [0x09];
unsigned char hospitalname3 [0x3e];
unsigned char hospitalnameext3 [0x08];
unsigned char hospitalcode3 [0x09];
unsigned char medicerti [0x0f];
unsigned char mediaccount [0x0a];
unsigned char meditype [0x01];
unsigned char usecardtype [0x01];
unsigned char balance0 [0x04];
unsigned char balance1 [0x04];
unsigned char balance2 [0x04];
unsigned char bankid [0x08];
unsigned char latestchktime [0x04];
unsigned char diverfactor [0x08];
unsigned char blacklistver [0x13];
} T_MEDICARDINFO;
注:发卡行ID==0+卡号的前两位(例如05)== 005
分散因子采用三级分散因子
交易(消费)
交易请求2(消费)
金额(12位数值,压缩成6字节BCD码,不足时前补0)
商户名称(16字节,即最多8个中文字,不足填空格)
商户操作人员姓名(8字节,即最多4个中文字,不足填空格)
PC编号(12字节ASCII, 不足时后补二进制0)
PC交易序号(12字节ASCII, 不足时后补二进制0)
交易响应2(消费)
交易类型(1字节,消费为0x32)
0x02(1字节,交易结果标志)
交易数据(交易成功34定长字节,内容见下,交易失败时,为中文提示信息)
交易结果标志:1字节,
0x00-成功,后面跟的是34个字节的交易数据
其他值 交易失败,后面以中文字符方式应答了失败原因,不需要处理其响应码
交易数据:34字节,
仅在交易成功时需要,包括以下数据:
交易类型标志,1字节,根据医保卡规范
交易金额 12位数值 6字节BCD码,高位前,单位为分
交易日期, 8位数值, 4字节BCD码,CCYYMMDD
交易时间, 6位数值, 3字节BCD码,HHMMSS
终端机编号, 12位数值,6字节BCD码
PSAM交易号, 4字节 高位在前的HEX 码
卡片的交易签名TAC 4字节的 HEX码
卡片的脱机交易序号 2字节 高位在前的HEX 码
卡片交易后余额 4字节 高位在前的 HEX 码
注意:1 BCD码为压缩的十进制数,HEX为16进制数,为不可压缩数值。
2.金额使用压缩的12位BCD码 参照ISO8583规范
3.所有数据使用规范参照现用的医保卡标准,银行清算需要这些数据进行交易有效性检查
附上C结构
typedef struct
{
/*交易类型标志 */
unsigned char transtype;
/*交易金额 */
unsigned char transamount[6];
/*交易日期时间 */
unsigned char transdatetime[7];
/*终端机编号*/
unsigned char samid[6];
/*PSAM卡交易序号 */
unsigned char psamptc[4];
/*用户卡验证码 */
unsigned char transtac[4];
/*用户卡交易序号 */
unsigned char transoffctc[2];
/*用户卡余额 */
unsigned char nowbalance[4];
} T_SENDTRANS;
交易(结算)
清算请求
为空,传入的长度参数为0
清算响应
交易类型(1字节,为0x34)
(1字节,交易结果标志
交易数据(交易成功12定长字节,内容见下,交易失败时,为中文提示信息)
交易结果标志:1字节,
0x00-成功,后面跟的是12个字节的交易数据
其他值 交易失败,后面以中文字符方式应答了失败原因,不需要处理其响应码
交易数据:12字节的交易数据
注:BCD码为压缩的十进制数
终端交易总金额 12位数值 6字节BCD码,高位前,单位为分
终端交易总笔数 12位数值 6字节BCD码,高位前