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

接上一篇,这次是微信支付商户平台的退款查询功能。此功能与订单查询功能代码几乎完全相同,只是接口网址稍有区别。

unit weixinapi;

interface
uses  IdHTTP,//indy HttpClient
      //使用RealThinClientSDK_v628中的rtcInfo的Utf8Decode函数来消除中文乱码问题,
      //System中自带的Utf8Decode有问题
      rtcInfo,
      IWNativeXml,//NativeXML
      System.Classes,//FileStream
      System.Variants,//使用随机数初始化函数Randomize
      System.SysUtils,Xml.XMLDoc,Data.Win.ADODB,//使用XMLDocument、AdoConnection、AdoQuery
      //不同版本的SSL会使idHTTP需要使用到IOHandler参数
      IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL;
      function weixinapi_downloadbill(bill_date:string): string;
      function weixinapi_orderquery(out_trade_no:string):string;
      function weixinapi_refundquery(out_trade_no:string):string;
      function MD5_encrypt(str_TEMP:string):string;
      const api_id='你的公众账号ID';//你的公众账号ID
            mch_id='你的商户号';//你的商户号
            api_key='你的API密钥';//你的API密钥
            refundquery_url='https://api.mch.weixin.qq.com/pay/refundquery';//查询退款网址

implementation

//微信商户对账功能-查询退款详情
//out_trade_no是需要查询的商户订单号,也可以使用微信订单号来查询
function weixinapi_refundquery(out_trade_no:string):string;
var xmldd:TNativeXml;
    fsparams:TFileStream;
    idhttp_bill:TIdHTTP;
    //Nativexml中没有发现如何赋值已有的xml,只好重新加入系统自带的xml
    sRe_XML:TXMLDocument;
    stringA:string;
    stringTEMP:string;
    nonce_str:string;
    sign:string;
    sResponse:string;
    iohandssl:TIdSSLIOHandlerSocketOpenSSL;
begin
  Randomize;
  nonce_str:=IntToStr(Random(1000000));//得到随机数nonce_str
  stringA:='appid='+api_id+'&mch_id='+mch_id+'&nonce_str='+nonce_str+'&out_trade_no='+
           out_trade_no;
  stringTEMP:=stringA+'&key='+api_key;
  sign:=MD5_encrypt(stringTEMP);//使用MD5加密函数对stringTEMP进行加密,得到sign签名
  try
    //创建通过idhttp POST 的xml文件
    xmldd:=TNativeXml.CreateName('xml');
    xmldd.EncodingString:='utf-8';
    xmldd.XmlFormat:=xfReadable;
    xmldd.Root.WriteString('appid',api_id);
    xmldd.Root.WriteString('mch_id',mch_id);
    xmldd.Root.WriteString('nonce_str',nonce_str);
    xmldd.Root.WriteString('out_trade_no',out_trade_no);
    xmldd.Root.WriteString('sign',sign);
    xmldd.SaveToFile('weixin_refund_'+out_trade_no+'.xml');
  except
    on e: Exception do
      Result:=e.Message;
  end;
  //根据创建的xml文件创建fsparams文件流,
  //试验过多种格式的post内容,string、TStrings、标准xml文件,
  //最后发现使用TFileStream POST过去的内容
  //微信接口才识别为xml格式,其他格式都会报XML Format Error等错误
  fsparams:=TFileStream.Create('.\weixin_refund_'+out_trade_no+'.xml',fmOpenRead or fmShareDenyWrite);
  try
    sRe_XML:=TXMLDocument.Create(nil);
    //对于不同版本的SSL库需要加上TIdSSLIOHandlerSocketOpenSSL,
    //不然会报IOHandler value is not valid错误
    iohandssl:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    idhttp_bill:=tIdHTTP.Create();
    idhttp_bill.Request.ContentType:='text/xml';
    idhttp_bill.Request.CharSet:='UTF-8';
    idhttp_bill.IOHandler:=iohandssl;
    //使用的UTF8Decode函数是rtcInfo里面的,不是system里面的,system中的还是会乱码
    sRe_XML.XML.Text:=Utf8Decode(idhttp_bill.Post(refundquery_url,fsparams));
    sRe_XML.XML.SaveToFile('weixin_refundquery_'+out_trade_no+'.xml');
    Result:=sRe_XML.XML.Text;//返回从微信接口收到的数据
    FreeAndNil(fsparams);
    FreeAndNil(idhttp_bill);
    FreeAndNil(sre_XML);
  except
    on e: Exception do
      Result:=e.Message;
  end;
end;

//MD5加密,试过多种方法包括 SQLServer、MD5单元来进行MD5加密,却都得不到正确的MD5加密值,
//无奈使用了mysql的MD5函数来进行,有更好更简洁的方法吗
function MD5_encrypt(str_TEMP:string):string;
var adoc_md5:TADOConnection;
    adoq_md5:TADOQuery;
begin
  try
    adoc_md5:=TADOConnection.Create(nil);
    adoc_md5.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Data Source=my;';
    adoc_md5.LoginPrompt:=False;
    adoc_md5.Connected;
    adoq_md5:=TADOQuery.Create(nil);
    adoq_md5.Connection:=adoc_md5;
    adoq_md5.SQL.Text:='select upper(md5('''+str_TEMP+''')) as sign_str';
    adoq_md5.Open;
    Result:=adoq_md5.FieldByName('sign_str').AsString;
  finally
    FreeAndNil(adoc_md5);
    FreeAndNil(adoq_md5);
  end;
end;
end.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值