1、接口文檔
1.1 無gmc界面接口 (dll/ocx)
dll調用(posinf.dll)函數名為:int bankall (char * request,char *response),其中第一個參數為傳入參數。
ocx調用(umsocx.ocx):trans(),傳入參數為:bankrequest
請求參數格式說明如下:
內容 |
格式 |
長度 |
描述 |
POS機號 |
ANS |
8 |
不足右補空格 |
POS員工號 |
ANS |
8 |
不足右補空格 |
交易類型標志 |
N |
2 |
'00'-消費 '01'-撤消 '02'-退貨 '03'-查余額 '04'-重打印 '05'-簽到 '06'-結算 '07'-重打結算單 '08'-全民付(總) '55'-換班統計 72'-'78':全民付類交易 '10'-積分消費 '11'-積分撤消 '12'-分期消費 '13'-分期撤銷 '21'-預授權 '23'-預授權完成請求 '24'-預授權完成通知 '25'-預授權撤銷 '26'-預授權完成撤銷 '27'-離線結算 '28'-結算調整 |
金額 |
N |
12 |
信用卡消費金額,char(12),沒有小數點".",精確到分,最后兩位為小數位,不足左補0。 |
原交易日期 |
N |
8 |
yyyymmdd格式,退貨時用,其他交易空格 |
原交易參考號 |
N |
12 |
退貨時用,其他交易空格 |
原憑證號 |
N |
6 |
撤消時用,其他交易空格 |
LRC校驗 |
ANS |
3 |
3位隨機數字 |
全民付(行業信息) |
N |
100 |
行業信息(非全民付類交易無需送此項)(全民付類不送此項,則為鍵盤輸入) |
dll調用(posinf.dll)函數名為:int bankall (char * request,char *response),其中第二個參數為應答參數。
ocx調用函數名為:trans(),傳入參數為:BankResponse
應答參數格式說明如下:
內容 |
格式 |
長度 |
描 述 |
返回碼 |
N |
2 |
00 表示成功,其它表示失敗 |
銀行行號 |
N |
4 |
發卡行代碼 |
卡號 |
N |
20 |
卡號(屏蔽部分,保留前6后4) |
憑證號 |
N |
6 |
|
金額 |
N |
12 |
|
錯誤說明 |
ANS |
40 |
中文解釋 |
商戶號 |
N |
15 |
|
終端號 |
N |
8 |
|
批次號 |
N |
6 |
|
交易日期 |
N |
4 |
|
交易時間 |
N |
6 |
|
交易參考號 |
N |
12 |
|
授權號 |
N |
6 |
|
清算日期 |
N |
4 |
|
LRC校驗 |
ANS |
3 |
三位數字,應該和請求一致 |
1.2 符號定義
數據元類型如下所列:
00001—— A 字母向左靠,右部多余部分填空格。
00002—— AN 字母和/或數字,左靠,右部多余部分填空格。
00003—— ANS 字母、數字和/或特殊符號,左靠,右部多余部分填空格。
00004—— N 數值,右靠,首位有效數字前充零。若表示金額,則最右二位為角分。
00005—— MM 月。
00006—— DD 日。
00007—— hh 時。
00008—— mm 分。
00009—— ss 秒。
注意:本接口文檔中信息交換數據,均為定長,注意按照要求補足空格。
2、代碼實現如下:
//外部函數聲明 FUNCTION long bankall(string as_request, ref string as_response) LIBRARY "posinf.dll" //調用 string ls_content,ls_sellway,ls_money,ls_OldDate string ls_posid,ls_casher,ls_rand dec{2} ldec_needpay, ldec_pay,ldec_consume dec{2} ldec_cnt,ldec_payed string ls_cardid,ls_voucher,ls_consume string ls_info,ls_refno,ls_OldRefno,ls_OldVoucher //'00'-消費'01'-撤消'02'-退貨'03'-查余額'04'-重打印'05'-簽到'06'-結算'07'-重打結算單 ls_sellway=left(sle_type.text,2) if pos('00/01/02/03/04/05/06/07',ls_sellway)=0 then messagebox('提示','請錄入正確的交易類型!') sle_type.setfocus() sle_type.selecttext(1,len(sle_type.text)) return end if ///交易金額 if ls_sellway='00' or ls_sellway='01' or ls_sellway='02' then //'00'-消費'01'-撤消'02'-退貨 ldec_needpay=abs(dec(sle_payamt.text)) if ldec_needpay=0 or (not IsNumber(sle_payamt.text)) then messagebox('提示','請錄入金額!') sle_payamt.setfocus() sle_payamt.selecttext(1,len(sle_payamt.text)) return end if else ldec_needpay=0 end if //'02'-退貨//原交易日期、原交易參考號 if ls_sellway='02' then ls_OldDate=trim(sle_date.text) if isnull(ls_OldDate) or ls_OldDate='' or len(ls_OldDate)<>8 then messagebox('提示','請錄入原交易日期(8位),格式為yyyymmdd!') sle_date.setfocus() sle_date.selecttext(1,len(sle_date.text)) return end if ls_OldRefno=trim(sle_refno.text) if isnull(ls_OldRefno) or ls_OldRefno='' or len(ls_OldRefno)<>12 then messagebox('提示','請錄入原交易參考號(12位)!') sle_refno.setfocus() sle_refno.selecttext(1,len(sle_date.text)) return end if else ls_OldDate=space(8) ls_OldRefno=space(12) end if //'01'-撤消//原憑證號 if ls_sellway='01' then ls_OldVoucher=trim(sle_voucher.text) if isnull(ls_OldVoucher) or ls_OldVoucher='' or len(ls_OldVoucher)<>6 then messagebox('提示','請錄入原憑證號(6位)!') sle_voucher.setfocus() sle_voucher.selecttext(1,len(sle_date.text)) return end if else ls_OldVoucher=space(6) end if ls_posid='99' ls_casher='1001' ls_money=string(round(ldec_needpay,2)*100,'000000000000') ls_rand=string(rand(999),'000') ///3位隨機數字 //傳給銀行卡刷卡系統的交易請求文件: //POS機號(8位,不足右補空格)+POS員工號(8位,不足右補空格)+交易類型標志(2位)+金額(12位,不足左補0)+ //原交易日期(8位,yyyymmdd格式,退貨時用,其他交易空格) //原交易參考號(12位,退貨時用,其他交易空格) //原憑證號(6位,撤消時用,其他交易空格) //備用(000000)+LRC(3位隨機數字) ls_content=ls_posid+space(8 - len(ls_posid)) +ls_casher+space(8 - len(ls_casher)) +ls_sellway+ls_money+& +ls_OldDate+ls_OldRefno+ls_OldVoucher+'000000'+ls_rand ls_info=space(300) bankall(ls_content,ls_info) if left(ls_info,2)='00' then //響應碼2位, 00 表示成功,其它表示失敗 ls_cardid =mid(ls_info,7,20) //卡號20位 ls_voucher=mid(ls_info,27,6) //憑證號6位 ls_consume=mid(ls_info,33,12) //金額12位 ls_refno =mid(ls_info,124,12) //交易參考號12 messagebox('提示',"交易成功,金額為"+string(dec(ls_consume)/100)+",~r~n憑證號是:"+ls_voucher+",交易參考號是:"+ls_refno) else messagebox('提示',"交易失敗,返回值:"+left(ls_info,2)+",失敗原因:"+mid(ls_info,45,40)) return end if