Delphi Idhttp.Get方法


unit PayIntf_Get;

interface

uses
  SysUtils, Windows, Variants, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, IdHashMessageDigest, IdGlobal, IdHash, HTTPApp, DateUtils, IdHTTP,
  superobject, DBClient, iniFiles;

type
  {**  輸入控制    符號
        *   必須輸入    M
        *   非必須輸入    O
        *   不可輸入    -
        *   條件必輸    C

        * 類型              符號     長度      示例
        * 字符串          S    (20)      S(20)    20位長度字符串
        * 整數              N    (10)    N(10)    10位長度整數
        * 數字(帶小數)  N     (10,2)      N(10,2)整數10位,小數2位數字
      }

  //數據結構:支付
  PUpPayData = ^TUpPayData;

  TUpPayData = record
    terminalNo: string;     //[C]終端編號:支付的中行MIS終端編號,當支付方式是01或02時必填
    orderNo: string;        //[M]訂單編號:大售檢票系統中的訂單編號
    orderAmount: string;    //[M]訂單金額:12位,以分為單位,比如1分=000000000001
    cashAmount: string;     //[C]現金支付金額:當支付方式是00或02時必填,12位,以分為單位,比如1分=000000000001
    misAmount: string;      //[C]MIS支付金額:當支付方式是01或02時必填,12位,以分為單位,比如1分=000000000001
    salesman: string;       //[O]銷售員
    orderTime: string;      //[M]下單時間:格式:yyyyMMddHHmmss
    payType: string;        //[M]支付方式: 00現金;  01中行MIS;  02組合支付(現金+中行MIS)
    merchantNo: string;     //[M]商戶編號:財務結算中心分配的商戶編號
    tellerNo: string;       //[M]銷售員編號
    orgInfo: string;        //[O]預留信息:原交易要素,用於反向交易時定位原交易
    orderDetail: string;    //[M]訂單詳情
    sign: string;           //[M]簽名數據:使用1.3通訊方式中的示例進行簽名
  end;

  PDownPayData = ^TDownPayData;

  TDownPayData = record
    return_code: string;     //[M]返回狀態碼:通訊碼為SUCCESS/FAIL
    return_desc: string;     //[M]返回信息:當return_code為FAIL時返回信息為錯誤原因 ,例如:簽名失敗,參數格式校驗錯誤
    result_code: string;     //[O]業務結果:SUCCESS/FAIL
    orderNo: string;         //[O]售檢票系統訂單號:當result_code是SUCCESS才有返回
    merchantOrderNo: string;  //[O]財務結算中心訂單號:當result_code是SUCCESS才有返回
    succTime: string;        //[O]訂單成功時間:當result_code是SUCCESS才有返回,格式:yyyyMMddHHmmss
    succAmount: integer;     //[O]成功金額:成功金額:當result_code是SUCCESS才有返回,12位,以分為單位,比如1分=000000000001
  end;


  //數據結構:退票
  PUpRefundData = ^TUpRefundData;

  TUpRefundData = record
    orderNo: string;          //[M]訂單編號:深大售檢票系統中的訂單編號
    refundAmount: integer;    //[M]退款金額:12位,以分為單位,比如1分=000000000001
  end;

  PDownRefundData = ^TDownRefundData;

  TDownRefundData = record
    return_code: string;    //[M]返回狀態碼:通訊碼為SUCCESS/FAIL
    return_desc: string;    //[M]返回信息:當return_code為FAIL時返回信息為錯誤原因,例如:簽名失敗/參數格式校驗錯誤
    result_code: string;    //[O]業務結果:SUCCESS/FAIL
    orderNo: string;        //[O]售檢票系統訂單號:當result_code是SUCCESS才有返回
    refundTime: string;     //[O]訂單退款成功時間:當result_code是SUCCESS才有返回
    refundAmount: integer;  //[O]退款金額:當result_code是SUCCESS才有返回,12位,以分為單位,比如1分=000000000001
  end;

