微信公众平台开发(ASP.NET)

2019-03-02 01:05|来源: 网路

运行环境

.NET 

准备工作

1.在微信公众平台申请开发者。
2.功能页面完成后上传至自己的网站并能在外网正常访问该URL,端口必须为80(以下统称:目标接口)
3.在微信公众平台开启开发模式。
 

开发流程

1.验证签名,微信服务器会发一个GET请求到目标接口,接收参数后开始验证;具体操作请参阅官方文档"接入指南" http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97官方文档,讲解的很清楚,验证方法在下面的代码中有
2.首先接收微信服务器发送的请求,然后进行处理,请求为xml格式,携带公众号、发送方微信号、消息类型,消息内容等结点。
3.根据消息类型,从数据库读取相关预设内容返回,要求响应时间在5秒内,返回格式同样是xml格式。
 

备注

个人申请只能申请订阅号,不过只能使用基础接口,企业、事业单位或政府机构可以申请服务号,申请后可以申请微信认证,认证后订阅号将获得自定义菜单接口权限,服务号将获得高级接口中所有接口权限,认证300元/次, 政府以及部分其他组织类型的公众帐号,免收认证费用。
输出内容一定要使用UTF-8的编码方式,否则中文会产生乱码。
如果消息中需要换行,使用\r\n来换行。
支持html的a标签,但是如果是换行是紧邻关系的话可能无法识别换行。
该文只说明一些简单的实现方式,其余操作请自行查阅微信公众平台接口文档
微信公众平台: https://mp.weixin.qq.com/
扫描二维码,添加我的微信公众号。

 

示例代码 

  1 using System;
  2 using System.IO;
  3 using System.Text;
  4 using System.Web;
  5 using System.Web.Security;
  6 using System.Xml;
  7  
  8 public class WeChat : IHttpHandler
  9 {    
 10     public void ProcessRequest(HttpContext context)
 11     {
 12         weixin wx = new weixin();
 13         String postStr = String.Empty;
 14  
 15         if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
 16         {
 17             Stream s = HttpContext.Current.Request.InputStream;
 18             Byte[] b = new Byte[s.Length];
 19             s.Read(b, 0, (Int32)s.Length);
 20             postStr = Encoding.UTF8.GetString(b);
 21  
 22             if (!String.IsNullOrEmpty(postStr))
 23             {
 24                 wx.Handle(postStr);
 25             }
 26         }
 27         else
 28         {
 29             wx.Auth();
 30         }
 31     }
 32  
 33     public bool IsReusable
 34     {
 35         get
 36         {
 37             return false;
 38         }
 39     }
 40 }
 41  
 42 public class weixin
 43 {
 44     private String Token = "改写为自己的Token";
 45     private String DefaultResponseContent = "欢迎关注小牛路过";
 46  
 47     public void Auth()
 48     {
 49         String echoStr = HttpContext.Current.Request.QueryString["echoStr"];
 50  
 51         if (CheckSignature())
 52         {
 53             if (!String.IsNullOrEmpty(echoStr))
 54             {
 55                 HttpContext.Current.Response.Write(echoStr);
 56                 HttpContext.Current.Response.End();
 57             }
 58         }
 59     }
 60  //处理微信公众平台POST过来的数据
 61     public void Handle(String postStr)
 62     {
 63         XmlDocument doc = new XmlDocument();
 64         doc.LoadXml(postStr);
 65  
 66         XmlElement rootElement = doc.DocumentElement;
 67         XmlNode MsgType = rootElement.SelectSingleNode("MsgType");
 68  
 69         RequestXML requestXML = new RequestXML();
 70         requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
 71         requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
 72         requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
 73         requestXML.MsgType = MsgType.InnerText;
 74  
 75         if (requestXML.MsgType == "text")
 76         {
 77             requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
 78         }
 79  
 80         else if (requestXML.MsgType == "location")
 81         {
 82             requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
 83             requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
 84             requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
 85             requestXML.MapInfo = rootElement.SelectSingleNode("Label").InnerText;
 86         }
 87  
 88         else if (requestXML.MsgType == "image")
 89         {
 90             requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
 91         }
 92  
 93         ResponseMsg(requestXML);
 94     }
 95  
 96     /// 验证微信签名
 97     private bool CheckSignature()
 98     {
 99         String signature = HttpContext.Current.Request.QueryString["signature"];
100         String timestamp = HttpContext.Current.Request.QueryString["timestamp"];
101         String nonce = HttpContext.Current.Request.QueryString["nonce"];
102         String[] ArrTmp = { Token, timestamp, nonce };
103  
104         Array.Sort(ArrTmp);
105         String tmpStr = String.Join("", ArrTmp);
106  
107         tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
108         tmpStr = tmpStr.ToLower();
109  
110         if (tmpStr == signature)
111         {
112             return true;
113         }
114         else
115         {
116             return false;
117         }
118     }
119  
120     /// <summary>
121     /// 回复消息
122     /// </summary>
123     /// <param name="weixinXML"></param>
124     private void ResponseMsg(RequestXML requestXML)
125     {
126         String responseContent = String.Empty;
127         
128         if (requestXML.MsgType == "text")
129         {
130             responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "从数据库读取的内容");
131         }
132  
133         HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
134         HttpContext.Current.Response.Write(responseContent);
135     }
136  
137     /// 返回格式化文本XML内容
138     private String FormatTextXML(String fromUserName, String toUserName, String content)
139     {
140         return "<xml><ToUserName><![CDATA[" + fromUserName + "]]></ToUserName><FromUserName><![CDATA[" + toUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + content + "]]></Content><FuncFlag>1</FuncFlag></xml>";
141     }
142  
143     private int ConvertDateTimeInt(System.DateTime time)
144     {
145         System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
146         return (int)(time - startTime).TotalSeconds;
147     }
148 }
149  
150  
151 //微信请求类
152 public class RequestXML
153 {
154     private String toUserName = String.Empty;
155  
156     /// <summary>
157     /// 公众号
158     /// </summary>
159     public String ToUserName
160     {
161         get { return toUserName; }
162         set { toUserName = value; }
163     }
164  
165     private String fromUserName = "";
166  
167     /// <summary>
168     /// 发送方微信号
169     /// </summary>
170     public String FromUserName
171     {
172         get { return fromUserName; }
173         set { fromUserName = value; }
174     }
175  
176     private String createTime = String.Empty;
177  
178     /// <summary>
179     /// 创建时间
180     /// </summary>
181     public String CreateTime
182     {
183         get { return createTime; }
184         set { createTime = value; }
185     }
186  
187     private String msgType = String.Empty;
188  
189     /// <summary>
190     /// 信息类型 地理位置:location,文本消息:text,消息类型:image
191     /// </summary>
192     public String MsgType
193     {
194         get { return msgType; }
195         set { msgType = value; }
196     }
197  
198     private String content = String.Empty;
199  
200     /// <summary>
201     /// 信息内容
202     /// </summary>
203     public String Content
204     {
205         get { return content; }
206         set { content = value; }
207     }
208  
209     private String location_X = String.Empty;
210  
211     /// <summary>
212     /// 地理位置纬度
213     /// </summary>
214     public String Location_X
215     {
216         get { return location_X; }
217         set { location_X = value; }
218     }
219  
220     private String location_Y = String.Empty;
221  
222     /// <summary>
223     /// 地理位置经度
224     /// </summary>
225     public String Location_Y
226     {
227         get { return location_Y; }
228         set { location_Y = value; }
229     }
230  
231     private String scale = String.Empty;
232  
233     /// <summary>
234     /// 地图缩放大小
235     /// </summary>
236     public String Scale
237     {
238         get { return scale; }
239         set { scale = value; }
240     }
241  
242     private String mapInfo = String.Empty;
243  
244     /// <summary>
245     /// 地理位置信息
246     /// </summary>
247     public String MapInfo
248     {
249         get { return mapInfo; }
250         set { mapInfo = value; }
251     }
252  
253     private String picUrl = String.Empty;
254  
255     /// <summary>
256     /// 图片链接
257     /// </summary>
258     public String PicUrl
259     {
260         get { return picUrl; }
261         set { picUrl = value; }
262     }
263  }

 

 
 

 


