Delphi 开发
微信功能相对于其他编程方式热火朝天的局面在互联网上可借鉴的真是太少了,除了几位大神的 信息交互和查询关注功能,几乎找不到关于微信支付的内容。最近一个关于微信的业务项目逼得没办法了,只好东拼西凑搞出了一个Delphi Xe调用微信商户平台的方法,在这里跟大家分享一下,也希望大家能够一起完善Delphi开发微信接口的工作。先把微信支付商户平台的对账单功能源码放一下,里面有些基础功能都没有实现得很顺畅,是通过拐弯抹角的方法来实现得,比如MD5加密就是通过
MySQL数据库的MD5函数才得到了正确的值,有没有能够正确使用的单元文件呢?
- 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
- IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL;//不同版本的SSL会使idHTTP需要使用到IOHandler参数
- function weixinapi_downloadbill(bill_date:string): string;
- function MD5_encrypt(str_TEMP:string):string;
- const api_id='你的公众账号ID';//你的公众账号ID
- mch_id='你的商户号';//你的商户号
- api_key='你的API密钥';//你的API密钥,自定义的32为密钥
- download_bill_url='https://api.mch.weixin.qq.com/pay/downloadbill';//下载对账单网址
- implementation
- //微信商户对账功能-下载对账单
- //bill_date是需要下载对账单的日期,格式是不带分隔符的字符串,如'20150601'
- function weixinapi_downloadbill(bill_date:string): string;
- var xmldd:TNativeXml;
- fsparams:TFileStream;
- idhttp_bill:TIdHTTP;
- sRe_XML:TXMLDocument;//Nativexml中没有发现
- 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+'&bill_date='+bill_date+'&bill_type=ALL'+'&mch_id='+mch_id+'&nonce_str='+nonce_str;
- 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('bill_date',bill_date);
- xmldd.Root.WriteString('bill_type','ALL');
- xmldd.Root.WriteString('mch_id',mch_id);
- xmldd.Root.WriteString('nonce_str',nonce_str);
- xmldd.Root.WriteString('sign',sign);
- xmldd.SaveToFile('weixin_bill_'+bill_date+'.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_bill_'+bill_date+'.xml',fmOpenRead or fmShareDenyWrite);
- try
- sRe_XML:=TXMLDocument.Create(nil);
- //对于不同版本的SSL库需要加上TIdSSLIOHandlerSocketOpenSSL,不然会报IOHandler value is not valid错误
- //详见http://blog.csdn.net/beiguofengguang/article/details/7396878
- 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函数是rtlInfo里面的,不是system里面的,system中的还是会乱码
- sRe_XML.XML.Text:=Utf8Decode(idhttp_bill.Post(download_bill_url,fsparams));
- sRe_XML.XML.SaveToFile('weixin_bill_download_'+bill_date+'.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.
复制代码
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。