1. 程式人生 > >微信公眾號開發——專案搭建

微信公眾號開發——專案搭建

一 

前往微信公眾平臺(https://mp.weixin.qq.com/)獲取開發許可權和開發賬號,公眾號分為好幾種,小程式,訂閱號,服務號,企業號,個人只能用訂閱號,許可權比較少(api介面許可權);

想要自定義模組功能或者是回覆資訊啥的,就得有一個自己的後臺來寫介面,所以要配置自己的伺服器

基本配置:伺服器配置(首頁-開發-基本配置-伺服器配置)

進入修改配置,這裡的伺服器地址必須是外網(沒有伺服器的小夥伴如果這裡分不清。。外網特徵就是別人可以通過你的本機ip直接訪問到,在簡單點就是,你如果使用WiFi連線的網路那就肯定是內網或者說是區域網,檢視方式,window鍵加R鍵,輸入cmd回車,然後輸入ipconfig 檢視你當前的ip,然後百度本機ip,不一樣的話就不是外網,解決辦法是使用natapp進行內網穿透或者是用路由器進行埠對映,將伺服器的某個埠映射出去,在最後會有詳細步驟)而且是80埠,格式為ip/域名+wx(介面名 ,固定,但是前面可以加路由比如ip/home/wx

)Token隨便寫個;

然後是後臺不多說先上程式碼:

/// <summary>
/// 配合微信伺服器驗證域名或者是ip的可用行或者是獲取訊息的推送--pxj
/// </summary>
[AtSkipAuthorize]
public void wx()
{
	//獲取訊息推送,或者是事件推送,型別是xml檔案流
	if (Request.RequestType == "POST")
	{

	}
	else
	{
		#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();
		}
		LogHelper.WriteLog("signature:" + signature + " timestamp:" + timestamp + " nonce:" + nonce + " echostr:" + echostr);
		#endregion
	}
}

寫好後臺配置好伺服器就可以在微信公眾號網站也就是剛才的那個頁面點選提交了,點選提交後微信的伺服器會向你所配置的伺服器80埠的這個介面傳送GET請求,驗證介面是否正確,如果提交成功,恭喜你可以進入下一個坑了;

當你在寫微信公眾號的頁面的時候,你有時候會用到上傳圖片或者開啟攝像機等要求,這時候要接入JS_SDK,配置簽名等等,這個簽名應該算是配置裡最難受的一塊了。。。

簽名的獲取有幾個步驟,先是要通過appid和appSecret來獲取access_token,然後用access_token來獲取jsapi_ticket,程式碼如下

 //獲取access_token
string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSecret);
var wc = new WebClient();
string access_tokenRet = wc.DownloadString(url);
string access_token = JsonHelper.JsonToObj<AccessTokenModel>(access_tokenRet).Access_Token;
accesstokenstatic = access_token;

//獲取jsapi_ticket
string Jsapi_TicketUrl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
var jsapiRet = wc.DownloadString(Jsapi_TicketUrl);
string ticket = JsonHelper.JsonToObj<TickModel>(jsapiRet).ticket;
ticketstatic = ticket;

然後獲取十位的時間戳和自己寫的隨機字串和頁面傳來的url,將jsapi_ticket,url,timestamp(時間戳),nocestr(隨機字串隨便寫一個就行)sort方法排序,然後根據這幾個的順序進行賦值並用sha1加密如下

string signaturestring = "jsapi_ticket=" + ticket + "&noncestr=" + nocestr + "&timestamp=" + timestamp + "&url=" + url2;
byte[] temp1 = Encoding.UTF8.GetBytes(signaturestring);

SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
byte[] temp2 = sha.ComputeHash(temp1);
var hashCode = BitConverter.ToString(temp2);
hashCode = hashCode.Replace("-", "").ToLower();

 如此一來全部的都有了,返回這些就行了,如果報錯了說url不合法就要取配置以下域名,二級域名也能用;

四 ,帶參二維碼的掃描和事件的推送

當你的公眾號涉及到分享二維碼給其他人,每一張二維碼上還得要有你的資訊的時候,需要在公眾號的二維碼上新增上一個場景值,比如你的使用者id,當客戶或者是其他使用者通過你分享的二維碼進入公眾號的時候,微信伺服器會推送給你一個xml包,其中一個子節點上就存著那個場景值;

