c#实现微信公众号开发--接入

2012年从微信公众号一推出就开始跟进研究,中间很多年因为工作岗位变动不再涉及编程,但作为业余爱好,兴趣一直没变,现总结几篇关于微信公众号开发的实现,帮助新手,同时也便于自己回顾。自己做微信公众好管理平台的框架相对内容较多,这里只给出部分关键功能的实现。

一、首先注册公众号,根据性质不同可以选择订阅号、服务号、企业号,开放接口按照前面顺序是由少到多,根据自己需要来选择类型。注意选择用企业注册,尤其后两种类型不能用个人。

二、对申请的公众号认证,可以获取开放接口。每年认证费300元。

三、搞一个自己的公网主机,搭建web服务器,根据个人习惯的语言来定服务器类型,这里用的iis,ASP.NET。申请个域名并备案,使用云主机的情况下,这个需要的投入较早期降低很多,每年2000元就可以起步啦。

四、登录公众号后,在开发的基本配置中进行设置,需要指定服务器地址,本例http://....../index.aspx。对应的服务器端主要代码如下:

index.aspx

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="index.aspx.cs" Inherits="_Default" %>


index.aspx.cs

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Data.SqlClient;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
using System.Xml;
using System.Text;
using System.Net;
using TextDeal;
using EventDeal;


public partial class _Default : System.Web.UI.Page
{
    const string Token = "weixin"; //你的token,和服务器地址配置中一致即可
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
        string postStr = "";
        //Valid();                        //服务器配置时需要打开,验证通过后可删除此行代码
        if (Request.HttpMethod.ToLower() == "post")
        {
            Stream s = System.Web.HttpContext.Current.Request.InputStream;
            byte[] b = new byte[s.Length];
            s.Read(b, 0, (int)s.Length);
            postStr = Encoding.UTF8.GetString(b);
            if (!string.IsNullOrEmpty(postStr))
            {
                ResponseMsg(postStr);
            }
        }
    }
    ///


    /// 返回信息结果(微信信息返回)
    ///

    ///
    private void ResponseMsg(string weixinXML)
    {
       //回复消息的部分:你的代码写在这里
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(weixinXML);
        XmlNodeList list = doc.GetElementsByTagName("xml");
        XmlNode xn = list[0];
        string FromUserName = xn.SelectSingleNode("//FromUserName").InnerText;   //关注用户的加密后openid
        string ToUserName = xn.SelectSingleNode("//ToUserName").InnerText;       //公众微信号原始ID
        string MsgType=xn.SelectSingleNode("//MsgType").InnerText;
        if(MsgType == "text")
        {
            /*TextMessageDeal tmd=new TextMessageDeal();
            Response.Write(tmd.DealResult(weixinXML));*///实现不同关键词不同处理的类
            string strresponse = "";
            strresponse = strresponse + "";
            strresponse = strresponse + "";
            strresponse = strresponse + "" + DateTime.Now.Ticks.ToString() + "";
            strresponse = strresponse + "";
            strresponse = strresponse + "";
            strresponse = strresponse + "0";
            strresponse = strresponse + "
";
            Response.Write(strresponse);
            
        }
        else if(MsgType == "image")
        {
            //关注用户发送图片时的自动回复处理
        }
        else if(MsgType == "event")  
        {
            EventMessageDeal tmd=new EventMessageDeal();  //用户关注和取关等事件处理类,测试的可以去掉
            Response.Write(tmd.DealResult(weixinXML));
        }
       
     }


    ///
    /// 验证微信签名
    ///

    /// * 将token、timestamp、nonce三个参数进行字典序排序
    /// * 将三个参数字符串拼接成一个字符串进行sha1加密
    /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
    ///
    private bool CheckSignature()
    {
        string signature = Request.QueryString["signature"].ToString();
        string timestamp = Request.QueryString["timestamp"].ToString();
        string nonce = Request.QueryString["nonce"].ToString();
        string[] ArrTmp = { Token, timestamp, nonce };
        Array.Sort(ArrTmp);     //字典排序
        string tmpStr = string.Join("", ArrTmp);
        tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
        tmpStr = tmpStr.ToLower();
        if (tmpStr.Equals(signature))
        {
            return true;
        }
        else
        {
            return false;
        }
    }


    private void Valid()
    {
        string echoStr = Request.QueryString["echoStr"].ToString();
        if (CheckSignature())
        {
            if (!string.IsNullOrEmpty(echoStr))
            {
                Response.Write(echoStr);
                Response.End();
            }
        }
    }
}

至此,公众号开发的自动回复接口已经对接上啦,简单吧,并不是想象中那么难。

你可能感兴趣的:(C#与ASP.NET)