這篇文章主要介紹了php微信公眾賬號(hào)開發(fā)之前的坑有哪些,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)、重慶服務(wù)器托管解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球數(shù)千家企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。第一坑,不要以為不是企業(yè)號(hào)就不能開發(fā)了,可以申請(qǐng)測(cè)試號(hào)的,比所謂的訂閱號(hào)接口多多了。
進(jìn)入后臺(tái)管理之后,點(diǎn)擊開發(fā)者工具,可以看到公眾平臺(tái)測(cè)試賬號(hào),直接進(jìn)入即可。開始填寫自己的配置。
注意涂鴉部分,這部分是程序中必須要配置的東東,如果沒(méi)有配置的話,這是一定不成功的。
第二坑,當(dāng)然,你這么配置也一定是不成功的,不要問(wèn)我為什么。沒(méi)圖說(shuō)個(gè)幾把。。。
請(qǐng)不要認(rèn)為企鵝帝鬧著玩,這是真的,必須是80端口,其實(shí)也就發(fā)布一個(gè)域名的網(wǎng)站即可。因?yàn)橛蛎木W(wǎng)站都是80端口出來(lái)的,繼續(xù)說(shuō)正題。
企鵝帝告訴我們,要用微信賬號(hào),必須有一臺(tái)服務(wù)器,然后配置我們發(fā)布的網(wǎng)站就行了,請(qǐng)注意,token是自己設(shè)定的,這個(gè)不是自動(dòng)生成的,自己設(shè)定。。URL就是我們發(fā)布的網(wǎng)站名稱
第三坑,網(wǎng)站不發(fā)布,接口配置信息是永遠(yuǎn)配置不過(guò)去的,記住,是永遠(yuǎn)。
JS接口安全域名,這個(gè)請(qǐng)直接參考文檔(http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html)。
JS接口安全域名的目的是為了下載圖片,調(diào)用微信圖片接口等等,比如當(dāng)你需要調(diào)用攝像頭的時(shí)候,或者說(shuō)說(shuō)需要上傳照片的時(shí)候,這時(shí)候就需要JS安全接口了,關(guān)于具體的內(nèi)容暫不做詳細(xì)描述。
在微信公眾賬號(hào)測(cè)試號(hào)的版本后臺(tái)中,有一個(gè)體驗(yàn)接口權(quán)限表里面的這一項(xiàng)也是必須配置的。也不算是必須配置,而是這個(gè)接口可以獲取到微信用戶的部分信息。值得提醒的是每個(gè)公眾賬號(hào)對(duì)應(yīng)的每個(gè)ID是的,也就是說(shuō),即便網(wǎng)站內(nèi)網(wǎng)不變,如果換了公眾號(hào),那么,這時(shí)候的微信公眾號(hào)的數(shù)據(jù)是不能共通的,只是相對(duì)公共號(hào)。
第四坑,申請(qǐng)微信網(wǎng)頁(yè)授權(quán)的時(shí)候,這里的網(wǎng)頁(yè)授權(quán)用戶基本信息,這個(gè)本身沒(méi)問(wèn)題,但是沒(méi)有提示就有問(wèn)題了。
這里的網(wǎng)址,請(qǐng)注意,一定是不含www的,而且后面沒(méi)有反斜杠,也就是說(shuō)這里的網(wǎng)址的回調(diào)格式是 abc.com OK,請(qǐng)記住這個(gè)格式,必須這么干。好了,服務(wù)器暫且這樣,暫開始用代碼說(shuō)話。
首先從服務(wù)器驗(yàn)證說(shuō)起。這個(gè)在官網(wǎng)是有例子的,不過(guò)是PHP的,其實(shí)說(shuō)白了首先就是驗(yàn)證一個(gè)隨機(jī)數(shù),然后在POST的情況下,檢測(cè)返回值即可。直接上代碼
public ActionResult Index() { if (Request.HttpMethod.ToLower() == "post") { if (CheckSignature())//驗(yàn)證服務(wù)器是否通過(guò) { GetMenuList();//加載菜單 } else { Response.Write("<h2>Oh</h2><h3>我們相遇在火星吧!?。?lt;/h3>"); Response.End(); } } else { CheckWechat(); } return View(); } /// <summary> /// 返回隨機(jī)數(shù)表示驗(yàn)證成功 /// </summary> private void CheckWechat() { if (string.IsNullOrEmpty(Request.QueryString["echoStr"])) { Response.Write("消息并非來(lái)自微信"); Response.End(); } string echoStr = Request.QueryString["echoStr"]; if (CheckSignature()) { Response.Write(echoStr); Response.End(); } } /// <summary> /// 驗(yàn)證微信簽名 /// </summary> /// <returns></returns> /// 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序 /// 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密 /// 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信。 private bool CheckSignature() { string signature = Convert.ToString(Request["signature"]); string timestamp = Convert.ToString(Request["timestamp"]); string nonce = Convert.ToString(Request["nonce"]); string[] ArrTmp = { Token, timestamp, nonce }; Array.Sort(ArrTmp); //字典排序 string tmpStr = string.Join("", ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"); tmpStr = tmpStr.ToLower(); if (tmpStr == signature) { return true; } else { return false; } }
然后,公眾平臺(tái)在有權(quán)限的情況下是自定義菜單的,但是一旦開始自定義菜單,原來(lái)的手動(dòng)編輯的菜單是不能用的,也就是說(shuō),如果服務(wù)器驗(yàn)證通過(guò),那么必須用自己的代碼控制。
我們一起來(lái)看GetMenuList()這個(gè)方法,這個(gè)其實(shí)很簡(jiǎn)單的,就是隨便憑借一個(gè)JSON格式字符串。然后調(diào)用微信的接口即可。 public void GetMenuList()
<em id="__mceDel"> { string weixin1 = ""; weixin1 = @" { ""button"":[ { ""type"":""click"", ""name"":""你好!"", ""key"":""hello"" }, { ""type"":""view"", ""name"":""公司簡(jiǎn)介"", ""url"":""http://www.xnfhtech.com"" }, { ""name"":""產(chǎn)品介紹"", ""sub_button"":[ { ""type"":""click"", ""name"":""產(chǎn)品1"", ""key"":""p1"" }, { ""type"":""click"", ""name"":""產(chǎn)品2"", ""key"":""p2"" }] }] }"; string access_token = Tools.WA_GetAccess_Token.IsExistAccess_Token(); string i = this.MenuCreate(menu, access_token); Response.Write(i); }<br><br> </em>
public string MenuCreate(string MenuJson, string access_token) { JavaScriptSerializer Jss = new JavaScriptSerializer(); string setMenuUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}"; setMenuUrl = string.Format(setMenuUrl, access_token);//獲取token、拼湊url string respText = WebRequestPostOrGet(setMenuUrl, MenuJson); Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(respText); return respDic["errcode"].ToString();//返回0發(fā)布成功 } /// <summary> /// Post/get 提交調(diào)用抓取 /// </summary> /// <param name="url">提交地址</param> /// <param name="param">參數(shù)</param> /// <returns>string</returns> public string WebRequestPostOrGet(string sUrl, string sParam) { byte[] bt = System.Text.Encoding.UTF8.GetBytes(sParam); Uri uriurl = new Uri(sUrl); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uriurl);//HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + (url.IndexOf("?") > -1 ? "" : "?") + param); req.Method = "Post"; req.Timeout = 120 * 1000; req.ContentType = "application/x-www-form-urlencoded;"; req.ContentLength = bt.Length; using (Stream reqStream = req.GetRequestStream())//using 使用可以釋放using段內(nèi)的內(nèi)存 { reqStream.Write(bt, 0, bt.Length); reqStream.Flush(); } try { using (WebResponse res = req.GetResponse()) { //在這里對(duì)接收到的頁(yè)面內(nèi)容進(jìn)行處理 Stream resStream = res.GetResponseStream(); StreamReader resStreamReader = new StreamReader(resStream, System.Text.Encoding.UTF8); string resLine; System.Text.StringBuilder resStringBuilder = new System.Text.StringBuilder(); while ((resLine = resStreamReader.ReadLine()) != null) { resStringBuilder.Append(resLine + System.Environment.NewLine); } resStream.Close(); resStreamReader.Close(); return resStringBuilder.ToString(); } } catch (Exception ex) { return ex.Message;//url錯(cuò)誤時(shí)候回報(bào)錯(cuò) } }
好吧,我承認(rèn)我是一個(gè)不明真相的吃貨,怎么又多了一個(gè)access_token=IsExistAccess_Token();呢,莫著急,寶寶告訴你。
當(dāng)我們閱讀文檔的時(shí)候,我們會(huì)發(fā)現(xiàn),這里的Access_Token是每?jī)蓚€(gè)小時(shí)就過(guò)期的。這里的方法就是讓他過(guò)期的時(shí)候自動(dòng)獲取。
第五坑,這里的JSON字符串,也就是要展示的菜單,我希望大家都用小寫,如果用了大寫,那么,呵呵,哈哈了真心的,很操蛋的,他會(huì)告訴你沒(méi)有用UTF8編碼,但是你真心是編碼過(guò)的,可惜還是出錯(cuò),所以,還是小寫吧,唉
繼續(xù)說(shuō)兩個(gè)小時(shí)自動(dòng)獲取之后,就是通過(guò)MenuCreate(調(diào)用微信菜單接口)輸出即可。上代碼。
/// <summary> /// 防止每次請(qǐng)求的token兩個(gè)小時(shí)的變化 /// </summary> public class WA_GetAccess_Token { public WA_GetAccess_Token() { } public static WAEntity.Access_token GetAccess_Token() { string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ ConfigurationManager.AppSettings["AppID"] + "&secret="+ ConfigurationManager.AppSettings["AppSecret"]; Access_token entity = new Access_token(); try { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); req.Method = "GET"; using (WebResponse wr = req.GetResponse()) { HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse(); StreamReader reader = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8); string content = reader.ReadToEnd(); Access_token token = new Access_token(); token = JsonHelper.ParseFromJson<Access_token>(content); entity.access_token = token.access_token; entity.expires_in = token.expires_in; } } catch{ //記錄日志} return entity; } /// <summary> /// 根據(jù)當(dāng)前日期 判斷Access_Token 是否超期 如果超期返回新的Access_Token 否則返回之前的Access_Token /// </summary> /// <param name="datetime"></param> /// <returns></returns> public static string IsExistAccess_Token() { try { string Token = string.Empty; DateTime YouXRQ; //讀取XML文件中的數(shù)據(jù),并顯示出來(lái) string filepath = HttpContext.Current.Request.MapPath("~/XMLFile.xml"); StreamReader str = new StreamReader(filepath, System.Text.Encoding.UTF8); XmlDocument xml = new XmlDocument(); xml.Load(str); str.Close(); str.Dispose(); Token = xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText; YouXRQ = Convert.ToDateTime(xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText); if (DateTime.Now > YouXRQ) { DateTime _youxrq = DateTime.Now; WAEntity.Access_token mode = GetAccess_Token(); xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText = mode.access_token; _youxrq = _youxrq.AddSeconds(Convert.ToInt32(mode.expires_in)); xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText = _youxrq.ToString(); xml.Save(filepath); Token = mode.access_token; } return Token; } catch (Exception ex) { return "";//記錄日志 } } } public class Access_token { public Access_token() { } public string access_token { get; set; } public string expires_in { get; set; } } public class JsonHelper { /// <summary> /// 生成Json格式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static string GetJson<T>(T obj) { DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType()); using (MemoryStream stream = new MemoryStream()) { json.WriteObject(stream, obj); string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson; } } /// <summary> /// 獲取Json的Model /// </summary> /// <typeparam name="T"></typeparam> /// <param name="szJson"></param> /// <returns></returns> public static T ParseFromJson<T>(string szJson) { T obj = Activator.CreateInstance<T>(); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); return (T)serializer.ReadObject(ms); } } }
原諒我又不明真相了,所謂的XMLFile.xml這又是什么鬼,好吧,我其實(shí)不想說(shuō)的這么直白的,還是代碼直接上比較好。
<?xml version="1.0" encoding="utf-8"?> <xml> <Access_Token>獲取TOKEN</Access_Token> <Access_YouXRQ>2015/9/12 17:56:31</Access_YouXRQ> </xml>
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“php微信公眾賬號(hào)開發(fā)之前的坑有哪些”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
網(wǎng)頁(yè)標(biāo)題:php微信公眾賬號(hào)開發(fā)之前的坑有哪些-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://aaarwkj.com/article0/dpggoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、動(dòng)態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站策劃、ChatGPT、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容