關於C#的微信開發的入門記錄一


  在之前老是看到一些微信開發的例子,但是作為初學者會有很多問題,之前我也找了很多帖子,但是最終也沒能解決,現在剛好手里有一個項目,總結一下分享給准備做卻動不了手的朋友們,本文只是以我個人的經驗作為淺談(大學生),不足之處還望大家不吝賜教!

  在開發之前我們需要有三樣東西,接下來將一一介紹三樣東西的准備:

  首先,需要申請一個公眾平台賬號;

  其次,需要一個域名空間,也就是在網絡上得一塊空間;

  再次,還需要一個網站;

  一:微信公眾平台賬號,怎樣注冊網上有很詳細的教程,請移步查看

  然后問題來了,請仔細查看下圖(為了方便解說,圖片經過處理):

這里就要講到URL和token了,根據官方的活動日期為准,這里推薦一下萬網和阿里雲合作推出的兩年免費雲主機和虛擬域名,對,沒錯就是我們需要的東西,我也不是在打廣告,畢竟學生黨,經費比較拮據,能用免費的盡量用不,扯遠了,活動地址為:http://www.net.cn/hosting/free/,按照要求去做就可以了,很簡單的,也不多說,不過需要注意的是:免費版不提供電話服務,如自開通后連續60天內,未進行備案、域名綁定及解析,該虛機將被收回並刪除。這個比較坑爹,畢竟天下沒有免費的午餐,還是買個域名吧,也就20多一點(最便宜的);

又到了關鍵地方了:

上面的那個域名是我自己買的,下面的你們也看到了,虛擬主機贈送的免費版,不過也可以用;

好了,准備工作要收尾了,現在就是代碼的事情了;

首先:

在開發者首次提交驗證申請時,微信服務器將發送GET請求到填寫的URL上,並且帶上四個參數(signature、timestamp、nonce、echostr),開發者通過對簽名(即signature)的效驗,來判斷此條消息的真實性。

此后,每次開發者接收用戶消息的時候,微信也都會帶上前面三個參數(signature、timestamp、nonce)訪問開發者設置的URL,開發者依然通過對簽名的效驗判斷此條消息的真實性。效驗方式與首次提交驗證申請一致。

參數 描述
signature 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
timestamp 時間戳
nonce 隨機數
echostr 隨機字符串

開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗。

加密/校驗流程如下:
1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信

所以:
<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;
using System.Web.Security;
using System.IO;
using System.Xml;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;


public class Handler : IHttpHandler
{
    //private static string msg;
    private static string xmlMsg;
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        if (context.Request.HttpMethod.ToLower().Equals("get"))
        {
            //開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。
            //若確認此次GET請求來自微信服務器,請原樣返回echostr參數內
            //容,則接入生效,成為開發者成功,否則接入失敗。 
            //context.Response.Write(msg);
            ValidateUrl();
            //用於微信接口的URL校驗
        }
        else
        {
            //接收並響應
            HandleMsg();
        }
    }

    private void HandleMsg()
    {
        //接收
        /*
         *  ToUserName     開發者微信號
            FromUserName     發送方帳號(一個OpenID)
            CreateTime     消息創建時間 (整型)
            MsgType     text
            Content     文本消息內容
            MsgId     消息id,64位整型 
        */
        HttpContext context = HttpContext.Current;
        //接收XML數據包
        Stream XmlStream = context.Request.InputStream;
        //構造xml對象
        XmlDocument doc = new XmlDocument();
        doc.Load(XmlStream);
        XmlElement rootElement = doc.DocumentElement;//獲取根節點

        //解析XML數據
        string toUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
        string fromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
        string msgType = rootElement.SelectSingleNode("MsgType").InnerText;
        //消息內容區分  這里是文本,為text
        string content = rootElement.SelectSingleNode("Content").InnerText;
        //msg = string.Format("{0}-{1}-{2}-{3}", toUserName, fromUserName, msgType, content);//測試
        //響應
        /*
         *   <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>
         */

        if (content.Contains("BD") || content.Contains("bd"))
        //content.Contains返回一個值,該值指示指定的system.string對象是否存在於此字符串中
        {
            string[] sArray = content.Split('+');
            string name = sArray[2];
            string no = sArray[1];
            string str = "您的信息為:" + "姓名:" + name + "學號:" + no;
            //SelectStudentInfo();
            
            xmlMsg = "<xml>" + "<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>"
                       + "<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>"
                       + "<CreateTime>" + GetCreateTime() + "</CreateTime>"
                       + "<MsgType><![CDATA[text]]></MsgType>"
                       + "<Content><![CDATA["+str+"]]></Content>"
                       + "</xml>";
        }
        else
        {
            string qita = "您現在還未進行綁定,請先回復【BD+學號+姓名】先進行綁定!";
            xmlMsg = "<xml>" + "<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>"
                       + "<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>"
                       + "<CreateTime>" + GetCreateTime() + "</CreateTime>"
                       + "<MsgType><![CDATA[text]]></MsgType>"
                       + "<Content><![CDATA[" + qita + "]]></Content>"
                       + "</xml>";
        }

        context.Response.Write(xmlMsg);
    }

    //private string SelectStudentInfo()
    //{
        
    //}

    private int GetCreateTime()//創建時間戳
    {
        DateTime dateStart=new DateTime(1970,1,1,8,0,0);//格林威治時間1970,1,1,0,0,0
        return (int) (DateTime.Now - dateStart).TotalSeconds;
    }
    
    
    private void ValidateUrl()
    {
        /*
         *  signature     微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
            timestamp     時間戳
            nonce         隨機數
            echostr     隨機字符串 
         */
        HttpContext context = HttpContext.Current;
        //獲取上下文對象
        string signature = context.Request["signature"];
        string timestamp = context.Request["timestamp"];
        string nonce = context.Request["nonce"];
        string echostr = context.Request["echostr"];

        string token = "123456";
        //自定義token
        //加密/校驗流程如下:

        string[] temp1 = { token, timestamp, nonce };
        //1. 將token、timestamp、nonce三個參數進行字典序排序
        Array.Sort(temp1);//排序
        //2. 將三個參數字符串拼接成一個字符串進行sha1加密
        string temp2 = string.Join("", temp1);
        string temp3 = FormsAuthentication.HashPasswordForStoringInConfigFile(temp2, "SHA1");

        //3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信
        //SHA1有大小寫區別,先轉成小寫再對比
        if (temp3.ToLower().Equals(signature))
        {
            context.Response.Write(echostr);
            //如果相同就返回微信服務器要求的signature,不相同就沒有必要處理
        }
    }
    


    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

主要是要參見開發者文檔

好了,剩下的就是發布到服務器上就好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM