分享

使用Delphi Xe8 开发微信功能 -- (二)微信支付商户平台之查询订单详情

 A芝兰之室 2017-10-23
接上一篇,这次是微信支付商户平台的订单查询功能。
  1. unit weixinapi;

  2. interface
  3. uses  IdHTTP,//indy HttpClient
  4.       //使用RealThinClientSDK_v628中的rtcInfo的Utf8Decode函数来消除中文乱码问题,
  5.       //System中自带的Utf8Decode有问题
  6.       rtcInfo,
  7.       IWNativeXml,//NativeXML
  8.       System.Classes,//FileStream
  9.       System.Variants,//使用随机数初始化函数Randomize
  10.       System.SysUtils,Xml.XMLDoc,Data.Win.ADODB,//使用XMLDocument、AdoConnection、AdoQuery
  11.       //不同版本的SSL会使idHTTP需要使用到IOHandler参数
  12.       IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL;
  13.       function weixinapi_orderquery(out_trade_no:string):string;
  14.       function MD5_encrypt(str_TEMP:string):string;
  15.       const api_id='你的公众账号ID';//你的公众账号ID
  16.             mch_id='你的商户号';//你的商户号
  17.             api_key='你的API密钥';//你的API密钥
  18.             order_query_url='https://api.mch.weixin.qq.com/pay/orderquery';//查询订单网址
  19. implementation

  20. //微信商户对账功能-查询订单详情
  21. //out_trade_no是需要查询的商户订单号,也可以使用微信订单号来查询
  22. function weixinapi_orderquery(out_trade_no:string):string;
  23. var xmldd:TNativeXml;
  24.     fsparams:TFileStream;
  25.     idhttp_bill:TIdHTTP;
  26.     //Nativexml中没有发现如何赋值已有的xml,只好重新加入系统自带的xml
  27.     sRe_XML:TXMLDocument;
  28.     stringA:string;
  29.     stringTEMP:string;
  30.     nonce_str:string;
  31.     sign:string;
  32.     sResponse:string;
  33.     iohandssl:TIdSSLIOHandlerSocketOpenSSL;
  34. begin
  35.   Randomize;
  36.   nonce_str:=IntToStr(Random(1000000));//得到随机数nonce_str
  37.   stringA:='appid='+api_id+'&mch_id='+mch_id+'&nonce_str='+nonce_str+'&out_trade_no='+
  38.            out_trade_no;
  39.   stringTEMP:=stringA+'&key='+api_key;
  40.   sign:=MD5_encrypt(stringTEMP);//使用MD5加密函数对stringTEMP进行加密,得到sign签名
  41.   try
  42.     //创建通过idhttp POST 的xml文件
  43.     xmldd:=TNativeXml.CreateName('xml');
  44.     xmldd.EncodingString:='utf-8';
  45.     xmldd.XmlFormat:=xfReadable;
  46.     xmldd.Root.WriteString('appid',api_id);
  47.     xmldd.Root.WriteString('mch_id',mch_id);
  48.     xmldd.Root.WriteString('nonce_str',nonce_str);
  49.     xmldd.Root.WriteString('out_trade_no',out_trade_no);
  50.     xmldd.Root.WriteString('sign',sign);
  51.     xmldd.SaveToFile('weixin_order_'+out_trade_no+'.xml');
  52.   except
  53.     on e: Exception do
  54.       Result:=e.Message;
  55.   end;
  56.   //根据创建的xml文件创建fsparams文件流,
  57.   //试验过多种格式的post内容,string、TStrings、标准xml文件,
  58.   //最后发现使用TFileStream POST过去的内容
  59.   //微信接口才识别为xml格式,其他格式都会报XML Format Error等错误
  60.   fsparams:=TFileStream.Create('.\weixin_order_'+out_trade_no+'.xml',fmOpenRead or fmShareDenyWrite);
  61.   try
  62.     sRe_XML:=TXMLDocument.Create(nil);
  63.     //对于不同版本的SSL库需要加上TIdSSLIOHandlerSocketOpenSSL,
  64.     //不然会报IOHandler value is not valid错误
  65.     iohandssl:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  66.     idhttp_bill:=tIdHTTP.Create();
  67.     idhttp_bill.Request.ContentType:='text/xml';
  68.     idhttp_bill.Request.CharSet:='UTF-8';
  69.     idhttp_bill.IOHandler:=iohandssl;
  70.     //使用的UTF8Decode函数是rtcInfo里面的,不是system里面的,system中的还是会乱码
  71.     sRe_XML.XML.Text:=Utf8Decode(idhttp_bill.Post(order_query_url,fsparams));
  72.     sRe_XML.XML.SaveToFile('weixin_orderquery_'+out_trade_no+'.xml');
  73.     Result:=sRe_XML.XML.Text;//返回从微信接口收到的数据
  74.     FreeAndNil(fsparams);
  75.     FreeAndNil(idhttp_bill);
  76.     FreeAndNil(sre_XML);
  77.   except
  78.     on e: Exception do
  79.       Result:=e.Message;
  80.   end;
  81. end;

  82. //MD5加密,试过多种方法包括 SQLServer、MD5单元来进行MD5加密,却都得不到正确的MD5加密值,
  83. //无奈使用了mysql的MD5函数来进行,有更好更简洁的方法吗
  84. function MD5_encrypt(str_TEMP:string):string;
  85. var adoc_md5:TADOConnection;
  86.     adoq_md5:TADOQuery;
  87. begin
  88.   try
  89.     adoc_md5:=TADOConnection.Create(nil);
  90.     adoc_md5.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Data Source=my;';
  91.     adoc_md5.LoginPrompt:=False;
  92.     adoc_md5.Connected;
  93.     adoq_md5:=TADOQuery.Create(nil);
  94.     adoq_md5.Connection:=adoc_md5;
  95.     adoq_md5.SQL.Text:='select upper(md5('''+str_TEMP+''')) as sign_str';
  96.     adoq_md5.Open;
  97.     Result:=adoq_md5.FieldByName('sign_str').AsString;
  98.   finally
  99.     FreeAndNil(adoc_md5);
  100.     FreeAndNil(adoq_md5);
  101.   end;
  102. end;
  103. end.
复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多