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 ...
随机推荐
- 看图说话,idea 远程调试 tomcat下项目
tomcat中部署了项目,准备测试远程调试. 1.配置idea 2. 修改catalina.bat,并启动tomcat catalina.bat: ...rem 下面的参数就是从idea配置中复制过来 ...
- 【图文详细教程】maven3安装配置+eclipse离线安装maven3插件《《唯一成功的教程~~~2018-01-09》》
环境搭建前提: 1.电脑上已经安装了1.7以及以上版本的JDK(因为我提供的maven版本是最新的3.3.9的,要求最低JDK1.7) 2.配置好了ecplise并且能正常启动 第一步:下载maven ...
- Django 学习笔记(四) --- 模型和数据库
人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...
- asp.net 获取网站根地址
public static string GetSiteRoot() { string port = System.Web.HttpContext.Current.Request.ServerVari ...
- JS处理数组内如果相同ID追加一个属性(如字体颜色)
var arr=[{id:0},{id:0},{id:3},{id:2},{id:0},{id:4},{id:0},{id:1},{id:1},{id:2},{id:2}]; for(var i=0; ...
- 关于python访问字典的方法
def stu( **kwargs): # 在函数体内对于kwargs的使用不用带星号 print("大家好,我为大家简单自我介绍以下:") print(type(kwargs)) ...
- 【代码笔记】Web-ionic 网格(Grid)
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- Bootstrap里的文件分别代表什么意思及其引用方法
关于Bootstrap打包的文件分别代表什么意思,官网也没有给出一个明确的解释,在网上查了一些资料,总价归纳了如下: bootstrap/ <!--主目录--> ├── css/ < ...
- beego+vue.js分离开发,结合发布,简单部署
大家知道,golang开发的东西部署简单是它很大的卖点,一般的应用,生成的可执行文件直接放服务器上运行即可,不需要任何环境.当然,大型的应用才需要比如mysql,nginx等. 但是当vue.js出现 ...
- Android 震动模式
震动类 public class VibratorUtil { private static final long DEFAULT_VIBRATOR = 100; private static Vib ...