微信二次开发!
来源:互联网 发布:如何解除冻结淘宝封号 编辑:程序博客网 时间:2024/05/16 07:26
本人第一次写博客,看见许多大神都在写博客,我只是一个很笨的菜鸟程序员,但是我相信,自己有一天总会变的很厉害!那么就从写博客开始吧,我的经验只适合初学者,让他们少走很多歩!前段时间公司让我做一个微信的二次开发,以前从来没有弄过,发现无从下手!下面我从接到这个任务时,自己做的一些事情,我是用C#写!
1)第一天疯狂的在网上查询资料,也没有看出什么名堂。第二天有点了解了,原来要有一个自己的服务器或者别人的服务器空间,把自己的程序发布上去,就是像访问自己或者别人的网站一样,在有网络的地方情况都能访问。
2)如何发布一个Asp.net 网址了,首先,我在本地打包好,在把打包好的文件夹拷贝到服务器上去,如果打包了,我百度了很久,看很少有人能够说清楚的,我就自己上图吧:
目标位置选择自己找的到的位置,然后点击发布就可以了!然后拷贝到服务器上去就可以了!
3)我虽然做过Asp.net 但是我从来没有自己配置我IIS,发不过网站。发布网站对一个初学者而言是比较痛苦的,各种报错啊,只好自己百度,在此过程中也请以前的同事帮忙过,但是没有解决,自己不知道百度过多少,才找出原因!在这里总结一下:
1)现在好多项目都是vs2010以上开发,它的框架是.net4.0,而IIS中默认好像只有.net2.0,这时候你要自己添加,怎么添加我就不说,可以百度!
2)应用程序池中的asp.net v4.0,asp.net v4.0 Classic 没有启动如图:
3)如果网站是.net4.0,单击右键->管理网站->高级设置->应用池->asp.net v4.0net
4)最重要一点可以不容易发现直接上图
如果把以上这些注意了,应该没有什么问题了,如果有问题自己百度应该可以解决了!这个只是我首先要了解的一个发布网站的过程!
接下来我就要自己开发微信了,在微信有一个开发管理平台,用来测试开发的,网址为:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login,自己登陆自己微信
然后扫描二维码,就可以进入了!在里面就有开发过程要的参数!
登陆成功后,出现这个界面,以下只是部分页面
这个里面的URL,填写就是发布网站服务器的网页程序的地址:如:http://205.195.177.32/,微信接口开发规定,网站的端口必须是80.一般在微信开发中处理微信的响应是使用*.ashx一般处理程序就可以了。在发布网站中把这个页面设置为默认启动页!
可以首先去微信的调试页面试一下:http://mp.weixin.qq.com/debug/
接下来是写程式了:
用VS2010或者其他版本建立一个Asp.net 应用网站,删除不用的Default.aspx其他页面,自己单击项目添加一个一般应用程序,*.ashx程序。如果没有接触过,自己可以百度一下,然后去写。我的代码大部分改写前辈们的,这样节少了不少时间。如下直接给代码:
public class interfaceTest : IHttpHandler
{
public void ProcessRequest(HttpContext param_context)
{
string token = ConfigurationManager.AppSettings["WeixinToken"];
string postString = string.Empty;
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
{
using (Stream stream = HttpContext.Current.Request.InputStream)
{
Byte[] postBytes = new Byte[stream.Length];
stream.Read(postBytes, 0, (Int32)stream.Length);
postString = Encoding.UTF8.GetString(postBytes);
if (!string.IsNullOrEmpty(postString))
{
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
Handle(postString);
}
}
}
else
{
Log.WriteLog("1");
Valid(token);
}
}
/// <summary>
/// 处理信息并应答
/// </summary>
private void Handle(string postStr)
{
messageHelp help = new messageHelp();
help.ReturnMessage(postStr);
Log.WriteLog("Handle='"+postStr+"'");
}
//验证Token
public static bool CheckSignature(string token)
{
string signature = System.Web.HttpContext.Current.Request.QueryString["signature"] == null ? "" : System.Web.HttpContext.Current.Request.QueryString["signature"].Trim();
string timestamp = System.Web.HttpContext.Current.Request.QueryString["timestamp"] == null ? "" : System.Web.HttpContext.Current.Request.QueryString["timestamp"].Trim();
string nonce = System.Web.HttpContext.Current.Request.QueryString["nonce"] == null ? "" : System.Web.HttpContext.Current.Request.QueryString["nonce"].Trim();
string[] arrTmp = { token, timestamp, nonce };
Array.Sort(arrTmp);
string tmpStr = string.Join("", arrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");//对该字符串进行sha1加密
tmpStr = tmpStr.ToLower();//对字符串中的字母部分进行小写转换,非字母字符不作处理
Log.WriteLog("checkSignature temStr=" + tmpStr);
Log.WriteLog(" CheckSignature Signature=" + signature);
return tmpStr == signature; //开发者获得加密后的字符串可与signature对比
}
#region 第一次接入时验证
/// <summary>
/// 第一次接入时验证
/// </summary>
/// <param name="token">用户在公众平台填写的token</param>
public static void Valid(string token)
{
Log.WriteLog("echoStr=" + System.Web.HttpContext.Current.Request.QueryString["echoStr"]);
if (System.Web.HttpContext.Current.Request.QueryString["echoStr"] == null)
{
System.Web.HttpContext.Current.Response.Write("Null");
System.Web.HttpContext.Current.Response.End();
return;
}
string echoStr = System.Web.HttpContext.Current.Request.QueryString["echoStr"].ToString();
if (CheckSignature(token))
{
if (!string.IsNullOrEmpty(echoStr))
{
System.Web.HttpContext.Current.Response.Write(echoStr);
System.Web.HttpContext.Current.Response.End();
return;
}
}
else
{
System.Web.HttpContext.Current.Response.Write(System.Guid.NewGuid().ToString());
System.Web.HttpContext.Current.Response.End();
}
}
#endregion
public bool IsReusable
{
get
{
return false;
}
}
}
里面的 string token = ConfigurationManager.AppSettings["WeixinToken"]; 我是把Token 放在了配置文件web.config中了,如果不懂怎么加,自己百度。
里面的 这个函数用来处理用户发过来的消息,微信公众号做出的回应。在初次写的时候容易报错,建议写日志,记录错误的地方!
private void Handle(string postStr)
{
messageHelp help = new messageHelp();
help.ReturnMessage(postStr);
Log.WriteLog("Handle='"+postStr+"'");
}
以下是Log日志的类:
public class Log
{
public static void WriteLog(string text)
{
string Path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "日志";
try
{
if (Directory.Exists(Path))
{
String LogText = Path + "\\" + DateTime.Now.ToLongDateString() + ".txt";
FileInfo fileinfo = new FileInfo(LogText);
if (!fileinfo.Exists)
{
FileStream filestream = File.Create(LogText);
filestream.Flush();
filestream.Close();
}
StreamWriter streamwrite = new StreamWriter(LogText, true, Encoding.GetEncoding("GB2312"));
streamwrite.WriteLine("<<["+DateTime.Now.ToLocalTime()+"]>> " +text);
streamwrite.Flush();
streamwrite.Close();
}
else
{
Directory.CreateDirectory(Path);
String LogText = Path + "\\" + DateTime.Now.ToLongDateString() + ".txt";
FileStream filestream = File.Create(LogText);
filestream.Flush();
filestream.Close();
StreamWriter streamwrite = new StreamWriter(LogText, false, Encoding.GetEncoding("GB2312"));
streamwrite.WriteLine("<<["+DateTime.Now.ToLocalTime()+"]>> "+text);
streamwrite.Flush();
streamwrite.Close();
}
}
catch (Exception Ts)
{
HttpContext.Current.Response.Write("对发生的错误表示抱歉!请联系:管理员,阐述发生错误时的具体操作过程和错误序号!" + Ts.ToString());
}
finally
{
}
}
}
接下来讲解messageHelp help = new messageHelp();类,这个类中主要处理用户发过来的消息,接收的消息为XML数据包可以查看网址:http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html
以下为代码:
public class messageHelp
{
//返回消息
public void ReturnMessage(string postStr)
{
// string responseContent = "";
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(postStr)));
XmlNode MsgType = xmldoc.SelectSingleNode("/xml/MsgType");
if (MsgType!=null)
{
switch (MsgType.InnerText)
{
case "event":
EventHandle(xmldoc); //事件
break;
case "text":
TextHandle(xmldoc);//文本
break;
case "image":
Log.WriteLog("Image");
//responseContent = ImageHandle(xmldoc);//图片
ImageHandle(xmldoc);
//responseContent = "无法响应!";
break;
case "voice":
//responseContent = VoiceHandle(xmldoc);//接收声音消息处理
VoiceHandle(xmldoc);
break;
case "location":
//地理位置处理
LocationHandle(xmldoc);
break;
default:
break;
}
}
// return responseContent;
}
//接受文本消息
public void TextHandle(XmlDocument xmldoc)
{
string responseContent = "";
XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");
XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");
XmlNode Content = xmldoc.SelectSingleNode("/xml/Content");
Log.WriteLog(ToUserName.InnerText);
Log.WriteLog(FromUserName.InnerText);
Log.WriteLog(Content.InnerText);
if (Content != null)
{
if (Content.InnerText.Trim() == "?")
{
responseContent = string.Format(ReplyType.Message_Text,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
"请问您需要什么帮助");
}
else if (Content.InnerText == "1")
{
responseContent = string.Format(ReplyType.Message_Text,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
"哈哈哈");
}
else
{
responseContent = string.Format(ReplyType.Message_Text,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
"欢迎来到***科技有限公司,您输入的内容为:" + Content.InnerText + "\r\n<a href=\"www.baidu.com">点击进入</a>");
}
}
//return responseContent;
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
}
}
//回复类型
public class ReplyType
{
/// <summary>
/// 普通文本消息
/// </summary>
public static string Message_Text
{
get { return @"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{3}]]></Content>
</xml>"; }
}
/// <summary>
/// 图文消息主体
/// </summary>
public static string Message_News_Main
{
get
{
return @"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>{3}</ArticleCount>
<Articles>
{4}
</Articles>
</xml> ";
}
}
/// <summary>
/// 图文消息项
/// </summary>
public static string Message_News_Item
{
get
{
return @"<item>
<Title><![CDATA[{0}]]></Title>
<Description><![CDATA[{1}]]></Description>
<PicUrl><![CDATA[{2}]]></PicUrl>
<Url><![CDATA[{3}]]></Url>
</item>";
}
}
public static string Message_Image
{
get
{
return @"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[{3}]]></MediaId>
</Image>
</xml>";
}
}
public static string Message_Voice
{
get
{
return @"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[{3}]]></MediaId>
</Voice>
</xml>";
}
}
}
以上就是就可以运行了!
以上只是一部分,有时间再写!
- 微信二次开发前言
- 微信二次开发!
- 初识微信二次开发
- java微信二次开发01
- 自学微信二次开发(1)
- 微信二次开发资源整理
- 微信二次开发学习笔记(-)
- 蚊子132微信二次开发的模块
- nutz+微信公众平台二次开发
- 微信二次开发——自定义菜单
- java二次开发微信公众号授权
- python微信公众账号二次开发
- 关于微信二次开发的博客
- 微信二次开发(1)--前言
- 微信公众平台二次开发JAVA
- 微信公众号二次开发(1)
- 微信公众号二次开发(2)
- 微信公众号二次开发框架-微擎
- git 问题整理
- android 开源优秀项目
- 分享开发者必备平台汇总
- openlayer 加载wfs 2种方式
- yii框架中jquery实现删除后重定向页面
- 微信二次开发!
- SDWebImage使用,图片加载和缓存
- 随笔
- #Android笔记#简便地退出程序
- css3 竖排显示
- 我是如何成长为系统架构师的
- C#TextBox自动提示、自动补全、自动完成功能
- 踢出房间中所有玩家
- Android Studio编码问题