/// <summary> /// 微信登录跳转。 /// </summary> /// <param name="service">微信公众服务。</param> /// <param name="controller">Mvc控制器。</param> /// <param name="returnUrl">回调地址。</param> /// <returns>返回跳转结果。</returns> public static ActionResult SignIn(this PublicService service, Controller controller, string returnUrl) { var state = new Random().Next(100000000, 1000000000); controller.Session["wechatState"] = state; string url = service.GetAuthUrlWithInfo(returnUrl, state.ToString()); return(new RedirectResult(url)); }
/// <summary> /// 处理微信被动消息。 /// </summary> /// <param name="service">微信公众服务。</param> /// <param name="controller">Mvc控制器。</param> /// <returns>返回处理结果。</returns> public static async Task <ActionResult> HandleMessage(this PublicService service, Controller controller) { IReplyMessage message; if (controller.Request.QueryString.AllKeys.Contains("msg_signature")) { message = await service.HandleEncryptedMessage(controller.Request.InputStream, controller.Request.QueryString["timestamp"], controller.Request.QueryString["nonce"], controller.Request.QueryString["msg_signature"]); } else { message = await service.HandleMessage(controller.Request.InputStream); } if (message == null) { return new ContentResult() { Content = "success" } } ; MemoryStream stream = new MemoryStream(); message.WriteResponseText(stream); if (controller.Request.QueryString.AllKeys.Contains("msg_signature")) { var encryptedMessage = service.EncryptMessage(Encoding.UTF8.GetString(stream.ToArray())); var timestamp = service.GetTimestamp().ToString(); var nonce = Guid.NewGuid().ToString().Replace("-", ""); List <string> data = new List <string> { service.AppToken, timestamp, nonce, encryptedMessage }; data.Sort(); string signature; using (SHA1 sha = SHA1.Create()) { signature = string.Concat(sha.ComputeHash(Encoding.ASCII.GetBytes(string.Concat(data))).SelectMany(t => t.ToString("x2"))); } XmlDocument doc = new XmlDocument(); var xml = doc.CreateElement("xml"); var xmlEncrypt = doc.CreateElement("Encrypt"); xmlEncrypt.InnerText = encryptedMessage; var xmlSignature = doc.CreateElement("MsgSignature"); xmlSignature.InnerText = signature; var xmlTimeStamp = doc.CreateElement("TimeStamp"); xmlTimeStamp.InnerText = timestamp; var xmlNonce = doc.CreateElement("Nonce"); xmlNonce.InnerText = nonce; xml.AppendChild(xmlEncrypt); xml.AppendChild(xmlSignature); xml.AppendChild(xmlTimeStamp); xml.AppendChild(xmlNonce); stream.Position = 0; doc.Save(stream); } stream.Position = 0; return(new FileStreamResult(stream, "text/xml")); } }