转自:http://www.cnblogs.com/firstgreen/p/3586162

相关问答

更多
  • 能使用的!微信 在安卓手机里可以使用,安装是用java 开发的,所以 可以用java开发
  • 首先订阅号要通过微信认证才可以成为拥有自定义菜单不通过验证成为开发者也无法获得自定义菜单其次成为开发者要有个能够公网访问的URL也就是通常使用的网址现常用的有新浪的sae平台或者百度的开发者平台然后在该网.址下部署微信提供的接口文件修改接口文件中的token然后在token一栏中填写修改过后的token即可。‘动拇指’的团队做的,需要的话可以问.问去
  • 微信公众平台开发注意事项: 一、微信公众平台开发是指为微信公众号进行业务开发,为移动应用、PC端网站、公众号第三方平台(为各行各业公众号运营者提供服务)的开发,请前往微信开放平台接入。 二、在申请到认证公众号之前,你可以先通过测试号申请系统,快速申请一个接口测试号,立即开始接口测试开发。 三、在开发过程中,可以使用接口调试工具来在线调试某些接口。 四、每个接口都有每日接口调用频次限制,可以在公众平台官网-开发者中心处查看具体频次。 五、在开发出现问题时,可以通过接口调用的返回码,以及报警排查指引(在公众平台 ...
  • 小猪cms还凑合,,有源码的 ,每周更新两三个模板的 ,你可以看下 ,,
  • 登录微信公众平台,点击左下角的 开发者工具,即可看到相关文档。
  • 微网站开发模式教程:   第一步:申请消息接口   在公众平台网站的高级功能 – 开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL是开发者用来接收微信服务器数据的接口URL。Token可由开发者可以任意填写,用作生成签名。   第二步:验证URL有效性   开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数:   开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回 echostr参数内容,则接入生效,成为开发 ...
  • 用第三方平台做个商城就可以了
  • 听起来像是最近比较火的摇一摇和微信现场互动,这两个都是微信第三方公司开发的微信应用。现在做这种程序开发的很多。而且现在除了上面那些应用,还有照片打印机,微信wifi等硬件产品,这些东西都是为了帮助商家的微信公众号吸收粉丝的,如果单纯做活动,用这些软件只是增加了娱乐性和互动性,如果长远来看,要是想做下公司的微信营销, 58招财猫, 咨询一下;
  • 这个需要根据你找什么样的开发商,然后开发什么样的功能,如果是该需要对接你们系统之类的功能比较复杂,有几千的,也有好几万的,这个看你的需求
  • 微信公众平台的开发价格取决于功能和具体的外包公司,不同的地域价格也会略有差异。 我们给客户做的微信有30000元的也有10000多元的。 建议先把微信开发的需求整理好,然后多找几家公司进行报价。综合对比来选择。