[转]C#开发微信公众平台-就这么简单

正文转自:http://www.it165.net/pro/html/201403/11102.html

 

 

写于眼前

服务号和订阅号 URL配置 创立菜单 查询、删除菜单 接受音讯发送音讯(图文、菜单事件响应) 示例Demo下载 后记

  如今公司于召开微信支付,其实就是是接口开发,网上搜索了无数材料,当然园友也写了众科目,但依然辩论说了一样深堆,实用率领或代码很少。假诺您自己精心研究下,其实虽然那一点东西,C#兑现起来呢特别粗略,原本不想念写就篇稿子的,然则自己就摸索走了很多弯路,这边总括下,希望初次接触微信公众平台的情侣别像就的自一样。

  自己出手,丰衣足食。

服务号和订阅号

  服务号是铺申请的微信公共账号,订阅号是私房报名之,我个人也申请了一个,可是没有怎么用。

  服务号

1单月(30天)内就可以发送1修群发消息。
发给订阅用户(粉丝)的信息,会突显在对方的谈天列表中。
在发送消息让用户时时,用户用收取及时之信提示。
服务号会在订阅用户(粉丝)的报道录中。 可申请由定义菜单。 

  订阅号

每日(24时外)可以发送1长达群发信息。
发给订阅用户(粉丝)的音信,将相会来得在对方的订阅号文件夹着。
在发送音讯让订阅用户(粉丝)时,订阅用户不会师吸纳即时信息提示。
在订阅用户(粉丝)的报道录中,订阅号将给放入订阅号文件夹着。
订阅号不扶助申请于定义菜单。

URL配置

  启用开发形式要事先成为开发者,而且编辑格局及开支情势只好挑一个,进入微信公众平台-开发形式,如下:

C# 1

  需要填写url和token,当时本人填写者的时段花了遥遥无期,我论认为填写个服务器的url就足以了(80端口),可是那多少个,主假若无仔细的翻阅指示音信,所以连续提醒

C# 2

C# 3

  从地点可以看看,点击提交后微信会向大家填写的服务器发送多少个参数,然后要原样重回下,所以在提交url的时节,先在服务器创制接口测试重回echostr参数内容。代码:

view
source
print?

01.``1        
//成为开发者url测试,返回echoStr

02.`` ``2         public void
InterfaceTest()

03.`` ``3         {

04.`` ``4            
string token = ``"填写的token"``;

05.`` ``5             if
(string.IsNullOrEmpty(token))

06.`` ``6             {

07.`` ``7                 return``;

08.`` ``8             }

09.`` ``9

10.``10            
string echoString = HttpContext.Current.Request.QueryString[``"echoStr"``];

11.``11            
string signature = HttpContext.Current.Request.QueryString[``"signature"``];

12.``12            
string timestamp = HttpContext.Current.Request.QueryString[``"timestamp"``];

13.``13            
string nonce = HttpContext.Current.Request.QueryString[``"nonce"``];

14.``14

15.``15             if
(!string.IsNullOrEmpty(echoString))

16.``16             {

17.``17                
HttpContext.Current.Response.Write(echoString);

18.``18                
HttpContext.Current.Response.End();

19.``19             }

20.``20         }

  于形似处理程序ashx的ProcessRequest的法内调用地点的法,url填写的虽是是ashx的服务器地址,token是一个服务器标示,可以任由输入,代码中的token要和申请填写的等同,成为开发者才可以开开发。

创制菜单

  我们抬高一些微信服务号,聊天窗口上面小菜单,这多少个可以在编辑情势简单布置,也得于付出模式代码配置。微信公众平台开发者文档:http://mp.weixin.[qq](http://www.it165.net/qq/).com/wiki/index.php?title=自定义菜单创建接口,可以看到创建菜单的一些要点,下面的使用网页调试工具调试该接口,只是调试接口是否可用,并不是直接创建菜单的,菜单分为两种:

click:
用户点击click类型按钮后,微信服务器会经过音讯接口推送信息类型也event
的布局给开发者(参考音信接口指南),并且带动达按钮中开发者填写的key值,开发者可以因此自定义的key值与用户举办互。
view:
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填入的url值
(即网页链接),达到打开网页的目标,指出与网页授权获取用户基本音讯接口结合,拿到用户的登入个人音讯。

  click菜单需要填一个key,这一个是当我们菜单点击事件之早晚会就此到,view只是一个食谱超链接。菜单数据是json格式,官网是php示例,其实C#贯彻起来呢够呛简单,就是post发送一个json数据,示例代码:

