ユニットPayIntf_MisDll; インタフェースが 使用する Windowsの、メッセージ、sysutilsの、バリアント、クラス、グラフィックス、コントロール、フォーム、 ダイアログ、StdCtrls; タイプの {/ *トランザクションタイプ: '00'消費'01'は元に戻す'02'のリターン'03'チャールズI " 04「リプリント」05「記号」06「請求」08「先端」09「事前承認 11「追加の事前承認を取る」」10 12「事前承認が取り消さ「事前承認が完了した」 13「の事前承認が失効を完了」」14「モールステージング「15」特設ステージ 「16」に段階的に廃止「18」のステージクレジットクエリ「19」洗車カード 「20」クイックペイ「21」指定口座Quancun「22」電子現金リターン '24より「23」電子現金小切手より「償還消費」25「引き換える取り消し 」26「チェックポイント」28'株式の積分問い合わせ「29」の積分消費者の利益 「30」、積分権利失効「34」金融支払償還のための転送うち「33」の「32」カード 「60'-重合支払いが掃引さ 61'-重合支払いメインスイープ」 62'-重合充電復帰」 」63'- POSは、2次元コードデータを取得するスキャンコード銃 「64'-異常のための単一の重合決済注文 」72'-異常の重合決済注文 「90'-譲歩の利益に運転したことにより、スタンド銀行カードは 「94'-ホイは、2次元コードの割引CUPによってアップ運転 95'-クラウド雷有料プラン、マイナストランザクション」 「96'-モールの段階のお得な情報、マイナス * /} TInputData =録音が POSID:配列を[0..7 ]チャー; // / *キャッシュレジスタの数(8つのバイトは、スペースの不足を補完する、左寄せ)* / operid:チャーの配列[0..7]; // / *オペレータ番号(8つのバイト空間の左、補体欠乏)* / トランス:チャーの配列[0..1]; //トランザクションのタイプ上記参照 量:チャーの配列[0..11] ; // / * 量(12のバイト何小数点ない、左塗りつぶし0、単位:分)* / OLD_DATE:charの配列[0..7] ; // / * 元の取引日(8バイト、YYYYMMDDフォーマット、隔日リターン付き)* / old_reference:チャーの配列[0..11]; // / * * /元のトランザクションの参照番号 TRK2:チャーの配列[0..36]; // / * 2つのトラックデータ(37のバイトは、スペースの不足を補完する、左寄せ)* / old_trace:charの配列[0..5] ; // / * シリアル番号(右、最大6つのバイトは、リターンまたは再印刷して、0を左)* / old_batch:charの配列[0..5] ; // / * 57 -元のロット番号の62 * / old_auth:配列[0..5]チャー; // /〜* 63 68イハラ認証コード* / old_terno:配列[0..7]のチャー; // / * 69〜76イハラ取引端末数* / szFenqiNum:チャーの配列[0..1]; // / * 77〜78ビット番号03,06,09,12,18,24段階、 * 36,42,48,60 / szServiceNumに:charの配列[0..1]; // / * 79〜80魏は、サービス番号* /楽しむ szGoodsNo:charの配列[0..11]を; // / * 81 92の商品アイテムコード* / TRK3:チャーの配列[0..103]; // / * 3つのトラックデータ(104のバイトは、スペースの不足を補完する、左寄せ)* / LRC:配列[0 .. 2]チャー; // / *(0 9から3までのランダムな文字)データトランザクションをチェック* / szOrderTrace:配列[0..19]チャー; // 2015年6月16日に水を加え、銀(以下の場合はスペースを残しませんオーダー) szPrefer:チャーの配列[0..49]; //クーポンより少ない場合はスペースを残し szRsv:charの配列[0..299] ; // この入力コードデータ空間の二次元コードの予約フィールド左未満の場合 END; TOutPutData =レコード resp_code:配列[0..1]のチャー; // / * 1〜2ビットの戻りコード(2バイトの"00"成功トランザクション、他の障害)* / bank_code:チャーの配列[0..3]; // / *〜3 6のバンクビットライン。番号(4バイト)* / CARD_NO:チャーの配列[0..29]; // /〜* 36カード番号7:622 280 4860 * ********* / exprの:配列[0 .. 3]チャー; // / * 37〜40 有効ビット(4バイト)* / 量:[0..11] charの配列; // /〜* 141はビット52である量(12バイト、ない小数点であり、 0アップ左、単位:分)* / トレース:配列[0..5]チャー; // /〜* 53れる58ビットのシリアル番号(6バイト、左)* / [0..11] charの配列を:参照 ; // / * 59〜70 ビットトランザクション参照番号* / AUTH:[0..5] charの配列; // /〜* 71である76桁のライセンス番号* / / // /〜* 77 * 82ビットのバッチ番号、文字の配列[0..5]:BATCH 日付:配列[0..13]チャー ; // / * 83〜96 ビットの取引日(8バイト、YYYYMMDDHHMMSS形式)* / userNo:charの配列[0 ... 14]; // /〜* 97 111ビジネスの数* / Terno:配列[0..7]チャー; // / *号の端子112〜119 * / old_terno:配列[0..7]チャー; // / *ビット120〜127元の端末番号* / resp_chin:チャーの配列[0..49]; // / *エラーの説明(左揃え、及びギャップ充填空間)* / あるOrderNo:配列[0..49]チャー; // / *注文トランザクション注文番号次元コード* / トランス:チャーの配列[0..1]; // / *トランザクションタイプ* / ChannelType:チャーの配列[0..1]; // / * '0'は、2つのCUP二次元コード「1」マイクロチャンネル「2」Alipayの「3」ロング支払い* / LRC:チャーの配列[0..2]。// / * 'sのチェックコード(3バイト)* / 終わり; 関数PayIntf_Trans(ParkCode、OptorCode 、トランス、マネー、OldTrandID:文字列 ; VARのあるOrderNo:文字列):ブール; 機能GetInputStr(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列; VARのInStr関数:文字列):ブール; 手順GetOutputData(OutStr:文字列); 手順FillArrayChar(FillType、ParamVaule:文字列; VARのArrVaule:文字の配列)。 機能GetOldTradeInfo(OldTrandID:文字列; VARのOLD_DATE、old_reference、old_trace:文字列):ブール; 機能CheckDataValid(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列):ブール; 機能Obj2Json_InputData(入力データ:TInputData):文字列。 機能Obj2Json_OutputData(出力データ:TOutputData):文字列。 手順MyWriteLog(constのMSTR:文字列); 関数BankTrans(PInStr:PChar型; POutStr:PCHAR):整数。STDCALL; 外部の'C:\ landiccbmispos \ MisPos.dll'; // 0-成功、其他-失败 実装 CheckDataValid機能(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列):ブール; VARの SMSG、sFileDLL:文字列; 始める の検索結果を:= falseは、 sFileDLL:= 'C:\ landiccbmispos \ MisPos.dll'; IFないFILEEXISTS(sFileDLL )その後、 開始 SMSGを:=「コール支払インターフェースファイルが存在しません!'; MyWriteLog(SMSG +' [ '+ + sFileDLL'] '); Application.MessageBox(PChar型(SMSG)、'プロンプト'MB_OK); 出口; END; IF(トランス<>' 00「)および(トランス< > '01')および(トランス<> '02') および(トランス<> '05')および(トランス<> '06')//次いで'00'消費'01'が'02'の戻りを元に戻す'03' 「05」記号「06」以上のものをご確認ください クリア開始 =「不正なトランザクションタイプ:SMSGを!'; MyWriteLog(SMSG)。 Application.MessageBox(PChar型(SMSG)、'プロンプト」、MB_OK)。 出口; END; IF(トランス= '01')または(トランス= '02')その後、 インクルードが始まる OldTrandID = ''、その後のIF 始める SMSG:=「取り消しそして、するとき、戻り、元のトランザクションの順序番号を渡します!'; MyWriteLog(SMSG); Application.MessageBox(PChar型(SMSG)、'プロンプト'MB_OK); 出口; END; END; IF StrToCurrDef(マネー、0)<= 0その後、 開始 SMSG:='負の許可量またはゼロ!'; MyWriteLog(SMSG); Application.MessageBox(PChar型(SMSG)、'「プロンプト、MB_OK); 出口; END; 結果:=真; END; 関数PayIntf_Trans(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列; VARあるOrderNo:文字列):ブール; lv_nRet:整数; InStr関数:文字列; outStr:文字列; SMSG:文字列; resp_code:文字列; 始める 。* {1は、受信パラメータを検査:文書ルール 固定長の文字列パラメータにまとめ* 2、 * 3、メソッド呼び出しDLL * 4は、解析が固定長文字列を返します。分析結果 * 5を、ログイン *} 渡された引数チェック// その後、未CheckDataValid(ParkCode、OptorCode、トランス、マネー、OldTrandID)のIF を開始 、終了し; END; //組成パラメータが渡されました固定長ストリングInStr関数を形成 IFないGetInputStr(ParkCode、OptorCode、トランス、マネー、OldTrandID、InStr関数)を 開始し 、終了を; END; MyWriteLog( '送信固定長の文字列:[' + + InStr関数']'); はsetLength(outStr、にSizeOf(TOutPutData)); によってApplication.ProcessMessages; lv_nRet:= BankTrans(PChar型(InStr関数)、PChar型(outStr)) ; // DLL BankTransメソッドの呼び出し コピー(あるOrderNo ,. 1 ,. 8 IF )<>「EEEEEEEE」を//特別復帰時に、ネットワークの異常などの異常事態、 ;によってApplication.ProcessMessages ( '固定長の文字列を返す:[' outStr + + ']')MyWriteLog; GetOutputData(outStr); IF(lv_nRet <> 0)または(コピー(outStr ,. 1、2)<> '00' )その後、 開始 SMSG:=「トランザクションが失敗しました!'; MyWriteLog(SMSG); Application.MessageBox(PChar型(SMSG)、'「プロンプト、MB_OK); 出口; END; あるOrderNo:=トリム(コピー(あるOrderNo、158、50)); //開始対話は同じ時間DLLでポップアップ表示されますボックス。商人の銀行とタイムリーなリターンの成功のことを確認してください!!! SMSG:=「取引成功!'; MyWriteLog(SMSG +' [ 'あるOrderNo + +'] '); Application.MessageBox(PChar型(SMSG)、'プロンプト'MB_OK); 他のエンド 始める SMSG:='トランザクションは、手動でモノをチェックする必要が成功しました!" ; MyWriteLog(SMSG + '[' +あるOrderNo + ']')。 Application.MessageBox(PChar型(SMSG)、'「プロンプト、MB_OK); 終了; END; 機能GetInputStr(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列; VARのInStr関数:文字列):ブール; VARの OLD_DATE、old_reference、old_trace、SMSG:文字列; 入力データ:TInputData; 開始 {貿易の説明: コンシューマー:受信必要な情報(トランザクションタイプ、量)が 戻り値:受信に必要な情報(取引の種類、元のトランザクションの参照番号は、元の取引日量) 失効:受信に必要な情報(取引の種類、量、元のシリアル番号) よりも多くをチェックします:受信に必要な情報(トランザクションのタイプ) 注意:カードの残高の操作量は、パスワードのキーパッドに表示されている参照してください。そして、対応するバランスを返しません。 再印刷:受信に必要な情報(取引の種類、元のシリアル番号) 注:トランザクションに元のシリアル番号を再印刷:「000000」 記号:受信に必要な情報(トランザクションのタイプ) 課金:受信に必要な情報(トランザクションの種類)} 結果:= falseは、 してみてください FillChar(入力データ、にSizeOf(TInputData)、」「); FillArrayChar( 'RN'、ParkCode、InputData.posid)。 FillArrayChar( 'RN'、OptorCode、InputData.operid)。 FillArrayChar( 'R0'、トランス、InputData.trans)。 FillArrayChar( 'L0'、IntToStr(TRUNC(StrToCurrDef(マネー、0)* 100))、InputData.amount)。 (トランス= '01')の場合または(トランス= '02')、その後// '00'消费'01'撤销'02'退货'03'查余 始め トランス= '01'であれば、次に 開始 FillArrayChar( 'L0'、old_trace、InputData.old_trace)。 そうでない場合はGetOldTradeInfo(OldTrandID、OLD_DATE、old_reference、old_trace)を 開始し 、終了を。 終わり; FillArrayChar( 'RN'、 ''、InputData.old_date)。 FillArrayChar( 'RN'、 ''、InputData.old_reference)。 終わり; トランス= '02'であれば、次に 開始 FillArrayChar( 'L0'、 ''、InputData.old_trace)。 FillArrayChar( 'RN'、OLD_DATE、InputData.old_date)。// / *原交易日期(8字节、YYYYMMDD格式、隔日退货时用)* / FillArrayChar( 'RN'、old_reference、InputData.old_reference)。// / *原交易参考号* / 終了。 FillArrayChar( 'RN'、 ''、InputData.old_date); FillArrayChar( 'RN'、 ''、InputData.old_reference); エンド; //以下はデフォルトの塗りつぶしです FillArrayChar( 'RN'、 '' 、InputData.old_batch); // / * 57〜62 伊原バッチ番号* / FillArrayChar( 'RN'、 ''、InputData.old_auth); // /〜* 63は68ビットです元認証コード* / FillArrayChar( 'RN'、 ''、InputData.old_terno); // / 76 * 69〜伊原トランザクション端末番号* / FillArrayChar( 'RN'、 ''、InputData.szFenqiNum); // / *段階77〜78 * 03,06,09,12,18,24,36,42,48,60 /数 FillArrayChar( 'RN'、 ''、InputData.szServiceNum); // / *ビット79〜80人々の数は、* /楽しむ '; FillArrayChar( 'RN'、' // / * 81〜92のデジタル商品アイテムコード* /、InputData.szGoodsNo) FillArrayChar( 'RN ''」、InputData.trk2); // / * 2つのトラックデータ(37のバイトは、スペースの不足を補完し、左詰め)* / (RN ' ''、InputData.trk3)FillArrayCharを'; // / * 3つのトラックデータ(左詰めに104バイト、スペースの不足を補完する)* / FillArrayChar( 'RN'、 ''、InputData.lrc)。// / *チェックデータトランザクション* /(0 9から3つのランダムな文字列) はありません// 2015年6月16日に水を追加銀(注文); FillArrayChar( 'RN'、 ''、InputData.szOrderTrace) 以下の場合はスペースを残しました文字列); ました 出口; END; END; END; 始まります SMSG、STEMP:文字列; 出力データ:TOutPutData; 始める 試みを IF outStr =「」そして 始まる SMSGを:=「トランザクションは、パラメータが空で返します!'; MyWriteLog(SMSG); Application.MessageBox(PChar型(SMSG)、'プロンプト'MB_OK); 出口; END; //記録に割り当てられた文字列 FillChar(出力データ、にSizeOf(TOutputData)、'「); StrLCopy(@出力データ、PChar型(outStr)、にSizeOf(TOutputData)); //は、情報を記録するには、返された STEMPを:= '情報を返す[JSONに変換]:' + Obj2Json_OutputData(出力データ); MyWriteLog(STEMP); 以外 E ON:例外が行う SMSG:= '转换返回参数异常:' + e.message。 MyWriteLog(SMSG)。 Application.MessageBox(PChar型(SMSG)、 '提示'、MB_OK); 出口; 終わり; 終わり; 終わり; 機能Obj2Json_InputData(入力データ:TInputData):文字列。 始める の検索結果を:= '{'; 結果:= ' "は、POSID" +結果: "' +トリム(InputData.posid)+ '"、'; 結果:= ' "はoperid" +結果: "' +トリム(InputData.operid)+ '"、'; 結果: ': "+トリム(InputData.trans)+ '"、'; =は+ "トランス"'結果 結果:=は+結果' "量": "' +トリム(InputData.amount)+ '"、'; 結果:=結果+ ' "OLD_DATE": "」+トリム(InputData.old_date)+ '」、'; 結果:=結果+ ' "old_reference":'、 " '+(InputData.old_reference)+トリム"'; 結果:=結果+ ' "old_trace": "' +(InputData.old_trace)+トリム" ''; 結果: ': "+トリム(InputData.old_batch)+ '"、'; =は+ "old_batch"'結果 結果: ': "+トリム(InputData.old_auth)+ '"、'; =は+ "old_auth"'結果 結果:=結果+ ' "old_terno": "' +(InputData.old_terno)+トリム" ''; 結果:=結果+ ' "szFenqiNum": "' +(InputData.szFenqiNum)+トリム" ''; 結果:=結果+ ' "szServiceNum": "' +(InputData.szServiceNum)+トリム" ''; 結果:=結果+ ' "szGoodsNo": "' +(InputData.szGoodsNo)+トリム" ''; 結果:= ' "は、TRK2" +結果: "' +トリム(InputData.trk2)+ '"、'; 結果: 結果:=結果+ ' "LRC": "' +(InputData.lrc)+トリム" ''; 結果:=結果+ ' "szOrderTrace":'、 " '+(InputData.szOrderTrace)+トリム"'; 結果:=結果+ ' "szPrefer": "' +(InputData.szPrefer)+トリム" ''; 結果:=結果+ ' "szRsv": "' +(InputData.szRsv)+トリム'"'; 結果:=結果+ '}'; 終わり; 機能Obj2Json_OutputData(出力データ:TOutputData):文字列。 始める の検索結果を:= '{'; 結果:= ' "はresp_code" +結果: "' +トリム(OutputData.resp_code)+ '"、'; 結果:= ' "はbank_code" +結果: "' +トリム(OutputData.bank_code)+ '"、'; 結果:=結果+ ' "card_no": "' +(OutputData.card_no)+トリム" ''; 結果:= ' "は、式expr" +結果: "' +トリム(OutputData.expr)+ '"、'; 結果:=結果+ ' "量": "' +(出力データをトリム。 結果:= ' "は、AUTH" +結果: "' +トリム(OutputData.auth)+ '"、'; : "」+トリム(OutputData.trans)+ '」、'; 結果:=結果+ '}'; 結果:= 'を"日付" +結果: "' +トリム(OutputData.date)+ '"、'; 結果:=結果+ ' "userno": "' +(OutputData.userno)+トリム" ''; 結果:=結果+ ' "terno": "' +(OutputData.terno)+トリム" ''; 結果:=結果+ ' "old_terno": "' +(OutputData.old_terno)+トリム" ''; 結果:=結果+ ' "resp_chin": "' +(OutputData.resp_chin)+トリム" ''; 結果:=結果+ ' "あるOrderNo": "' +(OutputData.OrderNo)+トリム" ''; 結果: ': "+トリム(OutputData.trans)+ '"、'; =は+ "トランス"'結果 結果:=結果+「」 機能GetOldTradeInfo(OldTrandID:文字列; VARのOLD_DATE、old_reference、old_trace:文字列):ブール; VARの SMSG:文字列; 始める の検索結果を:= falseは、 試してください OLD_DATE:= '20、190805' ; old_reference:= '123,456,789,987,456'; old_trace:=「123456 '; 結果:=真; 除く E ON:例外はない 始める SMSGを:='異常な取得元のトランザクションの支払情報[元のトランザクション数を: '+ + OldTrandID']:「+ e.message; MyWriteLog(SMSG); Application.MessageBox (PChar型(SMSG)、 'プロンプト'、MB_OK); 出口; END; END; END; 手順FillArrayChar(FillType、ParamVaule:文字列; VARのArrVaule:文字の配列)。 コピー(FillType、1、1)= 'L'ならば、//左填充 開始 VaRの I、レン、差分:整数; STEMP:文字列。 開始 レンを:=長さ(ArrVaule)。 長さ(ParamVaule)<レンは、次いで場合 始まる 差分を:=レン-長さ(ParamVaule)。 差分= 1〜ん:私のために 始め コピー(FillType、2、1)= '0'を//填充"0"があれば 始める STEMPは:= STEMPは+ '0'; 終了 他 始める STEMP:= STEMP + '「; //填充空格 終了。 終わり; STEMP:= STEMP + ParamVaule。 最後 のコピー(FillType、1、1)= 'R'を//右填充あれば、他の 開始 STEMPを:= ParamVaule + STEMP。 終わり; 他に終わる 始め STEMP:= ParamVauleを。 終わり; 用I:=レン1〜ん 開始 ArrVaule [I - 1]:= STEMP [I]; 終わり; 終わり; 手順MyWriteLog(constのMSTR:文字列); VaRの F:テキストファイル。 myDirに、myFileName:文字列。 ファイルハンドル:整数; LOGTYPE、LOGDATE、ModuleIDは:文字列。 開始 LOGTYPE:= 'INFOを'; LOGDATE:= FormatDateTime( 'YYYY-MM-DD HH:NN:SSのZZZ'、今)。 ModuleIDは:= ''; //そうでない場合(FLogFlagsでCanLogFile)[終了; // ------文書の部品を実装するために書かれた-始め myDirに:= ExtractFilePath(ParamStr(0)); //ファイル名を決定 のwriteln(F '$$' +フォーマット( '%6S'、[LOGTYPE])+「$ $ '+形式( '%の12S' [ModuleIDは])+ '$$' + LOGDATE + CHR(9)+ MSTR)。 フラッシュ(F); ; CLOSEFILEは、(F) // -----の一部を形成書面実装-の終わり のtry文は... // ...除い除い 終わり; //除いて...してみてください...ステートメントが 終了し、 終了。