微信公众平台简易设计使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sensiki/article/details/70312749

微信公众平台设备功能是微信为服务号提供的物联网解决方案,设备功能建立在微信硬件平台之上。设备功能允许硬件设备厂商通过服务号,将用户与其拥有的智能设备相连。

通过微信硬件平台规定的连接协议,各种智能设备如蓝牙设备、WIFI设备和其他移动网络设备都能方便的接入微信,完成设备、人、服务三者的连接。

申请

服务号目前不向个人开放申请,而且申请一个服务号流程比较复杂繁琐,审核时间也很长。为方便开发者开发调试,微信提供微信公众平台接口测试帐号,允许开发者在没有公众号的情况下,直接体验和测试公众平台的高级接口。测试账号折叠在订阅号中,头像与名称不可更改。除了模版消息功能外,测试号拥有服务号所具有的功能。测试号可以使用一年!

微信公众平台接口测试帐号申请地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

这里写图片描述

点击登陆,会弹出一个二维码

这里写图片描述

打开手机微信扫一下

这里写图片描述

点击确认登陆,网页会自动跳转到如下

这里写图片描述

到了这里算是登陆成功,下面进行配置

URL配置

登录成功后会看到一个接口配置信息,这里就是与你服务器连接的设置。

这里写图片描述

填写接口配置信息,信息需要你有自己的服务器资源,填写的URL需要正确响应微信发送的Token验证。其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。
这里需要注意一点,怎么设置才可以使你的服务器能够正确的响应微信发送的Token验证。填写不正确会有如下提示:
这里写图片描述

点击窗口中的消息接口使用指南链接,选择新手指南里的接入指南

这里写图片描述

在文档中可以发现下面的内容

这里写图片描述

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

//成为开发者url测试,返回echoStr
public void InterfaceTest()
{
    string token = "填写的token";
    if (string.IsNullOrEmpty(token))
    {
        return;
    }

    string echoString = HttpContext.Current.Request.QueryString["echoStr"];
    string signature = HttpContext.Current.Request.QueryString["signature"];
    string timestamp = HttpContext.Current.Request.QueryString["timestamp"];
    string nonce = HttpContext.Current.Request.QueryString["nonce"];

    if (!string.IsNullOrEmpty(echoString))
    {
        HttpContext.Current.Response.Write(echoString);
        HttpContext.Current.Response.End();
    }
}

在一般处理程序ashx的ProcessRequest的方法内调用上面的方法,url填写的就是这个ashx的服务器地址,token是一个服务器标示,可以随便输入,代码中的token要和申请填写的一致,成为开发者才能做开发。

创建菜单

我们添加一些微信服务号,聊天窗口下面有些菜单,这个可以在开发模式代码配置。微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html,可以看到创建菜单的一些要点,下面的使用网页调试工具调试该接口
按照需求根据示例做好菜单后,在文档最下面可以发现:使用网页调试工具调试该接口

这里写图片描述

点击进入

这里写图片描述

你会看到需要一个access_token,关于access_token的获取说明:http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html
翻到页面最后可以发现:使用网页调试工具调试该接口

这里写图片描述

点击进入

这里写图片描述

Appid跟secret可以在登陆的首界面找到

这里写图片描述

正确填入,点击检查问题

这里写图片描述

获取成功,图中所标示即为access_token
在自定义菜单网页调试工具中输入刚才获取到的access_token,输入自定义的body,微信界面示例

{
   "button" : [
      {
         "name" : "状态",
         "sub_button" : [
            {
               "key" : "Home_Temperature",
               "name" : "温湿度",
               "type" : "click"
            },
            {
               "key" : "Home_Intensity",
               "name" : "光强",
               "type" : "click"
            },
            {
               "key" : "Home_Battery",
               "name" : "电量",
               "type" : "click"
            }
         ]
      },
      {
         "name" : "灯控制",
         "sub_button" : [
            {
               "key" : "Light_One",
               "name" : "灯1",
               "type" : "click"
            },
            {
               "key" : "Light_Two",
               "name" : "灯2",
               "type" : "click"
            },
            {
               "key" : "Light_Threa",
               "name" : "灯3",
               "type" : "click"
            },
            {
               "key" : "Light_Four",
               "name" : "灯4",
               "type" : "click"
            }
         ]
      },
      {
         "name" : "其它",
         "sub_button" : [
         {
               "key" : "Buzzer",
               "name" : "蜂鸣器",
               "type" : "click"
            },
            {
               "key" : "Relay",
               "name" : "继电器",
               "type" : "click"
            },
            {
               "key" : "DC_Motor",
               "name" : "直流电机",
               "type" : "click"
            },
            {
               "key" : "Stepper_Motor",
               "name" : "步进电机",
               "type" : "click"
            },
            {
               "type": "scancode_push", 
               "name": "绑定设备", 
               "key": "rselfmenu_0_1", 
               "sub_button": [ ]
            }

         ]
      }
   ]
}

点击检查问题

这里写图片描述

菜单创建成功。微信还提供了其他菜单操作,在开发者文档中有详细的说明,参考即可。

