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