using Chat.Framework.WXSdk.IPAD; using Google.Protobuf; using Grpc.Core; using MSScriptControl; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using WechatProto; namespace Chat.Framework.WXSdk.Implement { /// /// 微信管理工具 /// internal class WXClientTool { public static int ReadInt(byte[] buf, int index) { if (buf.Length >= 16) { var seqBuf = new byte[4]; Buffer.BlockCopy(buf, index, seqBuf, 0, 4); return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(seqBuf, 0)); } return 1; } internal static string[] auth_info { get; set; } internal static byte[] random_encry_key { get { return GrpcConfig.Get(GrpcType.Laoyao).RandomEncryKey; } } internal static string machine_code { get { return GrpcConfig.Get(GrpcType.Laoyao).MachineCode; } } static WXClientTool() { // switch (grpc_type) // { // case 1: // { //// version = "6.6.6.7"; //// app_id = "v1_23229f55b208d33b_CodeVip"; //// app_key = "v2_d72d0b8d148afb50e8a0beed37efd1b5"; //// machine_code = "v3_951b8b394d904962d981f02e5d4cee31"; //// channel_credentials = new SslCredentials(@"-----BEGIN CERTIFICATE----- ////MIIDqjCCApKgAwIBAgIJAOf7+/avi9foMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV ////BAYTAkNOMQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQsw ////CQYDVQQLDAJ4eDEUMBIGA1UEAwwLd2VjaGF0QHJvb3QxETAPBgkqhkiG9w0BCQEW ////Anh4MB4XDTE4MDUwODAwMzE1MFoXDTI4MDUwNTAwMzE1MFowajELMAkGA1UEBhMC ////Q04xCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNV ////BAsMAnh4MRQwEgYDVQQDDAt3ZWNoYXRAcm9vdDERMA8GCSqGSIb3DQEJARYCeHgw ////ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNcWVlhOpXjqivCpJpVHCG ////eM+Q/e83MDpqXmlT33hAFlCfUzWYYhFAHwc+xShkvuoaBwKpAr0fcHT7Kj4TLSJB ////F9FwBccPp4Tv0YH0h4pzZ9nWZCMGXB5TlXAreXrcu8Qab0MPAxMKtMO0FZzQawRD ////mO/S43u6tDBrhW2zgFzCUo+cRiCYRXoewuFVT4RT7eYvEu579oy4mto7YpR8GfPY ////ywiTh7D/4To7nNoWbly84WB9ZSQ8HZoC1KTykqaeSGw7xUhKEoPoeKPke1ECfXB2 ////lSZMwKar2IU0BVlvxL55EMF8oXJozLVEZeVIZ4Wp9EFY2KaZJowgoOa1I+vcwBbd ////AgMBAAGjUzBRMB0GA1UdDgQWBBR2SmMGUpTN/Dl0wcSYcPav6o01iDAfBgNVHSME ////GDAWgBR2SmMGUpTN/Dl0wcSYcPav6o01iDAPBgNVHRMBAf8EBTADAQH/MA0GCSqG ////SIb3DQEBCwUAA4IBAQAdCSkska27VdLcGqK9/sraopxaX31Nseci/sJbimIHxr+q ////DwAHExU5sJ1qT827n2OpF/lWMRhnJZ3ubeJ8oGA3CAKu4EiKKGA1hGOLCbEvagCc ////sdBSegk050qkMssJzNaw7boZB8vek1RDK32Fuhsh4m+MUZBj6bJCdGW9K+ZMmpZl ////bMwmsgqV6+EMvr+PhFHy8bOAdIs4/eOTjW7R0JwYgFArVXMrVKgiRknkhM+PBBHG ////DPWO0j3855SF2X5r4jQs2PvKGJjOMuQeIgsf2GbwSQhXEhM8lGdjn9up8hm7VSXf ////x8wZquXczPSdDez7tP+g9nKbxcJtGnxo8+Jntmvs ////-----END CERTIFICATE-----"); // } // break; // case 2: // { // version = "6.7.2"; // app_id = "v1_LCEO_Code"; // app_key = "v2_4d5d55d6fbb6ce87b0f53019fefebb89"; // machine_code = "v3_7af2592d5c49d94424bac95e80cb07a4"; // channel_credentials = new SslCredentials(@"-----BEGIN CERTIFICATE----- //MIIDqjCCApKgAwIBAgIJAOf7+/avi9foMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV //BAYTAkNOMQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQsw //CQYDVQQLDAJ4eDEUMBIGA1UEAwwLd2VjaGF0QHJvb3QxETAPBgkqhkiG9w0BCQEW //Anh4MB4XDTE4MDUwODAwMzE1MFoXDTI4MDUwNTAwMzE1MFowajELMAkGA1UEBhMC //Q04xCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNV //BAsMAnh4MRQwEgYDVQQDDAt3ZWNoYXRAcm9vdDERMA8GCSqGSIb3DQEJARYCeHgw //ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNcWVlhOpXjqivCpJpVHCG //eM+Q/e83MDpqXmlT33hAFlCfUzWYYhFAHwc+xShkvuoaBwKpAr0fcHT7Kj4TLSJB //F9FwBccPp4Tv0YH0h4pzZ9nWZCMGXB5TlXAreXrcu8Qab0MPAxMKtMO0FZzQawRD //mO/S43u6tDBrhW2zgFzCUo+cRiCYRXoewuFVT4RT7eYvEu579oy4mto7YpR8GfPY //ywiTh7D/4To7nNoWbly84WB9ZSQ8HZoC1KTykqaeSGw7xUhKEoPoeKPke1ECfXB2 //lSZMwKar2IU0BVlvxL55EMF8oXJozLVEZeVIZ4Wp9EFY2KaZJowgoOa1I+vcwBbd //AgMBAAGjUzBRMB0GA1UdDgQWBBR2SmMGUpTN/Dl0wcSYcPav6o01iDAfBgNVHSME //GDAWgBR2SmMGUpTN/Dl0wcSYcPav6o01iDAPBgNVHRMBAf8EBTADAQH/MA0GCSqG //SIb3DQEBCwUAA4IBAQAdCSkska27VdLcGqK9/sraopxaX31Nseci/sJbimIHxr+q //DwAHExU5sJ1qT827n2OpF/lWMRhnJZ3ubeJ8oGA3CAKu4EiKKGA1hGOLCbEvagCc //sdBSegk050qkMssJzNaw7boZB8vek1RDK32Fuhsh4m+MUZBj6bJCdGW9K+ZMmpZl //bMwmsgqV6+EMvr+PhFHy8bOAdIs4/eOTjW7R0JwYgFArVXMrVKgiRknkhM+PBBHG //DPWO0j3855SF2X5r4jQs2PvKGJjOMuQeIgsf2GbwSQhXEhM8lGdjn9up8hm7VSXf //x8wZquXczPSdDez7tP+g9nKbxcJtGnxo8+Jntmvs //-----END CERTIFICATE-----"); // } // break; // default: // break; // } } // internal static string[] grpc_info { get; set; } // internal static byte[] random_encry_key = CsharpHttpHelper.HttpExtend.RandomByte(16); // internal static string version = "6.7.2"; // internal static string app_id = "v1_LCEO_Code"; // internal static string app_key = "v2_4d5d55d6fbb6ce87b0f53019fefebb89"; // internal static string machine_code = "v3_7af2592d5c49d94424bac95e80cb07a4"; // internal static SslCredentials channel_credentials = new SslCredentials(@"-----BEGIN CERTIFICATE----- //MIIDqjCCApKgAwIBAgIJAOf7+/avi9foMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV //BAYTAkNOMQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQsw //CQYDVQQLDAJ4eDEUMBIGA1UEAwwLd2VjaGF0QHJvb3QxETAPBgkqhkiG9w0BCQEW //Anh4MB4XDTE4MDUwODAwMzE1MFoXDTI4MDUwNTAwMzE1MFowajELMAkGA1UEBhMC //Q04xCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNV //BAsMAnh4MRQwEgYDVQQDDAt3ZWNoYXRAcm9vdDERMA8GCSqGSIb3DQEJARYCeHgw //ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNcWVlhOpXjqivCpJpVHCG //eM+Q/e83MDpqXmlT33hAFlCfUzWYYhFAHwc+xShkvuoaBwKpAr0fcHT7Kj4TLSJB //F9FwBccPp4Tv0YH0h4pzZ9nWZCMGXB5TlXAreXrcu8Qab0MPAxMKtMO0FZzQawRD //mO/S43u6tDBrhW2zgFzCUo+cRiCYRXoewuFVT4RT7eYvEu579oy4mto7YpR8GfPY //ywiTh7D/4To7nNoWbly84WB9ZSQ8HZoC1KTykqaeSGw7xUhKEoPoeKPke1ECfXB2 //lSZMwKar2IU0BVlvxL55EMF8oXJozLVEZeVIZ4Wp9EFY2KaZJowgoOa1I+vcwBbd //AgMBAAGjUzBRMB0GA1UdDgQWBBR2SmMGUpTN/Dl0wcSYcPav6o01iDAfBgNVHSME //GDAWgBR2SmMGUpTN/Dl0wcSYcPav6o01iDAPBgNVHRMBAf8EBTADAQH/MA0GCSqG //SIb3DQEBCwUAA4IBAQAdCSkska27VdLcGqK9/sraopxaX31Nseci/sJbimIHxr+q //DwAHExU5sJ1qT827n2OpF/lWMRhnJZ3ubeJ8oGA3CAKu4EiKKGA1hGOLCbEvagCc //sdBSegk050qkMssJzNaw7boZB8vek1RDK32Fuhsh4m+MUZBj6bJCdGW9K+ZMmpZl //bMwmsgqV6+EMvr+PhFHy8bOAdIs4/eOTjW7R0JwYgFArVXMrVKgiRknkhM+PBBHG //DPWO0j3855SF2X5r4jQs2PvKGJjOMuQeIgsf2GbwSQhXEhM8lGdjn9up8hm7VSXf //x8wZquXczPSdDez7tP+g9nKbxcJtGnxo8+Jntmvs //-----END CERTIFICATE-----"); /// /// 执行JS /// /// JavaScript代码的字符串 /// public static string Usc2ToAnsi(string sCode) { ScriptControl scriptControl = new ScriptControl(); scriptControl.UseSafeSubset = true; scriptControl.Language = "JScript"; scriptControl.AddCode("function asciiConvertNative(s){var asciicode=s.split(\"\\\\u\");var nativeValue=asciicode[0];for(var i=1;i4){nativeValue+=code.substring(4,code.length)}}return nativeValue};"); try { string str = scriptControl.Eval(string.Format("asciiConvertNative('{0}')", sCode)).ToString(); return str; } catch (Exception ex) { string str = ex.Message; } return null; } public static string BetweenArr(string str, string leftstr, string rightstr) { int i = str.IndexOf(leftstr) + leftstr.Length; string temp = str.Substring(i, str.IndexOf(rightstr, i) - i); return temp; } public static Bitmap GetImageFromBase64(string base64string) { byte[] b = Convert.FromBase64String(base64string); MemoryStream ms = new MemoryStream(b); Bitmap bitmap = new Bitmap(ms); //ms.Close(); return bitmap; } #region 返回一个随机表情 private static string Expression = "[微笑],[憨笑],[呲牙],[爱心],[啤酒],[太阳],[礼物],[抱拳],[咖啡],[调皮],[激动],[回头],[色],[愉快],[爱情],[飞吻],[跳跳],[发抖],[转圈],[献吻],[耶],[红包],[嘿哈]"; private static List ExpressionList = null; private static Random random = new Random(); public static string FindRandomExpression() { if (ExpressionList == null) ExpressionList = Expression.Split(',').ToList(); return ExpressionList[random.Next(ExpressionList.Count)]; } #endregion #region 发送代码 // BaseUserInfo定义 [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct BaseUserInfo { //public int dwUin; //public int dwDeviceVersion; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] // public byte[] szCookies; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] // public byte[] szSessionKey; // [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] // public string szDeviceid; // [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)] // public string szCode; public int dwUin; public int dwDeviceVersion; public int dwSyncKeyLength; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] public byte[] szCookies; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] szSessionKey; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] public byte[] szSyncKey; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] public string szDeviceid; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)] public string szCode; } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct UploadImgInfo { public int dwPayloadsLength; public int dwTotalLen; public int dwStartPos; public int dwDataLen; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 65535 * 2)] public byte[] szPayLoadsBuf; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 65535)] public byte[] szImgBuf; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string ClientImgId; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string szFromUserName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string szToUserName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string szCmdUrl; } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct UploadVoiceInfo { public int dwPayloadsLength; public int dwVoiceLength; public int dwEndFlag; public int dwVoiceFormat; public int dwOffset; public int dwVoiceBufLength; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 65535 * 2)] public byte[] szPayLoadsBuf; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 65535)] public byte[] szVoiceBuf; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string ClientMsgId; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string szFromUserName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string szToUserName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string szCmdUrl; } [DllImport("UICorePlus.dll", EntryPoint = "CUploadImg", CallingConvention = CallingConvention.Cdecl)] public static extern int CUploadImg(ref BaseUserInfo userinfo, IntPtr imginfo); [DllImport("UICorePlus.dll", EntryPoint = "CUploadVoice", CallingConvention = CallingConvention.Cdecl)] public static extern int CUploadVoice(ref BaseUserInfo userinfo, IntPtr voiceinfo); [DllImport("UICorePlus.dll", EntryPoint = "CPackSync", CallingConvention = CallingConvention.Cdecl)] public static extern int CPackSync(ref BaseUserInfo userinfo, ref byte encodeData); [DllImport("UICorePlus.dll", EntryPoint = "CUnPackSync", CallingConvention = CallingConvention.Cdecl)] public static extern int CUnPackSync(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte decodeData); [DllImport("UICorePlus.dll", EntryPoint = "CGetContact", CallingConvention = CallingConvention.Cdecl)] public static extern int CGetContact(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte encodeData); [DllImport("UICorePlus.dll", EntryPoint = "CUnPackGetcontact", CallingConvention = CallingConvention.Cdecl)] public static extern int CUnPackGetcontact(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte decodeData); [DllImport("UICorePlus.dll", EntryPoint = "CSendMsg", CallingConvention = CallingConvention.Cdecl)] public static extern int CSendMsg(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte encodeData); [DllImport("UICorePlus.dll", EntryPoint = "CSendAppMsg", CallingConvention = CallingConvention.Cdecl)] public static extern int CSendAppMsg(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte encodeData); public static byte[] CUploadImg(User u, UploadImgInfo imginfo) { //自行做好异常捕获 BaseUserInfo userinfo = new BaseUserInfo(); userinfo.szCookies = u.Cookies.ToByteArray(); userinfo.szSessionKey = u.SessionKey.ToByteArray(); string[] device = u.DeviceId.Split('@'); userinfo.szDeviceid = device[2]; userinfo.dwUin = (int)u.Uin; userinfo.szCode = machine_code; imginfo.szFromUserName = u.Userame; int nSizeImginfo = Marshal.SizeOf(imginfo); IntPtr intPtr = Marshal.AllocHGlobal(nSizeImginfo); Marshal.StructureToPtr(imginfo, intPtr, true); int ret = CUploadImg(ref userinfo, intPtr); if (ret == -1) { //组包大于65535 return null; } imginfo = (UploadImgInfo)Marshal.PtrToStructure(intPtr, typeof(UploadImgInfo)); byte[] encodeBuf = new byte[imginfo.dwPayloadsLength]; Buffer.BlockCopy(imginfo.szPayLoadsBuf, 0, encodeBuf, 0, imginfo.dwPayloadsLength); return encodeBuf; } public static byte[] CUploadVoice(User u, UploadVoiceInfo voiceinfo) { //自行做好异常捕获 BaseUserInfo userinfo = new BaseUserInfo(); userinfo.szCookies = u.Cookies.ToByteArray(); userinfo.szSessionKey = u.SessionKey.ToByteArray(); string[] device = u.DeviceId.Split('@'); userinfo.szDeviceid = device[2]; userinfo.dwUin = (int)u.Uin; voiceinfo.szFromUserName = u.Userame; userinfo.szCode = machine_code; int nSizeImginfo = Marshal.SizeOf(voiceinfo); IntPtr intPtr = Marshal.AllocHGlobal(nSizeImginfo); Marshal.StructureToPtr(voiceinfo, intPtr, true); int ret = CUploadVoice(ref userinfo, intPtr); if (ret == -1) { //组包大于65535 return null; } voiceinfo = (UploadVoiceInfo)Marshal.PtrToStructure(intPtr, typeof(UploadVoiceInfo)); byte[] encodeBuf = new byte[voiceinfo.dwPayloadsLength]; Buffer.BlockCopy(voiceinfo.szPayLoadsBuf, 0, encodeBuf, 0, voiceinfo.dwPayloadsLength); return encodeBuf; } public static byte[] CPackSync(User u) { //自行做好异常捕获 try { BaseUserInfo userinfo = new BaseUserInfo(); userinfo.szCookies = u.Cookies.ToByteArray(); userinfo.szSessionKey = u.SessionKey.ToByteArray(); string[] device = u.DeviceId.Split('@'); userinfo.szDeviceid = device[2]; userinfo.dwUin = (int)u.Uin; byte[] synKeybuf = new byte[512];//不能更改此参数 若要更改必须同步c++ 缓冲器长度 int keylength = 0; byte[] synKey = u.CurrentsyncKey.ToByteArray(); if (synKey.Length != 0) { keylength = synKey.Length; Buffer.BlockCopy(synKey, 0, synKeybuf, 0, keylength); } userinfo.szSyncKey = synKeybuf; userinfo.dwSyncKeyLength = keylength; userinfo.szCode = machine_code; byte[] s = new byte[65535]; int packLength = CPackSync(ref userinfo, ref s[0]); if (packLength == -1) return null;//组包失败 //ret byte[] encodeBuf = new byte[packLength]; Buffer.BlockCopy(s, 0, encodeBuf, 0, packLength); return encodeBuf; } catch (Exception ex) { throw new Exception($"CPackSync ERROR:{ex.Message}\r\nuser:{Util.HexToStr(u.ToByteArray())}"); } } public static byte[] CUnPackSync(User u, byte[] encodeData, ref byte[] syncKey) { //自行做好异常捕获 解包必须判断标准头191 try { BaseUserInfo userinfo = new BaseUserInfo(); userinfo.szCookies = u.Cookies.ToByteArray(); userinfo.szSessionKey = u.SessionKey.ToByteArray(); string[] device = u.DeviceId.Split('@'); userinfo.szDeviceid = device[2]; userinfo.dwUin = (int)u.Uin; userinfo.szCode = machine_code; byte[] s = new byte[65535 * 10];//可酌情扩容 int packLength = CUnPackSync(ref userinfo, encodeData, encodeData.Length, ref s[0]); if (packLength == -1) return null;//组包失败 if (userinfo.dwSyncKeyLength != 0) { byte[] _syncKey = new byte[userinfo.dwSyncKeyLength]; Buffer.BlockCopy(userinfo.szSyncKey, 0, _syncKey, 0, userinfo.dwSyncKeyLength); syncKey = _syncKey; } //ret byte[] decodeBuf = new byte[packLength]; Buffer.BlockCopy(s, 0, decodeBuf, 0, packLength); return decodeBuf; } catch (Exception ex) { throw new Exception($"CUnPackSync ERROR:{ex.Message}\r\nuser:{Util.HexToStr(u.ToByteArray())}\r\ndata:{Util.HexToStr(encodeData)}"); } } public static byte[] CGetContact(User u, byte[] jsonData) { //自行做好异常捕获 BaseUserInfo userinfo = new BaseUserInfo(); userinfo.szCookies = u.Cookies.ToByteArray(); userinfo.szSessionKey = u.SessionKey.ToByteArray(); string[] device = u.DeviceId.Split('@'); userinfo.szDeviceid = device[2]; userinfo.dwUin = (int)u.Uin; userinfo.szCode = machine_code; byte[] s = new byte[65535]; int packLength = CGetContact(ref userinfo, jsonData, jsonData.Length, ref s[0]); if (packLength == -1) { //组包大于65535 return null; } byte[] encodeData = new byte[packLength]; Buffer.BlockCopy(s, 0, encodeData, 0, packLength); return encodeData; } public static byte[] CUnPackGetcontact(User u, byte[] encodeData) { //自行做好异常捕获 解包必须判断标准头191 BaseUserInfo userinfo = new BaseUserInfo(); userinfo.szCookies = u.Cookies.ToByteArray(); userinfo.szSessionKey = u.SessionKey.ToByteArray(); string[] device = u.DeviceId.Split('@'); userinfo.szDeviceid = device[2]; userinfo.dwUin = (int)u.Uin; userinfo.szCode = machine_code; byte[] s = new byte[65535 * 2]; int packLength = CUnPackGetcontact(ref userinfo, encodeData, encodeData.Length, ref s[0]); if (packLength == -1) { //组包大于65535 return null; } byte[] decodeBuf = new byte[packLength]; Buffer.BlockCopy(s, 0, decodeBuf, 0, packLength); return decodeBuf; } public static byte[] CSendMsg(User u, byte[] jsonData) { try { //自行做好异常捕获 BaseUserInfo userinfo = new BaseUserInfo(); userinfo.szCookies = u.Cookies.ToByteArray(); userinfo.szSessionKey = u.SessionKey.ToByteArray(); string[] device = u.DeviceId.Split('@'); userinfo.szDeviceid = device[2]; userinfo.dwUin = (int)u.Uin; userinfo.szCode = machine_code; byte[] s = new byte[65535]; int packLength = CSendMsg(ref userinfo, jsonData, jsonData.Length, ref s[0]); if (packLength == -1) { //组包大于65535 return null; } byte[] encodeData = new byte[packLength]; Buffer.BlockCopy(s, 0, encodeData, 0, packLength); return encodeData; } catch (Exception ex) { throw ex; return null; } } public static byte[] CSendAppMsg(User u, byte[] jsonData) { try { //自行做好异常捕获 BaseUserInfo userinfo = new BaseUserInfo(); userinfo.szCookies = u.Cookies.ToByteArray(); userinfo.szSessionKey = u.SessionKey.ToByteArray(); string[] device = u.DeviceId.Split('@'); userinfo.szDeviceid = device[2]; userinfo.dwUin = (int)u.Uin; userinfo.szCode = machine_code; byte[] s = new byte[65535]; int packLength = CSendAppMsg(ref userinfo, jsonData, jsonData.Length, ref s[0]); if (packLength == -1) { //组包大于65535 return null; } byte[] encodeData = new byte[packLength]; Buffer.BlockCopy(s, 0, encodeData, 0, packLength); return encodeData; } catch { } return null; } [DllImport("WeChatToken.dll", EntryPoint = "TokenSecret")] private extern static int TokenSecret(string inputData, StringBuilder outputData); public static byte[] GetTokenSecret(byte[] inputData) { string Secret = Util.HexToStr(inputData); StringBuilder build = new StringBuilder(512); int ret = TokenSecret(Secret, build); if (ret == 0) { return Util.StrToHex(build.ToString()); } return new byte[] { 0 }; } #endregion } }