接受消息

微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/index.php?title=接收普通消息,我们使用微信就是要对用户发送的信息进行处理,这边以接受普通消息为例,语音、图片消息等,举一反三可得。
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。文本类型的推送XML数据包结构如下:

<xml>
<ToUserName> < ![CDATA[toUser]] > < / ToUserName >
<FromUserName> < ![CDATA[fromUser]] > < / FromUserName >
<CreateTime>1348831860 < / CreateTime >
<MsgType> < ![CDATA[text]] > < / MsgType >
<Content> < ![CDATA[this is a test]] > < / Content >
<MsgId>1234567890123456 < / MsgId >
< / xml >

我们在ashx添加下面代码:

public void ProcessRequest(HttpContext param_context)
{
    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);
            Handle(postString);
        }
    }
}

/// <summary>
/// 处理信息并应答
/// </summary>
private void Handle(string postStr)
{
    messageHelp help = new messageHelp();
    string responseContent = help.ReturnMessage(postStr);

    HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
    HttpContext.Current.Response.Write(responseContent);
}

messageHelp是消息处理帮助类,获取的postString是xml,格式如上,我们这边只需要转换成XmlDocument进行解析就行了:

//接受文本消息
public string TextHandle(XmlDocument xmldoc)
{
    string responseContent = "";
    XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");
    XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");
    XmlNode Content = xmldoc.SelectSingleNode("/xml/Content");
    if (Content != null)
    {
        responseContent = string.Format(ReplyType.Message_Text,
                                        FromUserName.InnerText,
                                        ToUserName.InnerText,
                                        DateTime.Now.Ticks,
                                        "欢迎使用微信公共账号,您输入的内容为:" + Content.InnerText + "\r\n<a href=\"http://my.csdn.net/sensiki\">点击进入</a>");
    }
    return responseContent;
}
/// <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>";
    }
}

上面的代码就是接受消息,并做一些处理操作,返回消息。

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

这边发送消息我分为三种:普通消息、图文消息和菜单事件响应。普通消息其实上面说接受消息的时候讲到了。我们先看下图文消息和菜单事件响应,微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html
xml格式为:

<xml>
<ToUserName> < ![CDATA[toUser]] > < / ToUserName >
<FromUserName> < ![CDATA[fromUser]] > < / FromUserName >
<CreateTime>12345678 < / CreateTime >
<MsgType> < ![CDATA[news]] > < / MsgType >
<ArticleCount>2 < / ArticleCount >
<Articles>
<item>
<Title> < ![CDATA[title1]] > < / Title >
<Description> < ![CDATA[description1]] > < / Description >
<PicUrl> < ![CDATA[picurl]] > < / PicUrl >
<Url> < ![CDATA[url]] > < / Url >
< / item >
<item>
<Title> < ![CDATA[title]] > < / Title >
<Description> < ![CDATA[description]] > < / Description >
<PicUrl> < ![CDATA[picurl]] > < / PicUrl >
<Url> < ![CDATA[url]] > < / Url >
< / item >
< / Articles >
< / xml >

示例代码:

//事件
public string EventHandle(XmlDocument xmldoc)
{
    string responseContent = "";
    XmlNode Event = xmldoc.SelectSingleNode("/xml/Event");
    XmlNode EventKey = xmldoc.SelectSingleNode("/xml/EventKey");
    XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");
    XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");
    if (Event != null)
    {
        //菜单单击事件
        if (Event.InnerText.Equals("CLICK"))
        {
            if (EventKey.InnerText.Equals("click_one"))//click_one
            {
                responseContent = string.Format(ReplyType.Message_Text,
                                                FromUserName.InnerText,
                                                ToUserName.InnerText,
                                                DateTime.Now.Ticks,
                                                "你点击的是click_one");
            }
            else if (EventKey.InnerText.Equals("click_two"))//click_two
            {
                responseContent = string.Format(ReplyType.Message_News_Main,
                                                FromUserName.InnerText,
                                                ToUserName.InnerText,
                                                DateTime.Now.Ticks,
                                                "1",
                                                string.Format(ReplyType.Message_News_Item, "sensiki博客", "",
                                                        "http://image.baidu.com/i?tn=....jpg",
                                                        "http://my.csdn.net/sensiki"));
            }
        }
    }
    return responseContent;
}
/// <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> ";
    }
}

需要注意的是:XmlNode Event = xmldoc.SelectSingleNode(“/xml/Event”)表示获取的是事件类型,XmlNode EventKey = xmldoc.SelectSingleNode(“/xml/EventKey”)表示事件标示,就是我们创建菜单添加click的key,通过key我们就可以判断出是点的哪个菜单。
还有一点是回复超链接,有时候在服务号会发送一些链接,我们打开直接就会链接到相关网址,只需要在回复内容中添加:

<a href="http:// dev.hqyj.com">点击进入</a>

就可以了。

生成带参数的二维码

这个功能实现比较简单,官方有比较详细的文档。

猜你喜欢

转载自blog.csdn.net/sensiki/article/details/70312749