直接上程式碼--獲取部分,

 public void GetQrCode()
 {
	 string accesstoken = accesstokenstatic;
	 if (string.IsNullOrEmpty(accesstoken))
	 {
		 //先主動取獲取以下所需要的變數
		 getaccesstoken(null, null);
		 accesstoken = accesstokenstatic;
		 Timer();
	 }
	//使用匿名物件作為post的引數然後再序列化
	 var datap = new
	 {
		 //二維碼的有效期(10天)
		 expire_seconds = 864000,
		 //型別動態的二維碼
		 action_name = "QR_SCENE",
		 //資訊
		 action_info = new
		 {
			 scene = new {
				 //自定義引數數值型為scene_id ,字元為scene_str
				 scene_id = 15552300793
			 }
		 }
	 };
	 //使用流傳送post帶參請求
	 string url = string.Format("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}",accesstoken);
	 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
	 request.Method = "POST";
	 request.ContentType = "application/json";
	 byte[] data = Encoding.UTF8.GetBytes(JsonHelper.ModelToJson(datap));
	 request.ContentLength = data.Length;
	 using (Stream strea = request.GetRequestStream())
	 {
		 strea.Write(data,0,data.Length);
		 strea.Close();
	 }
	 HttpWebResponse respose = (HttpWebResponse)request.GetResponse();
	 Stream stream = respose.GetResponseStream();
	 string stringRespose = "";
	 using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
	 {
		 stringRespose = sr.ReadToEnd();
	 }
	 if (string.IsNullOrEmpty(stringRespose))
	 {
		 Response.Write("sorry");
	 }
	 else { 
		 //此時已經獲取到二維碼所使用的ticket
		 string qrticket = JsonHelper.JsonToObj<QrCoderTicektModel>(stringRespose).ticket; 
		 //二維碼解析後的地址(可以自己轉化為二維碼)
		 string qrurl =  JsonHelper.JsonToObj<QrCoderTicektModel>(stringRespose).url; 
		 Response.Write("hhhhhh");
		 LogHelper.WriteLog("getsometing:" + stringRespose);
	 }
 }

現在是獲得了二維碼的解析後的url,和獲取二維碼的ticket;有兩種方式可以得到二維碼,一種是直接將這個地址url返給前端,前端自己生成,二是後臺獲取到這個二維碼後儲存到伺服器,前端自己去取;

獲取微信的推送,如剛才所說,掃碼的時候會發送一個xml包;

程式碼如下

public void wx()
{
	//獲取訊息推送,或者是事件推送,型別是xml檔案流
	if (Request.RequestType == "POST")
	{
		#region 推送
		//載入xml包,獲取推送的內容
		StreamReader sr = new StreamReader(Request.InputStream);
		string xmlData = sr.ReadToEnd();
		LogHelper.WriteLog(xmlData);
		var doc = new XmlDocument();
		doc.LoadXml(xmlData);
		//獲取xml包裡的訊息型別和事件型別,分類處理
		var msgTypeNode = doc.SelectSingleNode("xml/MsgType");
		var evenTypeNode = doc.SelectSingleNode("xml/Event");
		string msgTypeString = msgTypeNode.InnerText;
		if (evenTypeNode == null)
		{
			//此時為普通的訊息推送
		}
		else
		{
			//此時為事件推送
			string evenTypeString = evenTypeNode.InnerText;
			//掃描帶參的二維碼的時候和關注和取關的推送
			if (evenTypeString == "SCAN" || evenTypeString == "subscribe")
			{
				string SaoMaRenOpenId = doc.SelectSingleNode("xml/FromUserName").InnerText;
				var BeiSaoRenCanShuNode = doc.SelectSingleNode("xml/EventKey");
				if (BeiSaoRenCanShuNode != null)
				{
					string BeiSaoRenCanShuSting = BeiSaoRenCanShuNode.InnerText.Split('_')[1];
					//已經獲取掃碼人和被掃人的個人id,下面就是存到資料庫做關聯就ok了,用到的時候取
				}
			}

			//地理位置推送
			if (evenTypeString == "LOCATION")
			{

			}

			//點選自定義選單拉去資訊的時候的推送
			if (evenTypeString == "CLICK")
			{

			}
		}
		#endregion
	}

五,

natapp內網穿透:

https://natapp.cn/註冊,登入,獲取自己的隧道,下載客戶端,解壓,cmd進入客戶端的資料夾,natapp.exe -authtoken = "你的autotoken",

如下則成功了