view
source
print?

01.``1     public partial ``class
createMenu : System.Web.UI.Page

02.`` ``2     {

03.`` ``3         protected void
Page_Load(object sender, EventArgs e)

04.`` ``4         {

05.`` ``5             FileStream fs1 = ``new
FileStream(Server.MapPath(``"."``)+``"\\menu.txt"``, FileMode.Open);

06.`` ``6             StreamReader sr = ``new
StreamReader(fs1, Encoding.GetEncoding(``"GBK"``));

07.`` ``7            
string menu = sr.ReadToEnd();

08.`` ``8             sr.Close();

09.`` ``9             fs1.Close();

10.``10            
GetPage(``"https://api.weixin.<;a class="``keylink``" href="``http://www.it165.net/qq/``" target="``_blank``">qq</a>.com/cgi-bin/menu/create?access_token=access_token"``, menu);

11.``11         }

12.``12         public
string GetPage(string posturl, string postData)

13.``13         {

14.``14            
Stream outstream = ``null``;

15.``15            
Stream instream = ``null``;

16.``16            
StreamReader sr = ``null``;

17.``17            
HttpWebResponse response = ``null``;

18.``18            
HttpWebRequest request = ``null``;

19.``19            
Encoding encoding = Encoding.UTF8;

20.``20            
byte``[] data = encoding.GetBytes(postData);

21.``21            
// 准备请求...

22.``22             try

23.``23             {

24.``24                
// 设置参数

25.``25                
request = WebRequest.Create(posturl) as HttpWebRequest;

26.``26                
CookieContainer cookieContainer = ``new
CookieContainer();

27.``27                
request.CookieContainer = cookieContainer;

28.``28                
request.AllowAutoRedirect = ``true``;

29.``29                
request.Method = ``"POST"``;

30.``30                
request.ContentType = ``"application/x-www-form-urlencoded"``;

31.``31                
request.ContentLength = data.Length;

32.``32                
outstream = request.GetRequestStream();

33.``33                
outstream.Write(data, ``0``, data.Length);

34.``34                
outstream.Close();

35.``35                
//发送请求并获取相应回应数据

36.``36                
response = request.GetResponse() as HttpWebResponse;

37.``37                
//直到request.GetResponse()程序才开始向目标网页发送Post请求

38.``38                
instream = response.GetResponseStream();

39.``39                 sr = ``new
StreamReader(instream, encoding);

40.``40                
//返回结果网页(html)代码

41.``41                
string content = sr.ReadToEnd();

42.``42                
string err = string.Empty;

43.``43                
Response.Write(content);

44.``44                 return
content;

45.``45             }

46.``46             catch
(Exception ex)

47.``47             {

48.``48                
string err = ex.Message;

49.``49                 return
string.Empty;

50.``50             }

51.``51         }

52.``52     }

  menu.text里面的始末即是json示例菜单,我们好起示例复制下来,遵照卿的内需修改部分不怕举行了。

  关于access_token,其实就是一个呼吁标示,获取形式:https://api.weixin.qq.com/cgi-bin/token?grant\_type=client\_credential&appid=appid&secret=secret;appid和secret是开发者标示,在你的信息里面可以看到,通过这个链接返回一个json数据,就可以得到access\_token值。

  需要小心的是:access_token有一定之时效性,失效的口舌就待更取下,这几个于本机就可以创设,不需上传到服务器,创立菜单是,重返{“errcode”:0,”errmsg”:”ok”}提醒信息。这边就不截图了,大家试下就可以看到效果,一般创设菜单是同等到少分钟生效,实在挺就重新关注下。

查询、删除菜单

  查询以及去菜单也生简单,只然而是get请求,不需要传数据,看下示例代码:

view
source
print?

01.``1     public partial ``class
selectMenu : System.Web.UI.Page

02.`` ``2     {

03.`` ``3         protected void
Page_Load(object sender, EventArgs e)

04.`` ``4         {

05.`` ``5            
GetPage(``"https://api.weixin.qq.com/cgi-bin/menu/get?access_token=access_token"``);

06.`` ``6            
//GetPage("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=access_token");

07.`` ``7         }

08.`` ``8         public
string GetPage(string posturl)

09.`` ``9         {

10.``10            
Stream instream = ``null``;

11.``11            
StreamReader sr = ``null``;

12.``12            
HttpWebResponse response = ``null``;

13.``13            
HttpWebRequest request = ``null``;

14.``14            
Encoding encoding = Encoding.UTF8;

15.``15            
// 准备请求...

16.``16             try

17.``17             {

18.``18                
// 设置参数

19.``19                
request = WebRequest.Create(posturl) as HttpWebRequest;

20.``20                
CookieContainer cookieContainer = ``new
CookieContainer();

21.``21                
request.CookieContainer = cookieContainer;

22.``22                
request.AllowAutoRedirect = ``true``;

23.``23                
request.Method = ``"GET"``;

24.``24                
request.ContentType = ``"application/x-www-form-urlencoded"``;

25.``25                
//发送请求并获取相应回应数据

26.``26                
response = request.GetResponse() as HttpWebResponse;

27.``27                
//直到request.GetResponse()程序才开始向目标网页发送Post请求

28.``28                
instream = response.GetResponseStream();

29.``29                 sr = ``new
StreamReader(instream, encoding);

30.``30                
//返回结果网页(html)代码

31.``31                
string content = sr.ReadToEnd();

32.``32                
string err = string.Empty;

33.``33                
Response.Write(content);

34.``34                 return
content;

35.``35             }

36.``36             catch
(Exception ex)

37.``37             {

38.``38                
string err = ex.Message;

39.``39                 return
string.Empty;

40.``40             }

41.``41         }

42.``42     }

  access_token获取形式方面都谈过了,查询菜单重临的是json数据,其实固然是大家创设菜单的menu.txt里面的情。

  删除成功重返音讯提醒:{“errcode”:0,”errmsg”:”ok”},这一个啊要以地点运行就得了。

纳音讯

  微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/index.php?title=接收普通消息,我们使用微信就是要对用户发送的信息进行处理,这边以接受普通消息为例,语音、图片消息等,举一反三可得。

  从文档上足见到接受音讯得到的凡一个xml格式文件,当时略犯傻的是,我只要在争举行接受消息啊?还郁闷了大体上龙,其实就是若一样伊始填写的url,是无是分外羞愧啊,哈哈。

view
source
print?

1.``1  <xml>

2.``2 
<ToUserName><![CDATA[toUser]]></ToUserName>

3.``3 
<FromUserName><![CDATA[fromUser]]></FromUserName>

4.``4 
<CreateTime>``1348831860``</CreateTime>

5.``5 
<MsgType><![CDATA[text]]></MsgType>

6.``6  <Content><![CDATA[``this
is a test]]></Content>

7.``7 
<MsgId>``1234567890123456``</MsgId>

8.``8  </xml>

  我们于ashx添加底下代码:

view
source
print?

01.``1         public void
ProcessRequest(HttpContext param_context)

02.`` ``2         {

03.`` ``3            
string postString = string.Empty;

04.`` ``4             if
(HttpContext.Current.Request.HttpMethod.ToUpper() == ``"POST"``)

05.`` ``5             {

06.`` ``6                
using (Stream stream = HttpContext.Current.Request.InputStream)

07.`` ``7                 {

08.`` ``8                    
Byte[] postBytes = ``new Byte[stream.Length];

09.`` ``9                    
stream.Read(postBytes, ``0``, (Int32)stream.Length);

10.``10                    
postString = Encoding.UTF8.GetString(postBytes);

11.``11                    
Handle(postString);

12.``12                 }

13.``13             }

14.``14         }

15.``15

16.``16         /// <summary>

17.``17        
/// 处理信息并应答

18.``18         /// </summary>

19.``19         private void
Handle(string postStr)

20.``20         {

21.``21             messageHelp help = ``new
messageHelp();

22.``22            
string responseContent = help.ReturnMessage(postStr);

23.``23

24.``24            
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;

25.``25            
HttpContext.Current.Response.Write(responseContent);

26.``26         }

  messageHelp是信处理帮衬类似,这边提供下有些代码,完整的好生充斥来,获取之postString是xml,格式如达到,我们这边仅待换成XmlDocument举行辨析就执行了:

view
source
print?

01.``1         //接受文本消息

02.`` ``2         public
string TextHandle(XmlDocument xmldoc)

03.`` ``3         {

04.`` ``4            
string responseContent = ``""``;

05.`` ``5            
XmlNode ToUserName = xmldoc.SelectSingleNode(``"/xml/ToUserName"``);

06.`` ``6            
XmlNode FromUserName = xmldoc.SelectSingleNode(``"/xml/FromUserName"``);

07.`` ``7            
XmlNode Content = xmldoc.SelectSingleNode(``"/xml/Content"``);

08.`` ``8             if
(Content != ``null``)

09.`` ``9             {

10.``10                
responseContent = string.Format(ReplyType.Message_Text,

11.``11                    
FromUserName.InnerText,

12.``12                    
ToUserName.InnerText,

13.``13                    
DateTime.Now.Ticks,

14.``14                    
"欢迎使用微信公共账号,您输入的内容为:"
+ Content.InnerText+``"\r\n<a href=\"http://www.cnblogs.com\">点击进入</a>"``);

15.``15             }

16.``16             return
responseContent;

17.``17         }

18.``18         /// <summary>

19.``19         /// 普通文本消息

20.``20         /// </summary>

21.``21         public static
string Message_Text

22.``22         {

23.``23             get { ``return
@"<xml>

24.``24                            
<ToUserName><![CDATA[{``0``}]]></ToUserName>

25.``25                            
<FromUserName><![CDATA[{``1``}]]></FromUserName>

26.``26                            
<CreateTime>{``2``}</CreateTime>

27.``27                            
<MsgType><![CDATA[text]]></MsgType>

28.``28                            
<Content><![CDATA[{``3``}]]></Content>

29.``29                            
</xml>"; }

30.``30         }

  下边的代码就是受音信,并召开一些处理操作,重回消息。

发送信息(图文、菜单事件响应)

  这边发送音信我分为三栽:普通音讯、图文新闻和菜单事件响应。普通音讯其实上边说收受信息之时刻摆到了,完整的代码上面下充斥来拘禁。

  我们事先押下图文消息和菜单事件响应,微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/index.php?title=回复图文消息\#.E5.9B.9E.E5.A4.8D.E5.9B.BE.E6.96.87.E6.B6.88.E6.81.AF,xml格式为:

view
source
print?

01.``1 <xml>

02.`` ``2
<ToUserName><![CDATA[toUser]]></ToUserName>

03.`` ``3
<FromUserName><![CDATA[fromUser]]></FromUserName>

04.`` ``4
<CreateTime>``12345678``</CreateTime>

05.`` ``5
<MsgType><![CDATA[news]]></MsgType>

06.`` ``6
<ArticleCount>``2``</ArticleCount>

07.`` ``7 <Articles>

08.`` ``8 <item>

09.`` ``9
<Title><![CDATA[title1]]></Title>

10.``10
<Description><![CDATA[description1]]></Description>

11.``11
<PicUrl><![CDATA[picurl]]></PicUrl>

12.``12
<Url><![CDATA[url]]></Url>

13.``13 </item>

14.``14 <item>

15.``15
<Title><![CDATA[title]]></Title>

16.``16
<Description><![CDATA[description]]></Description>

17.``17
<PicUrl><![CDATA[picurl]]></PicUrl>

18.``18
<Url><![CDATA[url]]></Url>

19.``19 </item>

20.``20 </Articles>

21.``21 </xml>

  图文音讯分为二种植,我们先行看下力量,找的灵活速递的微信服务号举办示范:

C# 4C# 5

  刚起开的时,我当这有限栽应该无是用的和一个接口,但是以文档中找了大体上天呢不曾找到除了这以外的,就试了下零星独图文音讯,发现就是是接口发送的,假设五个的话,item中的Description会失效,只会彰显Title,大家试下就清楚了,示例代码:

view
source
print?

01.``1         //事件

02.`` ``2         public
string EventHandle(XmlDocument xmldoc)

03.`` ``3         {

04.`` ``4            
string responseContent = ``""``;

05.`` ``5            
XmlNode Event = xmldoc.SelectSingleNode(``"/xml/Event"``);

06.`` ``6            
XmlNode EventKey = xmldoc.SelectSingleNode(``"/xml/EventKey"``);

07.`` ``7            
XmlNode ToUserName = xmldoc.SelectSingleNode(``"/xml/ToUserName"``);

08.`` ``8            
XmlNode FromUserName = xmldoc.SelectSingleNode(``"/xml/FromUserName"``);

09.`` ``9             if
(Event!=``null``)

10.``10             {

11.``11                
//菜单单击事件

12.``12                 if
(Event.InnerText.Equals(``"CLICK"``))

13.``13                 {

14.``14                     if
(EventKey.InnerText.Equals(``"click_one"``))``//click_one

15.``15                     {

16.``16                        
responseContent = string.Format(ReplyType.Message_Text,

17.``17                            
FromUserName.InnerText,

18.``18                            
ToUserName.InnerText,

19.``19                            
DateTime.Now.Ticks,

20.``20                            
"你点击的是click_one"``);

21.``21                     }

22.``22                     else if
(EventKey.InnerText.Equals(``"click_two"``))``//click_two

23.``23                     {

24.``24                        
responseContent = string.Format(ReplyType.Message_News_Main,

25.``25                            
FromUserName.InnerText,

26.``26                            
ToUserName.InnerText,

27.``27                            
DateTime.Now.Ticks,

28.``28                            
"2"``,

29.``29                             
string.Format(ReplyType.Message_News_Item,``"我要寄件"``,``""``,

30.``30                             
"http://www.soso.com/orderPlace.jpg"``,

31.``31                             
"http://www.soso.com/"``)+

32.``32                             
string.Format(ReplyType.Message_News_Item, ``"订单管理"``, ``""``,

33.``33                             
"http://www.soso.com/orderManage.jpg"``,

34.``34                             
"http://www.soso.com/"``));

35.``35                     }

36.``36                     else if
(EventKey.InnerText.Equals(``"click_three"``))``//click_three

37.``37                     {

38.``38                        
responseContent = string.Format(ReplyType.Message_News_Main,

39.``39                            
FromUserName.InnerText,

40.``40                            
ToUserName.InnerText,

41.``41                            
DateTime.Now.Ticks,

42.``42C#,                            
"1"``,

43.``43                             
string.Format(ReplyType.Message_News_Item, ``"标题"``, ``"摘要"``,

44.``44                             
"http://www.soso.com/jieshao.jpg"``,

45.``45                             
"http://www.soso.com/"``));

46.``46                     }

47.``47                 }

48.``48             }

49.``49             return
responseContent;

50.``50         }

51.``51         /// <summary>

52.``52         /// 图文消息主体

53.``53         /// </summary>

54.``54         public static
string Message_News_Main

55.``55         {

56.``56             get

57.``57             {

58.``58                 return
@"<xml>

59.``59                            
<ToUserName><![CDATA[{``0``}]]></ToUserName>

60.``60                            
<FromUserName><![CDATA[{``1``}]]></FromUserName>

61.``61                            
<CreateTime>{``2``}</CreateTime>

62.``62                            
<MsgType><![CDATA[news]]></MsgType>

63.``63                            
<ArticleCount>{``3``}</ArticleCount>

64.``64                            
<Articles>

65.``65                            
{``4``}

66.``66                            
</Articles>

67.``67                            
</xml> ";

68.``68             }

69.``69         }

70.``70         /// <summary>

71.``71         /// 图文消息项

72.``72         /// </summary>

73.``73         public static
string Message_News_Item

74.``74         {

75.``75             get

76.``76             {

77.``77                 return
@"<item>

78.``78                            
<Title><![CDATA[{``0``}]]></Title>

79.``79                            
<Description><![CDATA[{``1``}]]></Description>

80.``80                            
<PicUrl><![CDATA[{``2``}]]></PicUrl>

81.``81                            
<Url><![CDATA[{``3``}]]></Url>

82.``82                            
</item>";

83.``83             }

84.``84         }

  需要小心的凡:XmlNode 伊芙(Eve)nt =
xmldoc.SelectSingleNode(“/xml/伊芙(Eve)nt”)表示收获之是事件类,XmlNode
伊芙ntKey =
xmldoc.SelectSingleNode(“/xml/伊芙(Eve)ntKey”)表示事件标示,就是大家成立菜单上加click的key,通过key我们就是可判出是触发之哪位菜单。

  还有少数凡是过来过链接,有时候在服务号会发送一些链接,大家打开直接就会面链接到相关网址,只待以平复内容被添加:<a
href=”http://www.baidu.com"&gt;点击进入&lt;/a&gt;,就可以了。

示例Demo下载

  下载地址:http://pan.baidu.com/s/1i3kMpwh

后记

  关于微信公众平台自还有不少外的东西,本篇只是一对经验之谈,希望得以自及抛砖引玉的用意。有时候我们发现有的特殊事物,觉得大为难,就远远的禁闭正在,假若您用心的失感受它们,其实呢即使这么回事。

莫使大估计别人,低估自己,其实深入主旨,很多若自以为很巨大的食指,其实也平素不什么,真是这样。

  倘诺你看本篇随笔针对性您抱有助,请点击左侧下“推荐”,^_^

延长阅读:

相关文章