From 6396dac27ca99e84a2e3c772fb079bceddf67ff8 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期一, 01 十二月 2025 18:17:45 +0800
Subject: [PATCH] feat:开发

---
 ApiTools.Core/Utils/WxmpUtils/Crypto/WXBizMsgCrypt.cs |  221 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 221 insertions(+), 0 deletions(-)

diff --git a/ApiTools.Core/Utils/WxmpUtils/Crypto/WXBizMsgCrypt.cs b/ApiTools.Core/Utils/WxmpUtils/Crypto/WXBizMsgCrypt.cs
new file mode 100644
index 0000000..da3e234
--- /dev/null
+++ b/ApiTools.Core/Utils/WxmpUtils/Crypto/WXBizMsgCrypt.cs
@@ -0,0 +1,221 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using System.Collections;
+//using System.Web;
+using System.Security.Cryptography;
+//-40001 锛� 绛惧悕楠岃瘉閿欒
+//-40002 :  xml瑙f瀽澶辫触
+//-40003 :  sha鍔犲瘑鐢熸垚绛惧悕澶辫触
+//-40004 :  AESKey 闈炴硶
+//-40005 :  appid 鏍¢獙閿欒
+//-40006 :  AES 鍔犲瘑澶辫触
+//-40007 锛� AES 瑙e瘑澶辫触
+//-40008 锛� 瑙e瘑鍚庡緱鍒扮殑buffer闈炴硶
+//-40009 :  base64鍔犲瘑寮傚父
+//-40010 :  base64瑙e瘑寮傚父
+namespace Tencent
+{
+    public class WXBizMsgCrypt
+    {
+        string m_sToken;
+        string m_sEncodingAESKey;
+        string m_sAppID;
+        enum 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
+        };
+
+        //鏋勯�犲嚱鏁�
+	    // @param sToken: 鍏紬骞冲彴涓婏紝寮�鍙戣�呰缃殑Token
+	    // @param sEncodingAESKey: 鍏紬骞冲彴涓婏紝寮�鍙戣�呰缃殑EncodingAESKey
+	    // @param sAppID: 鍏紬甯愬彿鐨刟ppid
+        public WXBizMsgCrypt(string sToken, string sEncodingAESKey, string sAppID)
+        {
+            m_sToken = sToken;
+            m_sAppID = sAppID;
+            m_sEncodingAESKey = sEncodingAESKey;
+        }
+
+
+        // 妫�楠屾秷鎭殑鐪熷疄鎬э紝骞朵笖鑾峰彇瑙e瘑鍚庣殑鏄庢枃
+        // @param sMsgSignature: 绛惧悕涓诧紝瀵瑰簲URL鍙傛暟鐨刴sg_signature
+        // @param sTimeStamp: 鏃堕棿鎴筹紝瀵瑰簲URL鍙傛暟鐨則imestamp
+        // @param sNonce: 闅忔満涓诧紝瀵瑰簲URL鍙傛暟鐨刵once
+        // @param sPostData: 瀵嗘枃锛屽搴擯OST璇锋眰鐨勬暟鎹�
+        // @param sMsg: 瑙e瘑鍚庣殑鍘熸枃锛屽綋return杩斿洖0鏃舵湁鏁�
+        // @return: 鎴愬姛0锛屽け璐ヨ繑鍥炲搴旂殑閿欒鐮�
+        public int DecryptMsg(string sMsgSignature, string sTimeStamp, string sNonce, string sPostData, ref string sMsg)
+        {
+			if (m_sEncodingAESKey.Length!=43)
+			{
+				return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_IllegalAesKey;
+			}
+            XmlDocument doc = new XmlDocument();
+            XmlNode root;
+            string sEncryptMsg;
+            try
+            {
+                doc.LoadXml(sPostData);
+                root = doc.FirstChild;
+                sEncryptMsg = root["Encrypt"].InnerText;
+            }
+            catch (Exception)
+            {
+                return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_ParseXml_Error;
+            }
+            //verify signature
+            int ret = 0;
+            ret = VerifySignature(m_sToken, sTimeStamp, sNonce, sEncryptMsg, sMsgSignature);
+            if (ret != 0)
+                return ret;
+            //decrypt
+            string cpid = "";
+            try
+            {
+                sMsg = Cryptography.AES_decrypt(sEncryptMsg, m_sEncodingAESKey, ref cpid);
+            }
+            catch (FormatException)
+            {
+                return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_DecodeBase64_Error;
+            }
+            catch (Exception)
+            {
+                return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_DecryptAES_Error;
+            }
+            if (cpid != m_sAppID)
+                return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_ValidateAppid_Error;
+            return 0;
+        }
+
+        //灏嗕紒涓氬彿鍥炲鐢ㄦ埛鐨勬秷鎭姞瀵嗘墦鍖�
+        // @param sReplyMsg: 浼佷笟鍙峰緟鍥炲鐢ㄦ埛鐨勬秷鎭紝xml鏍煎紡鐨勫瓧绗︿覆
+        // @param sTimeStamp: 鏃堕棿鎴筹紝鍙互鑷繁鐢熸垚锛屼篃鍙互鐢║RL鍙傛暟鐨則imestamp
+        // @param sNonce: 闅忔満涓诧紝鍙互鑷繁鐢熸垚锛屼篃鍙互鐢║RL鍙傛暟鐨刵once
+        // @param sEncryptMsg: 鍔犲瘑鍚庣殑鍙互鐩存帴鍥炲鐢ㄦ埛鐨勫瘑鏂囷紝鍖呮嫭msg_signature, timestamp, nonce, encrypt鐨剎ml鏍煎紡鐨勫瓧绗︿覆,
+        //						褰搑eturn杩斿洖0鏃舵湁鏁�
+        // return锛氭垚鍔�0锛屽け璐ヨ繑鍥炲搴旂殑閿欒鐮�
+        public int EncryptMsg(string sReplyMsg, string sTimeStamp, string sNonce, ref string sEncryptMsg)
+        {
+			if (m_sEncodingAESKey.Length!=43)
+			{
+				return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_IllegalAesKey;
+			}
+            string raw = "";
+            try
+            {
+                raw = Cryptography.AES_encrypt(sReplyMsg, m_sEncodingAESKey, m_sAppID);
+            }
+            catch (Exception)
+            {
+                return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_EncryptAES_Error;
+            }
+            string MsgSigature = "";
+            int ret = 0;
+            ret = GenarateSinature(m_sToken, sTimeStamp, sNonce, raw, ref MsgSigature);
+            if (0 != ret)
+                return ret;
+            sEncryptMsg = "";
+
+            string EncryptLabelHead = "<Encrypt><![CDATA[";
+            string EncryptLabelTail = "]]></Encrypt>";
+            string MsgSigLabelHead = "<MsgSignature><![CDATA[";
+            string MsgSigLabelTail = "]]></MsgSignature>";
+            string TimeStampLabelHead = "<TimeStamp><![CDATA[";
+            string TimeStampLabelTail = "]]></TimeStamp>";
+            string NonceLabelHead = "<Nonce><![CDATA[";
+            string NonceLabelTail = "]]></Nonce>";
+            sEncryptMsg = sEncryptMsg + "<xml>" + EncryptLabelHead + raw + EncryptLabelTail;
+            sEncryptMsg = sEncryptMsg + MsgSigLabelHead + MsgSigature + MsgSigLabelTail;
+            sEncryptMsg = sEncryptMsg + TimeStampLabelHead + sTimeStamp + TimeStampLabelTail;
+            sEncryptMsg = sEncryptMsg + NonceLabelHead + sNonce + NonceLabelTail;
+            sEncryptMsg += "</xml>";
+            return 0;
+        }
+
+        public class DictionarySort : System.Collections.IComparer
+        {
+            public int Compare(object oLeft, object oRight)
+            {
+                string sLeft = oLeft as string;
+                string sRight = oRight as string;
+                int iLeftLength = sLeft.Length;
+                int iRightLength = sRight.Length;
+                int index = 0;
+                while (index < iLeftLength && index < iRightLength)
+                {
+                    if (sLeft[index] < sRight[index])
+                        return -1;
+                    else if (sLeft[index] > sRight[index])
+                        return 1;
+                    else
+                        index++;
+                }
+                return iLeftLength - iRightLength;
+
+            }
+        }
+        //Verify Signature
+        private static int VerifySignature(string sToken, string sTimeStamp, string sNonce, string sMsgEncrypt, string sSigture)
+        {
+            string hash = "";
+            int ret = 0;
+            ret = GenarateSinature(sToken, sTimeStamp, sNonce, sMsgEncrypt, ref hash);
+            if (ret != 0)
+                return ret;
+            //System.Console.WriteLine(hash);
+            if (hash == sSigture)
+                return 0;
+            else
+            {
+                return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_ValidateSignature_Error;
+            }
+        }
+
+        public static int GenarateSinature(string sToken, string sTimeStamp, string sNonce, string sMsgEncrypt ,ref string sMsgSignature)
+        {
+            ArrayList AL = new ArrayList();
+            AL.Add(sToken);
+            AL.Add(sTimeStamp);
+            AL.Add(sNonce);
+            AL.Add(sMsgEncrypt);
+            AL.Sort(new DictionarySort());
+            string raw = "";
+            for (int i = 0; i < AL.Count; ++i)
+            {
+                raw += AL[i];
+            }
+
+            SHA1 sha;
+            ASCIIEncoding enc;
+            string hash = "";
+            try
+            {
+                sha = new SHA1CryptoServiceProvider();
+                enc = new ASCIIEncoding();
+                byte[] dataToHash = enc.GetBytes(raw);
+                byte[] dataHashed = sha.ComputeHash(dataToHash);
+                hash = BitConverter.ToString(dataHashed).Replace("-", "");
+                hash = hash.ToLower();
+            }
+            catch (Exception)
+            {
+                return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_ComputeSignature_Error;
+            }
+            sMsgSignature = hash;
+            return 0;
+        }
+    }
+}

--
Gitblit v1.9.1