C# 响应微信发送的Token验证,文字、图文自动回复、请求客服对话.....
代码如下,有需要的可以参考:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
using System.Web.Security;
using Newtonsoft.Json.Linq;
using System.Net.Security; namespace SY.Web.weixinApp
{
public partial class Token_url : System.Web.UI.Page
{
protected string Token = "";//你的token protected void Page_Load(object sender, EventArgs e)
{
string postStr = ""; if (Request.HttpMethod.ToLower() == "post")
{
System.IO.Stream s = System.Web.HttpContext.Current.Request.InputStream; byte[] b = new byte[s.Length]; s.Read(b, , (int)s.Length); postStr = System.Text.Encoding.UTF8.GetString(b);
string _resStr = ""; if (!string.IsNullOrEmpty(postStr))
{
_resStr = ResponseMsg(postStr);
WriteFileLog(postStr);
}
Response.Write(_resStr);
Response.End();
} else
{
Valid(); //正确响应微信发送的Token验证
} } /// <summary>
/// 验证微信签名
/// </summary>
/// * 将token、timestamp、nonce三个参数进行字典序排序
/// * 将三个参数字符串拼接成一个字符串进行sha1加密
/// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
/// <returns></returns>
private bool CheckSignature()
{ string signature = Request.QueryString["signature"].ToString();
string timestamp = Request.QueryString["timestamp"].ToString();
string nonce = Request.QueryString["nonce"].ToString();
string[] ArrTmp = { Token, timestamp, nonce };
Array.Sort(ArrTmp); //字典排序
string tmpStr = string.Join("", ArrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
tmpStr = tmpStr.ToLower();
if (tmpStr == signature)
{
return true;
}
else
{
return false;
}
} //正确响应微信发送的Token验证
private void Valid()
{ string echoStr = Request.QueryString["echoStr"].ToString(); if (CheckSignature())
{
if (!string.IsNullOrEmpty(echoStr))
{
Response.Write(echoStr);
Response.End();
}
} } /// <summary>
/// 返回信息结果(微信信息返回)
/// </summary>
/// <param name="weixinXML"></param>
private string ResponseMsg(string weixinXML)
{
XmlDocument xx = new XmlDocument();
xx.LoadXml(weixinXML); XmlNode root = xx.SelectSingleNode("xml"); XmlNode _ToName = root.SelectSingleNode("ToUserName");
XmlNode _FromName = root.SelectSingleNode("FromUserName");
XmlNode _CreatTime = root.SelectSingleNode("CreateTime");
XmlNode _MsgType = root.SelectSingleNode("MsgType"); #region Click/View 事件处理
if (_MsgType.InnerText == "event")
{
XmlNode _Event = root.SelectSingleNode("Event");
XmlNode _EventKey = root.SelectSingleNode("EventKey");
if (_Event.InnerText == "subscribe")
{
//关注后返回信息代码
_returnStr = "<xml><ToUserName><![CDATA[" + _FromName.InnerText + "]]></ToUserName><FromUserName><![CDATA[" + _ToName.InnerText + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[欢迎关注!]]></Content></xml>"; return _returnStr; } #region click事件
if (_Event.InnerText == "CLICK")
{ //请求和客服对话,关键词:rgfw
if (_EventKey.InnerText == "rgfw")
{
//文字信息
_returnStr = "<xml><ToUserName><![CDATA[" + _FromName.InnerText + "]]></ToUserName><FromUserName><![CDATA[" + _ToName.InnerText + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>";
return _returnStr;
}
else
{
//关键词:piclist自动回复图文信息
if (_EventKey.InnerText == "piclist")
{
DataTable dt = new DataTable();
dt = dal.GetList(, "CID=525", "ID desc"); //获取需要回复的图文信息列表
StringBuilder sbpic = new StringBuilder();
if (dt != null && dt.Rows.Count > )
{
sbpic.Append("<xml>");
sbpic.AppendFormat("<ToUserName><![CDATA[{0}]]></ToUserName>", _FromName.InnerText);
sbpic.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName>", _ToName.InnerText);
sbpic.AppendFormat("<CreateTime><![CDATA[{0}]]></CreateTime>", ConvertDateTimeInt(DateTime.Now));
sbpic.AppendFormat("<MsgType><![CDATA[{0}]]></MsgType>", "news");
sbpic.AppendFormat("<ArticleCount><![CDATA[{0}]]></ArticleCount>", dt.Rows.Count);
sbpic.Append("<Articles>");
foreach (DataRow dr in dt.Rows)
{
sbpic.Append("<item>");
sbpic.AppendFormat("<Title><![CDATA[{0}]]></Title>", dr["Title"]); //标题
sbpic.AppendFormat("<Description><![CDATA[{0}]]></Description>", dr["Des"]); //导读
sbpic.AppendFormat("<PicUrl><![CDATA[{0}]]></PicUrl>", "http://www.xxx.com/" + dr["Pic"]); //图片地址url
sbpic.AppendFormat("<Url><![CDATA[{0}]]></Url>", "http://www.xxx.com/test.aspx?id=" + dr["ID"]); //原文链接
sbpic.Append("</item>");
} sbpic.Append("</Articles></xml>"); _returnStr = sbpic.ToString();
return _returnStr;
}
} }
}
#endregion }
#endregion #region View事件 关键词自动回复文字或图片信息处理
if (_MsgType.InnerText == "text")
{
XmlNode _Content = root.SelectSingleNode("Content"); //关键词:rgfw请求和客服对话,
if (!string.IsNullOrEmpty(_Content.InnerText) && _Content.InnerText == "rgfw")
{
_returnStr = "<xml><ToUserName><![CDATA[" + _FromName.InnerText + "]]></ToUserName><FromUserName><![CDATA[" + _ToName.InnerText + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>";
return _returnStr;
}
else
{
//文字信息
_returnStr = "<xml><ToUserName><![CDATA[" + _FromName.InnerText + "]]></ToUserName><FromUserName><![CDATA[" + _ToName.InnerText + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[文字信息]]></Content></xml>";
return _returnStr;
} }
#endregion return _returnStr;
} /// <summary>
/// unix时间转换为datetime
/// </summary>
/// <param name="timeStamp"></param>
/// <returns></returns>
private DateTime UnixTimeToTime(string timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(, , ));
long lTime = long.Parse(timeStamp + "");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
} /// <summary>
/// datetime转换为unixtime
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
private int ConvertDateTimeInt(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(, , ));
return (int)(time - startTime).TotalSeconds;
} /// <summary>
/// 写入文件日志
/// </summary>
/// <param name="strMemo"></param>
private void WriteFileLog(string strMemo)
{
string _filepath = Server.MapPath("/logs");
string _filename = Server.MapPath("/logs/logs.log"); if (!Directory.Exists(_filepath))
{
Directory.CreateDirectory(_filepath);
if (!File.Exists(_filename))
{
FileStream fs1 = File.Create(_filename);
fs1.Close();
fs1.Dispose();
}
} //将文件信息读入流中
using (FileStream fs = new FileStream(_filename, FileMode.OpenOrCreate | FileMode.Append))
{
lock (fs)//锁住流
{
//if (!fs.CanWrite)
//{
// throw new System.Security.SecurityException("文件fileName=" + _filename + "是只读文件不能写入!");
//} StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(strMemo);
sw.Dispose();
sw.Close();
}
} } }
}
C# 响应微信发送的Token验证,文字、图文自动回复、请求客服对话.....的更多相关文章
- NodeJS 微信公共号开发 - 响应微信发送的Token验证(山东数漫江湖)
背景 使用 NodeJS 进行微信公共号开发,首先需要响应微信发送的Token验证,官方文档 填写服务器配置 登录微信公共平台,在开发下的基本配置打开该页面. 依次填写接口的 URL.自定义的 Tok ...
- 接口配置信息修改 请填写接口配置信息,此信息需要你有自己的服务器资源,填写的URL需要正确响应微信发送的Token验证
// 1)将token.timestamp.nonce三个参数进行字典序排序 // 2)将三个参数字符串拼接成一个字符串进行sha1加密 // 3)开发者获得加密后的字符串可与signature对比, ...
- 服务器通过微信公众号Token验证测试的代码(Python版)
我在阿里云租了一个云服务器,然后想把这个作为我的微信公众号的后台,启用微信公众号开发者需要正确的响应微信服务器的Token验证,为此把这个验证的Python代码贴出来,只要在服务器上运行这段代码,注意 ...
- 微信公众平台Token验证失败的解决办法
微信公众平台Token验证失败的解决办法 1.可查看url和token是否正确 2.查看服务器端口是否为80端口 3.你可以通过记录log日志来判断是否接受到微信提交过来的信息 1.$fp=fopen ...
- Thinkphp5 微信公众号token验证不成功的原因
最近要启动微信项目,上个月就开始了解微信的开发,这个月要启动项目,配置微信公众号信息一直失败.为此,我甚至手工写了微信提交过来的记录,如: ×tamp=1510210523& ...
- 微信订阅号开发之token验证后,自动回复消息功能做好,发送消息没有返回
相信很多人会跟我一样,token验证之后,发送消息给订阅号,没有消息返回. 以下,说一下我辛苦调试得到的解决办法: 首先,token验证: 自己写的token一直验证失败,找了好久,没有发现bug.实 ...
- jsp 微信公众平台 token验证(php、jsp)(转载)
微信公众平台现在推出自动回复消息接口,但是由于是接口内容用的是PHP语言写的,很多地方操作起来让本人这个对java比较熟悉的小伙很别扭,所以仿照PHP的接口代码做了一套jsp语言编写的接口. 首先先把 ...
- 微信公众号token验证失败的一些总结
这几天准备弄一个微信公众号,在进行服务器配置的时候出现总是出现token验证失败的报错. 实际上,这个问题很好解决.既然微信平台没有给我们很明确的报错提示,那么我们就可以通过跟踪获取到的请求参数进行分 ...
- 微信公众平台——token验证php版
这几天开始接触微信公众号的开发,注册这些就不说了,我是先弄了个测试号用着.进入正题 所谓token验证,其实就是微信服务器向自己要用到的服务器url发送一段数据,其中有一个参数$_GET['echho ...
随机推荐
- 突发奇想想学习做一个HTML5小游戏
前言: 最近一期文化馆轮到我分享了,分享了两个,一个是关于童年教科书的回忆,一个是关于免费电子书的.最后我觉得应该会不敌web,只能说是自己在这中间回忆了一下那个只是会学习的年代,那个充满梦想的年代. ...
- nginx配置指南
nginx(读作engine x)是一款设计优秀的Http服务器, 其占用内存少, 负载能力强且稳定性高, 正在被越来越多的用户所采用. nginx可以为HTTP, HTTPS, SMTP, POP3 ...
- [NOI 2017]整数
Description 题库链接 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 \(x\) ,一开始为 \(0\) . 接下来有 \(n\) 个操作,每个操作都是以下两种类型中 ...
- Mini2440 通过 SPI 操作 OLED (裸板下使用 SPI 控制器)
在裸板下使用 SPI 的话,有两种方法可选: 使用 IO 口模拟 SPI 进行操作 使用 SPI 控制器进行操作 这里我们选用控制器的方式,简单方便. 初始化 SPI static void SPIC ...
- .14-浅析webpack源码之Watchpack模块
解决掉了最头疼的DirectoryWatcher内部实现,这一节可以结束NodeWatchFileSystem模块. 关于watch的应用场景,仔细思考了下,这不就是热重载的核心嘛. 首先是监视文件, ...
- VS2010安装MVC3失败的解决方法
环境:Win 7 x64 原因:在安装MVC3之前,安装过VS2010 SP1,导致MVC3安装,找不到对于的VS2010安装器 vs_setup.msi 问题图片: 解决方法: 一.来自网络的方法 ...
- C#编译错误 CS0009:未能打开元数据文件
C#编译错误 CS0009:未能打开元数据文件 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS0009: 未能 ...
- C# 中的集合(Array/ArrayList/List<T>/HashTable/Dictionary)
int [] numbers = new int[5]; // 长度为5,元素类型为 int.string[,] names = new string[5,4]; // 5*4 的二维数组byte[] ...
- AnyVal与AnyRef
AnyRef 是所有引用类型的基类.除了值类型,所有类型都继承自AnyRef . AnyVal AnyVal 所有值类型的基类, 它描述的是值,而不是代表一个对象. 它包括 9 个 AnyVal ...
- 【Java并发编程】13、forkjoin
http://www.infoq.com/cn/articles/fork-join-introduction http://www.importnew.com/14506.html Java7中的F ...