예제 #1
0
        public void EncryptRequestMsgTest()
        {
            var xml            = @"<xml>
  <MsgType>Text</MsgType>
  <Content><![CDATA[123]]></Content>
  <bizmsgmenuid><![CDATA[]]></bizmsgmenuid>
  <MsgId>637058302725818000</MsgId>
  <Encrypt><![CDATA[]]></Encrypt>
  <ToUserName><![CDATA[ToUserNameValue]]></ToUserName>
  <FromUserName><![CDATA[FromUserName(OpenId)]]></FromUserName>
  <CreateTime>1570204886</CreateTime>
</xml>";
            var token          = "weixin";
            var encodingAESKey = "YTJkZmVjMzQ5NDU5NDY3MDhiZWI0NTdiMjFiY2I5MmU";
            var appId          = "wx669ef95216eef885";

            var           timeStamp = SystemTime.NowTicks.ToString();
            var           nonce = (SystemTime.NowTicks * 2).ToString();
            WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(token, encodingAESKey, appId);
            var           toUserName = "******";
            string        finalResponseXml = null, msgSigature = null;
            var           ret = msgCrype.EncryptRequestMsg(xml, timeStamp, nonce, toUserName, ref finalResponseXml, ref msgSigature);

            Assert.AreEqual(0, ret);
            Console.WriteLine(finalResponseXml);
            Console.WriteLine(msgSigature);
            Console.WriteLine();

            //进行解密
            string decryptXml = null;

            ret = msgCrype.DecryptMsg(msgSigature, timeStamp, nonce, finalResponseXml, ref decryptXml);
            Assert.AreEqual(0, ret);
            Console.WriteLine(decryptXml);
        }
        public ActionResult Index(string url, string token, RequestMsgType requestType, Event?eventType,
                                  bool testConcurrence, int testConcurrenceCount,
                                  bool testEncrypt, string encodingAESKey, string appId)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                var requestMessaageDoc = GetrequestMessaageDoc(/*url, token,*/ requestType, eventType);
                requestMessaageDoc.Save(ms);
                ms.Seek(0, SeekOrigin.Begin);

                string msgSigature    = null;
                var    timeStamp      = SystemTime.NowTicks.ToString();
                var    nonce          = (SystemTime.NowTicks * 2).ToString();
                string encryptTypeAll = null;
                string openIdAll      = null;

                //对请求消息进行加密
                if (testEncrypt)
                {
                    try
                    {
                        var openId     = requestMessaageDoc.Root.Element("FromUserName").Value;
                        var toUserName = requestMessaageDoc.Root.Element("ToUserName").Value;

                        WXBizMsgCrypt msgCrype         = new WXBizMsgCrypt(token, encodingAESKey, appId);
                        string        finalResponseXml = null;
                        var           ret = msgCrype.EncryptRequestMsg(requestMessaageDoc.ToString(), timeStamp, nonce, toUserName, ref finalResponseXml, ref msgSigature);

                        if (ret == 0)
                        {
                            requestMessaageDoc = XDocument.Parse(finalResponseXml);//赋值最新的加密信息
                            openIdAll          = $"openid={openId}";
                            encryptTypeAll     = "&encrypt_type=aes";
                        }
                    }
                    catch (Exception ex)
                    {
                        var data = new { Success = false, LoadTime = "N/A", Result = "发生错误:" + ex.ToString() };
                        return(Json(data, new JsonSerializerSettings()
                        {
                            ContractResolver = new DefaultContractResolver()
                        }));

                        throw;
                    }

                    //Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("模拟测试-加密消息:", requestMessaageDoc?.ToString());
                }

                var sigature = CheckSignature.GetSignature(timeStamp, nonce, token);

                url += url.Contains("?") ? "&" : "?";
                url += $"signature={sigature}&timeStamp={timeStamp}&nonce={nonce}&msg_signature={msgSigature}{encryptTypeAll}{openIdAll}";
                //参数如:signature=330ed3b64e363dc876f35e54a79e59b48739f567&timestamp=1570075722&nonce=863153744&openid=olPjZjsXuQPJoV0HlruZkNzKc91E&encrypt_type=aes&msg_signature=71dc359205a4660bc3b3046b643452c994b5897d

                var dt1 = SystemTime.Now;


                try
                {
                    dt1 = SystemTime.Now;
                    if (testConcurrence)
                    {
                        //异步方法
                        testConcurrenceCount = testConcurrenceCount > 30 ? 30 : testConcurrenceCount;//设定最高限额

                        //模拟并发请求
                        List <Task <string> > taskList = new List <Task <string> >();
                        for (int i = 0; i < testConcurrenceCount; i++)
                        {
                            var task = TestAsyncTask(url, token, requestMessaageDoc, autoFillUrlParameters: false, index: i, sleepMillionSeconds: 0);
                            taskList.Add(task);
                        }
                        Task.WaitAll(taskList.ToArray(), 1500 * 10);
                    }
                    else
                    {
                        //同步方法,立即发送
                        _responseMessageXml = MessageAgent.RequestXml(null, url, token, requestMessaageDoc.ToString(), autoFillUrlParameters: false);
                    }


                    if (string.IsNullOrEmpty(_responseMessageXml))
                    {
                        _responseMessageXml = "返回消息为空,可能已经被去重。\r\nMsgId相同的连续消息将被自动去重。";
                    }

                    var cache = CacheStrategyFactory.GetObjectCacheStrategyInstance();
                    var data  = new
                    {
                        Success          = true,
                        LoadTime         = SystemTime.DiffTotalMS(dt1, "f4"),
                        Result           = _responseMessageXml,
                        CacheType        = cache.GetType().Name,
                        ConcurrenceCount = testConcurrenceCount
                    };
                    return(Json(data, new JsonSerializerSettings()
                    {
                        ContractResolver = new DefaultContractResolver()
                    }));
                }
                catch (Exception ex)
                {
                    var msg = string.Format("{0}\r\n{1}\r\n{2}", ex.Message, null, ex.InnerException != null ? ex.InnerException.Message : null);
                    return(Json(new { Success = false, Result = msg }, new JsonSerializerSettings()
                    {
                        ContractResolver = new DefaultContractResolver()
                    }));
                }
            }
        }