在上一讲当中我做了个简单的微信文本消息回显应用,当时是以微信明文方式实现的,其实微信推荐的是消息应该加密传输以增加安全性,所以这讲说说微信消息的加解密。
在微信的帮助页面上可以下载微信消息加解密的例程,可惜的是没有Delphi语言的示例,网上搜索一番,没有人贡献出写好的Delphi版的微信加解密算法单元,好在有官方示例的C#版的,那就按照C#的改一个吧。
微信消息是以AES算法进行的加密处理,而遗憾的是Delphi并没有内置的AES算法单元,必须找第三方实现的,不过一般第三方实现的算法都因为种种原因并不完善,需要使用者酌情修改,所以在基础算法支持上Delphi确实和.net以及java这类的开发语言比不了。
呵呵,上网找Delphi版AES算法吧。在在这里要感谢cnpack开发组,他们不但推出一流的delphi开发环境增强组件还有开源组件包cnvcl,这个组件包中有SHA1、AES、MD5等多种算法单元,我打开AES算法单元查看,发现封装的很完美,ECB、CBC模式均支持,呵呵,幸福了 。
。
参考C#示例代码一通修改测试,省略几昼夜苦干的吐槽终于开花结果:
呵呵,这个或者是网上目前唯一的开源的Delphi版的微信加解密算法单元吧,激动!
{*****************************************************************************} 
 {                                                                             } 
 {       泛思微平台                                                            } 
 {                                                                             } 
 {       版权所有 (C) 2016 石家庄泛思电子商务有限公司                          } 
 {                                                                             } 
 {       微信消息加密解密单元,使用DelphiXE2版本编写                           } 
 {       作者:Delphi力量                                                      } 
 {       QQ:404328970                                                         } 
 {       EMail: heblxy@163.com                                                 } 
 {       Blog:www.cnblogs.com/dpower                                          } 
 {       参考链接:                                                            } 
 {       http://mp.weixin.qq.com/wiki/14/70e73cedf9fd958d2e23264ba9333ad2.html } 
 {                                                                             } 
 {*****************************************************************************} 
 
 unit uWxMsgCrypt; 
 
 interface 
 
 uses 
   System.Classes, System.SysUtils; 
 
 type 
   WXBizMsgCryptErrorCode = ( 
     WXBizMsgCrypt_OK = 0, 
     WXBizMsgCrypt_ValidateSignature_Error = -40001, 
     WXBizMsgCrypt_ParseXml_Error = -40002, 
     WXBizMsgCrypt_ComputeSignature_Error = -40003, 
     WXBizMsgCrypt_IllegalAesKey = -40004, 
     WXBizMsgCrypt_ValidateAppid_Error = -40005, 
     WXBizMsgCrypt_EncryptAES_Error = -40006, 
     WXBizMsgCrypt_DecryptAES_Error = -40007, 
     WXBizMsgCrypt_IllegalBuffer = -40008, 
     WXBizMsgCrypt_EncodeBase64_Error = -40009, 
     WXBizMsgCrypt_DecodeBase64_Error = -40010 
   ); 
 
   /// <summary> 
   /// 提供微信加密消息解密和微信明文消息加密功能 
   /// </summary> 
   TWxMsgCrypt = class 
   private 
     function CreateRandCode(codeLen: Integer): string; 
     function AES_decrypt(const sEncodingAESKey, sMsgEncrypt: string; var cpid: string): string; 
     function AES_encrypt(const sEncodingAESKey, sMsg, cpid: string): string; 
   public 
     /// <summary> 
     /// 解密微信消息 
     /// </summary> 
     /// <param name="sToken">Token,看公众号设置</param> 
     /// <param name="sTimeStamp">时间戳,随微信消息一起传入,可以通过Url参数获取</param> 
     /// <param name="sNonce">随机字符串,随微信消息一起传入,可以通过Url参数获取</param> 
     /// <param name="sMsgEncrypt">微信消息xml的Encrypt字段内容</param> 
     /// <param name="sSigture">签名,随微信消息一起传入,可以通过Url参数获取</param> 
     /// <param name="sAppID">AppID,看公众号设置</param> 
     /// <param name="sEncodingAESKey">EncodingAESKey,看公众号设置</param> 
     /// <param name="sMsg">sMsg: 解密后的Encrypt字段内容原文,当return返回WXBizMsgCrypt_OK时有效</param> 
     /// <returns>成功WXBizMsgCrypt_OK,失败返回对应的错误码</returns> 
     function DecryptMsg(const sToken, sTimeStamp, sNonce, sMsgEncrypt, sSigture, 
       sAppID, sEncodingAESKey: string; var sMsg: string): WXBizMsgCryptErrorCode; 
 
     /// <summary> 
     /// 加密微信消息 
     /// </summary> 
     /// <param name="sMsg">全部xml内容(明文)</param> 
     /// <param name="sAppID">AppID,看公众号设置</param> 
     /// <param name="sEncodingAESKey">EncodingAESKey,看公众号设置</param> 
     /// <param name="sMsgEncrypt">sMsgEncrypt: 输出的是加密后的全部xml(可以直接发送无需再编组xml),当return返回WXBizMsgCrypt_OK时有效</param> 
     /// <returns>成功WXBizMsgCrypt_OK,失败返回对应的错误码</returns> 
     function EncryptMsg(const sMsg, sToken, sAppID, sEncodingAESKey: string; 
       var sMsgEncrypt: string): WXBizMsgCryptErrorCode; 
   end;
 
完整代码下载地址:http://download.csdn.net/detail/netwizard/9421608
 呵呵,看看效果图吧:


 
                   
                   
                   
                   
                             
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   4393
					4393
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            