const
  L: integer = 12;   //金額:12位,以分為單位,比如1分=000000000001
//  Key: string = 'QAZWSXEDCTGFREDW@#$%123123';    //秘鑰key需要與財務結算系統保持一致,不可隨意更改
//  Url_Pay: string = 'http://localhost:8080/pay/ParkingAction.createOrder.do';
//  Url_Refund:string = 'http://localhost:8080/pay/ParkingAction.refundOrder.do';

procedure MyWriteLog(const mStr:string);

function CheckInvalid(UpPayData: TUpPayData; var sMsg: string): boolean;

function CheckInvalid_Refund(UpRefundData: TUpRefundData; var sMsg: string): boolean;

function ExchangeMoney(Value: string): string;

function FormatData(var UpPayData: TUpPayData; var sMsg: string): boolean;

function BulidParam(nType: integer; UpPayData: TUpPayData): string;

function BulidParam_Refund(nType: integer; UpRefundData: TUpRefundData): string;

function ret_mymd5(const sVaule: string): string;

function GetSign(var UpPayData: TUpPayData; var sMsg: string): boolean;

function PostIntf(UpPayData: TUpPayData; var sJson,sMsg: string): boolean;

function PostIntf_Refund(UpRefundData: TUpRefundData; var sJson,sMsg: string): boolean;

function GetJsonArr(Cds_BillList: TClientDataSet): string;

//提交支付接口函數
function Tkt_PayIntf(UpPayData: TUpPayData; DownPayData: TDownPayData): boolean;

//提交退款接口函數
function Tkt_RefundIntf(UpRefundData: TUpRefundData; DownRefundData: TDownRefundData): boolean;

implementation
uses
  unit1;
function Tkt_PayIntf(UpPayData: TUpPayData; DownPayData: TDownPayData): boolean;
var
  sMsg,sJson: string;
  JO: ISuperObject;
begin
  {**
   * 1、檢查必要條件
   * 2、格式化數據
   * 3、獲取簽名
   * 4、提交接口
   * 5、解析返回Json
   *}
  Result := False;
  try
    if not CheckInvalid(UpPayData, sMsg) then
    begin
      MyWriteLog(sMsg);
      Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
      Exit;
    end;

    if not FormatData(UpPayData, sMsg) then
    begin
      MyWriteLog(sMsg);
      Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
      Exit;
    end;

    if not GetSign(UpPayData, sMsg) then
    begin
      MyWriteLog(sMsg);
      Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
      Exit;
    end;

    if not PostIntf(UpPayData, sJson, sMsg) then        //提交接口
    begin
      MyWriteLog('返回信息:' + sJson);
      Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
      Exit;
    end;

    //解析返回的Json
    MyWriteLog('解析Json:' + sJson);
    try
      sMsg := '解析Json錯誤!';
      JO := SO(sJson);
      if UpperCase(JO.O['return_code'].AsString) = 'FAIL' then
      begin
        sMsg := '返回狀態碼:【' + JO.O['return_code'].AsString + ':' + JO.O['return_desc'].AsString + '';
        MyWriteLog(sMsg);
        Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
        Exit;
      end;
      if UpperCase(JO.O['result_code'].AsString) = 'FAIL' then
      begin
        sMsg := '返回業務結果:【' + JO.O['result_code'].AsString + '';
        MyWriteLog(sMsg);
        Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
        Exit;
      end;

      //只有為SUCCESS才返回以下信息
      if UpperCase(JO.O['result_code'].AsString) = 'SUCCESS' then
      begin
        DownPayData.orderNo := JO.O['result_code'].AsString;
        DownPayData.merchantOrderNo := JO.O['merchantOrderNo'].AsString;
        DownPayData.succTime := JO.O['succTime'].AsString;
        DownPayData.succAmount := JO.O['succAmount'].AsInteger;
        sMsg := '返回業務結果:【' + JO.O['result_code'].AsString + '';
        MyWriteLog(sMsg);
        Result :=  True;
      end;
    except
      on e:exception do
      begin
        sMsg := '解析異常:' + e.Message;
        MyWriteLog(sMsg);
        Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
        Exit;
      end;
    end;
  except
    on e:exception do
    begin
      sMsg := '接口異常[售票]:' + e.Message;
      MyWriteLog(sMsg);
      Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
      Exit;
    end;
  end;
