使用.net做微信公众号后台

asp.net mvc 后台 + 微信开发入门 的研究

本人小白.net出身,第一次做微信开发。又不会php和别的语言。只有用.net做了。
如有不对之处,还请指点。

开发环境

1.win7 x64
2.vs2015

步骤

1.申请公众号

公众号首页地址:https://mp.weixin.qq.com ,没有公众号的点击注册,
注册过程就不用多说了。
我注册了一个,点击登录。如图:
使用.net做微信公众号后台_第1张图片
进入后台以后,一番玩耍之后。进入正题。往下翻找到开发者工具,进入之后,别的先不管,点击开发者文档。
先看一下,大致了解文档结构。

2.编码

首先,点击开发开发->接入指南。
首先看到,要填写基本设置。大概意思是微信服务器会往你填的地址发送一个get请求。传入4个参数。参数如下 :
使用.net做微信公众号后台_第2张图片
打开基本设置页面,填写如下:
使用.net做微信公众号后台_第3张图片
点击提交,会提示错误。提交不成功。
那么 ,我们就想到,要写一个web程序处理这个请求了。
打开vs2015,新建一个asp.net mvc应用程序。添加一个HomeControl ,在HomeControl里面添加一个public void wx(){}方法。
呃,这个步骤不懂的话,建议先去学一下asp.net mvc。
使用.net做微信公众号后台_第4张图片
如图所示,给它返回echostr就说明验证成功了。那么,如果 你也可以省事,不去验证请求来源的真实性,直接 返回echostr.当然这样的产品是有风险的(什么风险我也不知道,不然它让验证干嘛,是吧^_^)。

 public void wx()
        {
            #region 验证请求来源是否是微信
            string signature = Request["signature"]?.ToString();
            string timestamp = Request["timestamp"]?.ToString();
            string nonce = Request["nonce"]?.ToString();
            string echostr = Request["echostr"]?.ToString();
            string token = "hellowb";
            List<string> list = new List<string>() { token, timestamp, nonce };
            list.Sort();
            string data = string.Join("", list);
            byte[] temp1 = Encoding.UTF8.GetBytes(data);
            SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
            byte[] temp2 = sha.ComputeHash(temp1);

            var hashCode = BitConverter.ToString(temp2);
            hashCode = hashCode.Replace("-", "").ToLower();

            if (hashCode == signature)
            {
                Response.Write(echostr);
                Response.End();
            }
            #endregion
        }

将网站布置到你的服务器上,占用80端口(只能使用80,不会布置网站的请自行百度)。然后回到微信后台基本配置页。如图使用.net做微信公众号后台_第5张图片
令牌你可以自己随便写一个自己喜欢的,然后代码里面对应着改就好。
点击提交。如果提示提交成功,那么 万事大吉。成功了。
当然还会有意外,如果 提示发生错误,请稍后重试。试着把url复制到浏览器里访问,看能不能通。
好了,现在验证成功了,就可以真正成为一个微信开发者了。

消息处理

本次先从处理微信用户发送的消息为切入点。点击接收普通消息。如图
使用.net做微信公众号后台_第6张图片
根据开发文档,了解到,如果用户关注了你,并给你发送了一个文本消息,微信服务器会给你填写的url(示例为 http://ip/home/wx)发送一个post 请求,内容为使用.net做微信公众号后台_第7张图片
是一个xml。那么 。添加一个xmlHelper类,

using System;
    using System.Collections.Generic;
    using System.Xml;

namespace wxApp
{
    public class XmlHelper
    {
        public static Dictionary<string, string> GetMsgEntity(string text)
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(text);
                Dictionary<string, string> dict = new Dictionary<string, string>();
                XmlNodeList xml = doc.SelectSingleNode("/xml").ChildNodes;
                foreach (XmlNode node in xml)
                {
                    dict.Add(node.Name, node.InnerText);
                }
                return dict;
            }
            catch (Exception)
            {
                return new Dictionary<string, string>();
            }
        }
    }
}

现在我们的url要能区分post get 请求了。改写如下
使用.net做微信公众号后台_第8张图片
在HomeControl 新建一个private void ProcessPost(HttpRequestBase request)(){}方法.

 private void ProcessPost(HttpRequestBase request)
        {
            var istream = Request.InputStream;
            byte[] temp = new byte[istream.Length];
            istream.Read(temp, 0, (int)istream.Length);
            string xml = Encoding.UTF8.GetString(temp);
            var dic = XmlHelper.GetMsgEntity(xml);
            switch (dic["MsgType"])
            {
                case "text":
                    ProcessTextMsg(dic, request);
                    break;
                default:
                    break;
            }
        }

在HomeControl 新建一个private void ProcessTextMsg(Dictionary

 private void ProcessTextMsg(Dictionary<string, string> dic, HttpRequestBase request)
        {
                string tempxml = "<xml><ToUserName>ToUserName><FromUserName>FromUserName><CreateTime>-timeCreateTime><MsgType>MsgType><Content>Content>xml>";
                tempxml = tempxml.Replace("-tname", dic["FromUserName"]);
                tempxml = tempxml.Replace("-fname", dic["ToUserName"]);
                tempxml = tempxml.Replace("-time", dic["CreateTime"]);
                tempxml = tempxml.Replace("-content", $"MsgType:{dic["MsgType"]}\ncontent:{dic["Content"]}\nMsgId:{dic["MsgId"]}");
                Response.Write(tempxml);
                Response.End();
        }

现在我们的处理方法就ok了。
打开微信,关注我们自己的公众号,发送一个消息,它就会回复一个消息了。
效果如下
使用.net做微信公众号后台_第9张图片

其它消息处理也是如此,以此类推就可。
这次就写到这里了,欢迎留言。

你可能感兴趣的:(c#)