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

 

 

形容以前边

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

  最近供销社当开微信支付,其实就是接口开发,网上查找了过多资料,当然园友也写了森课,但都是理论说了同样挺堆,实用指导或代码很少。如果你协调精心研究下,其实就那点东西,C#实现起来呢酷简单,原本不思写就首文章的,但是自就找走了累累弯路,这边总结下,希望初次接触微信公众平台的意中人别像就的本身同一。

  自己动手,丰衣足食。

服务号和订阅号

  服务号是商家申请之微信官账号,订阅号是个人申请的,我个人呢申请了一个,不过尚未怎么用。

  服务号

1只月(30天)内仅可以发送1长达群发信息。
发给订阅用户(粉丝)的信,会显得在对方的拉扯列表中。
在殡葬信息给用户时时,用户用收受及时底消息提醒。
服务号会在订阅用户(粉丝)的简报录中。 可申请由定义菜单。 

  订阅号

每日(24时外)可以发送1长群发信息。
发给订阅用户(粉丝)的音,将会见展示在对方的订阅号文件夹着。
在殡葬信息给订阅用户(粉丝)时,订阅用户不见面吸收即时消息提醒。
在订阅用户(粉丝)的简报录中,订阅号将吃放入订阅号文件夹着。
订阅号不支持申请于定义菜单。

URL配置

  启用开发模式要先成为开发者,而且编辑模式以及支出模式只能挑一个,进入微信公众平台-开发模式,如下:

json 1

  需要填写url和token,当时本人填写者的时段花了遥远,我论认为填写个服务器的url就足以了(80端口),但是那个,主要是未曾仔细的读提示信息,所以连续提示

json 2

json 3

  从上面可以看到,点击提交后微信会向我们填写的服务器发送几独参数,然后要原样返回下,所以于付给url的时候,先在服务器创建接口测试返回echostr参数内容。代码:

view
sourceprint?

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
sourceprint?

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
sourceprint?

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
sourceprint?

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
sourceprint?

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
sourceprint?

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
sourceprint?

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>

  图文信息分为两种植,我们先看下力量,找的利落速递的微信服务号做示范:

json 4json 5

  刚开头举行的当儿,我觉得这半种应该无是用底与一个接口,但是以文档中摸索了大体上龙呢绝非找到除了这之外的,就试了下零星独图文信息,发现即使是此接口发送的,如果多单的话,item中的Description会失效,只会显Title,大家试下就清楚了,示例代码:

view
sourceprint?

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.``42                            
"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 Event =
xmldoc.SelectSingleNode(“/xml/Event”)表示收获的凡事件类,XmlNode
EventKey =
xmldoc.SelectSingleNode(“/xml/EventKey”)表示事件标示,就是我们创建菜单上加click的key,通过key我们即便可判定出是沾之谁菜单。

  还有某些是过来过链接,有时候在劳动号会发送一些链接,我们开拓直接就会见链接到相关网址,只需要以平复内容遭丰富:<a
href=”http://www.baidu.com"&gt;点击进入&lt;/a&gt;,就可以了。

示例Demo下载

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

后记

  关于微信公众平台自还有为数不少外的东西,本篇只是片经验之谈,希望得以起至抛砖引玉的意。有时候我们发现一些特有事物,觉得非常不便,就远远的看在,如果您用心的去感受它们,其实也便这么回事。

未若大估计别人,低估自己,其实深入中心,很多你自以为很巨大的总人口,其实为尚未什么,真是这样。

  如果你看本篇文章对而拥有助,请点击右侧下“推荐”,^_^

延长阅读:

  • 1、微信公众平台开发教程(七)Session处理
  • 2、C#在x64平台引用Dll出错[BadImageFormatException未处理
    (0x8007000B)]
  • 3、.net平台下颇拷贝和浅拷贝
  • 4、微信公共服务平台支付(.Net的贯彻)1
    证明“成为开发者”
  • 5、微信公共服务平台支付(.Net的实现)2
    取ACCESSTOKEN

相关文章

网站地图xml地图