请选择 进入手机版 | 继续访问电脑版

大富翁Delphi开发技术网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3080|回复: 0

使用Delphi Xe8 开发微信功能 -- (一)微信支付商户平台之对账单下载

[复制链接]

69

主题

96

帖子

834

积分

管理员

哈哈哈哈

Rank: 9Rank: 9Rank: 9

积分
834
发表于 2016-8-27 10:52:33 | 显示全部楼层 |阅读模式
精品文章
支持版本: Delphi XE8 
资源分类: 网络 
发布平台: Windows 
转载地址: http://blog.csdn.net/hunter_lee/article/details/46637175

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Delphi 开发微信功能相对于其他编程方式热火朝天的局面在互联网上可借鉴的真是太少了,除了几位大神的 信息交互和查询关注功能,几乎找不到关于微信支付的内容。最近一个关于微信的业务项目逼得没办法了,只好东拼西凑搞出了一个Delphi Xe调用微信商户平台的方法,在这里跟大家分享一下,也希望大家能够一起完善Delphi开发微信接口的工作。先把微信支付商户平台的对账单功能源码放一下,里面有些基础功能都没有实现得很顺畅,是通过拐弯抹角的方法来实现得,比如MD5加密就是通过MySQL数据库的MD5函数才得到了正确的值,有没有能够正确使用的单元文件呢?


  1. unit weixinapi;

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

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

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



转载请保留当前帖子的链接:http://www.dfwlt.com/forum.php?mod=viewthread&tid=2262 谢谢!

搜索简单,分享不易,且分享且珍惜,您难道不想分享下您的心得?如果觉得本文章好的话,您可以在我们网站上注册,然后发布您的好的心得,让大家共同进步,谢谢!

最新添加

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

申请友链|Archiver|手机版|小黑屋|大富翁Delphi开发技术网站 ( 苏ICP备12065705号-4

GMT+8, 2019-10-18 03:32 , Processed in 0.107960 second(s), 34 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表