end;

function Tkt_RefundIntf(UpRefundData: TUpRefundData; DownRefundData: TDownRefundData): boolean;
var
  sMsg,sJson: string;
  JO: ISuperObject;
begin
  try
    {**
     * 1、檢查必要條件
     * 2、提交接口
     * 3、解析返回Json
     *}
    Result := False;
    if not CheckInvalid_Refund(UpRefundData, sMsg) then
    begin
      Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
      Exit;
    end;

    MyWriteLog('提交信息:' + BulidParam_Refund(1,UpRefundData));
    if not PostIntf_Refund(UpRefundData, sJson, sMsg) then    //提交接口
    begin
      MyWriteLog('返回信息:' + sJson);
      Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
      Exit;
    end;

    //解析返回的Json
    MyWriteLog('解析Json:' + sJson);
    try
      sMsg := '解析Json錯誤!';
      JO := SO(sJson);
      if UpperCase(JO.O['return_code'].AsString) = 'FAIL' then
      begin
        sMsg := '返回狀態碼:【' + JO.O['return_code'].AsString + ':' + JO.O['return_desc'].AsString + '';
        MyWriteLog(sMsg);
        Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
        Exit;
      end;
      if UpperCase(JO.O['result_code'].AsString) = 'FAIL' then
      begin
        sMsg := '返回業務結果:【' + JO.O['result_code'].AsString + '';
        MyWriteLog(sMsg);
        Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
        Exit;
      end;

      //只有為SUCCESS才返回以下信息
      if UpperCase(JO.O['result_code'].AsString) = 'SUCCESS' then
      begin
        DownRefundData.orderNo := JO.O['orderNo'].AsString;
        DownRefundData.refundTime := JO.O['refundTime'].AsString;
        DownRefundData.refundAmount := JO.O['refundAmount'].AsInteger;
        sMsg := '返回業務結果:【' + JO.O['result_code'].AsString + '';
        MyWriteLog(sMsg);
        Result :=  True;
      end;
    except
      on e:exception do
      begin
        sMsg := '解析異常:' + e.Message;
        MyWriteLog(sMsg);
        Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
        Exit;
      end;
    end;
  except
    on e:exception do
    begin
      sMsg := '接口異常[退票]:' + e.Message;
      MyWriteLog(sMsg);
      Application.MessageBox(Pchar(sMsg), '提示', MB_OK);
      Exit;
    end;
  end;
end;

function PostIntf(UpPayData: TUpPayData; var sJson,sMsg: string): boolean;
var
  Temp: string;
  IdHttp: TIdHTTP;
begin
  sMsg := '提交接口錯誤!';
  sJson := '';
  Result := False;
  Temp := g_sPayUrl + '?';
  Temp := Temp + BulidParam(0, UpPayData);
  Temp := AnsiToUtf8(Temp);
  MyWriteLog('提交表單:' + Temp);
  IdHttp := TIdHTTP.Create(nil);
  try
    try
      IdHttp.HTTPOptions := IdHttp.HTTPOptions + [hoKeepOrigProtocol];
      IdHttp.ProtocolVersion := pv1_1;
      IdHttp.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*';
      IdHttp.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)';
      IdHttp.Request.ContentEncoding := 'utf-8';
      IdHttp.Request.ContentType := 'text/xml;Charset=UTF-8';

      //正式提交接口
      sJson := IdHttp.Get(Temp);
      sJson := UTF8Decode(sJson);
      sJson := StringReplace(sJson, '\', '', [rfReplaceAll]);
      sJson := StringReplace(sJson, '"{"', '[{"', [rfReplaceAll]);
      sJson := StringReplace(sJson, '"}"', '"}]', [rfReplaceAll]);
      if sJson = '' then
      begin
        sMsg := '錯誤:接口返回數據為空!';
        Exit;
      end;
      Result := True;
    except
      on e: Exception do
      begin
        sMsg := '提交接口異常:' + e.Message;
        MyWriteLog(sMsg);
        Exit;
      end;
    end;
  finally
    FreeAndNil(IdHttp);
  end;
end;

function PostIntf_Refund(UpRefundData: TUpRefundData; var sJson,sMsg: string): boolean;
var
  Temp: string;
  IdHttp: TIdHTTP;
begin
  sMsg := '提交接口錯誤!';
  sJson := '';
  Result := False;
  Temp := g_sRefundUrl + '?';
  Temp := Temp + BulidParam_Refund(0, UpRefundData);
  Temp := AnsiToUtf8(Temp);
  IdHttp := TIdHTTP.Create(nil);
  try
    try
      IdHttp.HTTPOptions := IdHttp.HTTPOptions + [hoKeepOrigProtocol];
      IdHttp.ProtocolVersion := pv1_1;
      IdHttp.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*';
      IdHttp.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)';
      IdHttp.Request.ContentEncoding := 'utf-8';
      IdHttp.Request.ContentType := 'text/xml;Charset=UTF-8';

      //正式提交接口
      sJson := IdHttp.Get(Temp);
      sJson := UTF8Decode(sJson);
      sJson := StringReplace(sJson, '\', '', [rfReplaceAll]);
      sJson := StringReplace(sJson, '"{"', '[{"', [rfReplaceAll]);
      sJson := StringReplace(sJson, '"}"', '"}]', [rfReplaceAll]);
      if sJson = '' then
      begin
        sMsg := '錯誤:接口返回數據為空!';
        Exit;
      end;
      Result := True;
    except
      on e: Exception do
      begin
        sMsg := '提交接口異常:' + e.Message;
        MyWriteLog(sMsg);
        Exit;
      end;
    end;
  finally
    FreeAndNil(IdHttp);
  end;
end;

function BulidParam(nType: integer; UpPayData: TUpPayData): string;
var
  i: integer;
  Temp: string;
  Hash: THashedStringList;
begin
  Hash := THashedStringList.Create;
  try
    Hash.Add('terminalNo=' + UpPayData.terminalNo);
    Hash.Add('orderNo=' + UpPayData.orderNo);
    Hash.Add('orderAmount=' + UpPayData.orderAmount);
    Hash.Add('cashAmount=' + UpPayData.cashAmount);
    Hash.Add('misAmount=' + UpPayData.misAmount);
    Hash.Add('salesman=' + UpPayData.salesman);
    Hash.Add('orderTime=' + UpPayData.orderTime);
    Hash.Add('payType=' + UpPayData.payType);
    Hash.Add('merchantNo=' + UpPayData.merchantNo);
    Hash.Add('tellerNo=' + UpPayData.tellerNo);
    Hash.Add('orgInfo=' + UpPayData.orgInfo);
    if UpPayData.sign <> '' then
    begin
      Hash.Add('orderDetail=' + HttpEncode(UTF8Encode(UpPayData.orderDetail))); //訂單明細字段需要進行URL編碼  <--提交接口的時候
      Hash.Add('sign=' + UpPayData.sign);
    end else begin
      Hash.Add('orderDetail=' + UpPayData.orderDetail);
    end;
    Hash.Sort;
  
    if nType = 0 then
    begin
      for i := 0 to Hash.Count-1 do
      begin
        Temp := Temp + Trim(Hash.Strings[i]) + '&';
      end;
      Result := Copy(Temp,1,Length(Temp)-1);  //去除最后一個字符"&"
    end else
    begin
      for i := 0 to Hash.Count-1 do
      begin
        Temp := Temp + '"' + Trim(Hash.Strings[i]) + '",';
      end;
      Temp := StringRePlace(Temp,'=','","',[rfRePLaceAll]);
      Result := '{' + Copy(Temp,1,Length(Temp)-1) + '}';  //去除最后一個字符","
    end;
  finally
    FreeAndNil(Hash);
  end;
end;

function BulidParam_Refund(nType: integer; UpRefundData: TUpRefundData): string;
var
  Temp: string;
begin
  if nType = 0 then
  begin
    Temp := 'orderNo' + UpRefundData.orderNo + '&';
    Temp := Temp + 'refundAmount' + IntToStr(UpRefundData.refundAmount);

    Result := Temp;
  end else
  begin
    Temp := '{';
    Temp := Temp + '"orderNo":"' + Trim(UpRefundData.orderNo) + '",';
    Temp := Temp + '"refundAmount":"' + IntToStr(UpRefundData.refundAmount) + '"';
    Temp := Temp + '}';
    Result := Temp;
  end;
end;

function ret_mymd5(const sVaule: string): string;
var
  mymd5: TIdHashMessageDigest5;
begin
  try
    mymd5 := TIdHashMessageDigest5.Create;
    Result := (mymd5.AsHex(mymd5.HashValue(sVaule)));
  finally
    mymd5.Free;
  end;
end;

function GetSign(var UpPayData: TUpPayData; var sMsg: string): boolean;
var
  Temp: string;
begin
  Result := False;
  sMsg := '獲取簽名失敗!';
  try
    Temp := BulidParam(0, UpPayData);
    MyWriteLog('獲取字符串:' + Temp);
    Temp := Temp + g_sKey;
    MyWriteLog('獲取密鑰:' + g_sKey);
    Temp := ret_mymd5(Temp);
    UpPayData.sign := LowerCase(Temp);  //簽名小寫
    sMsg := '獲取簽名成功!';
    MyWriteLog('獲取簽名成功:' + UpPayData.sign);
    Result := True;
  except
    on e:exception do
    begin
      sMsg := '獲取簽名異常:' + e.Message;
      MyWriteLog(sMsg);
      Exit;
    end;
  end;
end;

function CheckInvalid(UpPayData: TUpPayData; var sMsg: string): boolean;
begin
  Result := False;
  sMsg := '檢查傳入參數失敗!';

  try
    //必填項檢查
    if UpPayData.orderNo = '' then
    begin
      sMsg := '訂單編號必須填寫!';
      Exit;
    end;
    if UpPayData.orderAmount = '' then
    begin
      sMsg := '訂單金額必須填寫!';
      Exit;
    end;
    if UpPayData.orderTime = '' then
    begin
      sMsg := '下單時間必須填寫!';
      Exit;
    end;
    if UpPayData.payType = '' then
    begin
      sMsg := '支付方式必須填寫!';
      Exit;
    end;
    if UpPayData.merchantNo = '' then
    begin
      sMsg := '商戶編號必須填寫!';
      Exit;
    end;
    if UpPayData.tellerNo = '' then
    begin
      sMsg := '銷售員編號必須填寫!';
      Exit;
    end;
    if UpPayData.orderDetail = '' then
    begin
      sMsg := '訂單明細必須填寫!';
      Exit;
    end;

    if (UpPayData.payType <> '00')
     and (UpPayData.payType <> '01')
     and (UpPayData.payType <> '02') then
    begin
      sMsg := '非00/01/02的支付方式!';
      Exit;
    end;

    //下單時間:格式:yyyyMMddHHmmss
    try
      VarToDateTime(UpPayData.orderTime)
    except
      sMsg := '下單時間格式錯誤!';
      Exit;
    end;

    //[C]終端編號:支付的中行MIS終端編號,當支付方式是01或02時必填
    if (UpPayData.payType = '01') or (UpPayData.payType = '02') then
    begin
      if UpPayData.terminalNo = '' then
      begin
        sMsg := '中行MIS終端編號必須填寫!';
        Exit;
      end;
    end;

    //[C]現金支付金額:當支付方式是00或02時必填,12位,以分為單位,比如1分=000000000001
    if (UpPayData.payType = '00') or (UpPayData.payType = '02') then
    begin
      if UpPayData.cashAmount = '' then
      begin
        sMsg := '必須填寫現金金額!';
        Exit;
      end;
    end;

    //[C]MIS支付金額:當支付方式是01或02時必填,12位,以分為單位,比如1分=000000000001
    if (UpPayData.payType = '01') or (UpPayData.payType = '02') then
    begin
      if UpPayData.misAmount = '' then
      begin
        sMsg := '必須填寫MIS支付金額!';
        Exit;
      end;
    end;

    if StrToFloatDef(UpPayData.orderAmount, 0) = 0 then
    begin
      sMsg := '訂單金額為零!';
      Exit;
    end;

    if (StrToFloatDef(UpPayData.cashAmount, 0) = 0) or (StrToFloatDef(UpPayData.misAmount, 0) = 0) then
    begin
      sMsg := '現金和Mis支付的金額均為零!';
      Exit;
    end;

    if Length(UpPayData.orderAmount) > L then
    begin
      sMsg := '訂單金額長度不允許超過' + IntToStr(L) + '位數!';
      Exit;
    end;

    if Length(UpPayData.cashAmount) > L then
    begin
      sMsg := '現金金額長度不允許超過' + IntToStr(L) + '位數!';
      Exit;
    end;

    if Length(UpPayData.misAmount) > L then
    begin
      sMsg := 'Mis支付金額長度不允許超過' + IntToStr(L) + '位數!';
      Exit;
    end;

    sMsg := '檢查傳入參數通過!';
    Result := True;             
  except
    on e:exception do
    begin
      sMsg := '檢查傳入參數異常:' + e.Message;
      MyWriteLog(sMsg);
      Exit;
    end;
  end;
end;

function CheckInvalid_Refund(UpRefundData: TUpRefundData; var sMsg: string): boolean;
begin
  Result := False;
  sMsg := '檢查傳入參數失敗!';

  try
    //必填項檢查
    if UpRefundData.orderNo = '' then
    begin
      sMsg := '退單編號必須填寫!';
      Exit;
    end;
    if (UpRefundData.refundAmount <= 0) then
    begin
      sMsg := '退單金額必須大於零!';
      Exit;
    end;
    if (UpRefundData.refundAmount > 99999) then    //若未賦值,則系統默認最大整數值
    begin
      sMsg := '必須輸入退款金額!';
      Exit;
    end;

    sMsg := '檢查傳入參數通過!';
    Result := True;
  except
    on e:exception do
    begin
      sMsg := '檢查傳入參數異常:' + e.Message;
      MyWriteLog(sMsg);
      Exit;
    end;
  end;
end;

function ExchangeMoney(Value: string): string;
var
  S,Temp: string;
  i: integer;
begin
  Result := '0';
  S := Value;
  S := FormatFloat('0.00', StrToFloatDef(S, 0));  //保留小數點兩位
  S := FloatToStr(StrToFloat(S) * 100);  //轉換為分
  for i := 1 to L-Length(S) do
  begin
    Temp := Temp + '0';
  end;
  Result := Temp + S;    //格式化長度為12位數
end;

function FormatData(var UpPayData: TUpPayData; var sMsg: string): boolean;
begin
  Result := False;
  sMsg := '格式化數據錯誤!';
  try
    UpPayData.orderAmount := ExChangeMoney(UpPayData.orderAmount);
    UpPayData.cashAmount  := ExChangeMoney(UpPayData.cashAmount);
    UpPayData.misAmount   := ExChangeMoney(UpPayData.misAmount);
    sMsg := '格式化數據成功!';
    Result := True;
  Except
    on e:exception do
    begin
      sMsg := '格式化數據異常:' + e.Message;
      MyWriteLog(sMsg);
      Exit;
    end;
  end;
end;

procedure MyWriteLog(const mStr:string);
var
  f: textfile;
  myDir,myFileName: string;
  FileHandle:Integer;
  LogType,LogDate,ModuleID: String;
begin
  LogType := 'INFO';
  LogDate := FormatDateTime('YYYY-MM-DD hh:nn:ss zzz', Now);
  ModuleID := '';
//  if not (CanLogFile in FLogFlags) then exit;
  //------寫入文件部分的實現--開始
  myDir := ExtractFilePath(Paramstr(0));
  //確定文件名稱
  myFileName := FormatDateTime('"PayIntf"yyyymmdd".log"', Date);
  //如果可執行目錄下不存在log目錄創建之
  if not DirectoryExists(myDir + '\log') then CreateDir(myDir + '\log');
  //如果當日日志文件不存在,則創建文件並釋放句柄
  if not FileExists(myDir + '\log\' + myFileName) then
  begin
    FileHandle:=FileCreate(myDir + '\log\' + myFileName);//創建文件
    FileClose(FileHandle);//釋放句柄
  end;
  try//try...except...statements
    AssignFile(f, myDir + '\log\' + myFileName);
    Append(f);
    Writeln(f, '$$'+Format('%6s',[LogType])+'$$ '+Format('%12s',[ModuleID])+'$$'+LogDate + chr(9) + mStr);
    Flush(f);
    CloseFile(f);
    //-----寫入文件部分的實現--結束
  except//try...except...statements
  end;//try...except...statements
end;

function GetJsonArr(Cds_BillList: TClientDataSet): string;
var
  Temp,
  ticketType,ticketSpecies,
  ticketFrom,ticketNum:string;
  ticketPrice,ticketAmount:Integer;
  cds_Temp: TClientDataSet;
begin
  {**
   * ******獲取訂單明細組合成JSON數組字符串**********
   *  票型    ticketType    S    M
   *  票種    ticketSpecies    S    M
   *  來源    ticketFrom    S    M
   *  票價    ticketPrice    N    M    以分為單位
   *  數量    ticketNum    S    M
   *  金額    ticketAmount    N    M    以分為單位,金額=票價*數量
  **}
  Result := '';
  Temp := '';
  if Cds_BillList.IsEmpty then
    Exit;
  cds_Temp := TClientDataSet.Create(nil);
  try
    try
      cds_Temp.Data := Cds_BillList.Data;
      with cds_Temp do
      begin
        First;
        While Not Eof do
        begin
          ticketType := FieldByName('TicketModelName').AsString;
          ticketSpecies := FieldByName('TicketKindName').AsString;
          ticketFrom := 'TicketBySell';
          ticketPrice := StrToInt(ExchangeMoney(CurrToStr(FieldByName('TicketPrice').AsCurrency)));
          ticketNum := IntToStr(FieldByName('TicketCount').AsInteger);
          ticketAmount := StrToInt(ExchangeMoney(CurrToStr(FieldByName('PaySum').AsCurrency)));

          Temp := '{';
          Temp := Temp + '"ticketType":"' + Trim(ticketType) + '",';
          Temp := Temp + '"ticketSpecies":"' + Trim(ticketSpecies) + '",';
          Temp := Temp + '"ticketFrom":"' + Trim(ticketFrom) + '",';
          Temp := Temp + '"ticketPrice":"' + IntToStr(ticketPrice) + '",';
          Temp := Temp + '"ticketNum":"' + Trim(ticketNum) + '",';
          Temp := Temp + '"ticketAmount":"' + IntToStr(ticketAmount) + '"';
          Temp := Temp + '},';
          Next;
        end;
      end;
      
      if Temp <> '' then
      begin
        Result := '[' + Copy(Temp,1,Length(Temp)-1) + ']';  //去除最后一位的","
      end;
    finally
      FreeAndNil(cds_Temp);
    end;
  except
    on e:exception do
    begin
      Result := '';
      Exit;
    end;
  end;
end;
end.
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM