English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
دعنا نصل إلى النقطة،
وثيقة تطوير حسابات الجمهور العامة لـ WeChat، النسخة الرسمية (https://mp.weixin.qq.com/wiki)، صدقني، لم أعد قادرًا على الشكوى من الشخص الذي كتب هذه الوثيقة، أود حقًا أن أكسر لوحة المفاتيح، لكن بعد أن اكتشفت أن لوحة المفاتيح هي التي اشتريتها بنفسي، لقد شعرت بالحرج.
لا نكتب عن الهدر، دعنا ننتقل إلى كيفية التكوين وكيفية التطوير.
أولاً، يجب أن يكون لديك حساب منصة عامة، حسنًا، لنبدأ في حساب الهاوية.
الهاوية الأولىلا تعتقد أنك لا يمكنك تطوير الحسابات العامة، يمكنك طلب حساب اختباري، أكثر بكثير مما يقولون عن واجهات الحسابات المشتركة.
بعد الدخول إلى إدارة الخلفية، انقر على أدوات المطور، يمكنك رؤية حسابات الجمهور العامة للمنصة، يمكنك الدخول مباشرة. بدء ملء تكويناتك الخاصة.
لا تكن متأكدًا من أن هذا الجزء من الرسم هو جزء ضروري في البرنامج، إذا لم يتم تكوينه، فإن هذا النوع من الفشل هو حتمي.
الهاوية الثانيةبالطبع، ستكون هذه التكوينات غير ناجحة، لا تسألني لماذا. لا صورة، لا شيء يمكن قوله...
لا تعتقد أن الإمبراطور البطيء يلعب، هذا صحيح، يجب أن يكون الميناء 80، في الواقع، يمكنك نشر موقع باستخدام اسم النطاق فقط. لأن جميع مواقع الأسماء النطاق تأتي من ميناء 80، دعنا نعود إلى الموضوع الرئيسي.
يخبرنا الإمبراطور البطيء بأنه يجب استخدام حساب WeChat، يجب أن يكون لديك خادم، ثم تكوين الموقع الذي نشرناه، يرجى الانتباه، token هو الذي تم تعيينه، هذا ليس مولدًا تلقائيًا، يتم تعيينه بنفسك. URL هو اسم الموقع الذي نشرناه
الهاوية الثالثة،إذا لم يكن الموقع ينشر، فإن معلومات تكوين الواجهة لا يمكن تكوينها أبدًا، تذكر، هي أبدًا.
اسم النطاق الآمن لـ JS، يرجى الرجوع إلى الوثيقة (http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html).
يهدف اسم النطاق الآمن لـ JS إلى تنزيل الصور، استدعاء واجهات صور WeChat، إلخ، مثل عندما تحتاج إلى استدعاء الكاميرا أو تقديم صورة، في هذه الحالة، تحتاج إلى واجهة JS الآمنة، عن محتوى محدد، لا يتم التطرق إليه بشكل مفصل.
في خلفية إصدار التحقق من حسابات الجمهور في WeChat، هناك جدول إذن واجهة التجربة يجب تكوينه أيضًا. لا يعتبر تكوينه ضروريًا، بل يمكن لهذه الواجهة الحصول على معلومات جزئية للمستخدمين لـ WeChat. يجب التذكير بأن كل حساب جمهور له كل ID فريد، مما يعني أن، حتى إذا لم يتغير الشبكة الداخلية للموقع، إذا تم تغيير حساب الجمهور، فإن بيانات حساب الجمهور في هذا الوقت لا يمكن مشاركتها، بل هي فريدة نسبيًا.
الصعوبة الرابعة،}}عند طلب إذن الصفحة من واتساب، هذه معلومات المستخدم الأساسية للإذن، هذه ليست مشكلة، ولكن لا يوجد توجيه، هناك مشكلة.
لاحظ العنوان هنا،لا يحتوي على www، وبدون رأس معكوس في النهاية، أي أن صيغة إعادة التوجيه للعنوان هنا هي abc.com OK، تذكر هذه الصيغة، يجب أن تفعل ذلك بهذه الطريقة. حسناً، الخادم الآن، دعنا نبدأ بالكتابة بالكود.
دعنا نبدأ بالتحقق من الخادم أولاً. هذا موجود في الموقع الرسمي، ولكن هو مثال PHP، في الواقع، أولاً كل شيء هو التحقق من عدد عشوائي، ثم في حالة POST، نقوم بالتحقق من القيمة العائدة. دعنا نأتي بالكود مباشرة
public ActionResult Index() { if (Request.HttpMethod.ToLower() == "post") { if (CheckSignature())//تحقق مما إذا كان الخادم قد تم التحقق منه { GetMenuList();//تحميل القائمة } else { Response.Write("<h1>Oh</h1><h2>نحن نلتقي على المريخ!!!</h2>"); Response.End(); } } else { CheckWechat(); } return View(); } /// <summary> /// العودة إلى عدد عشوائي لتحديد نجاح التحقق /// </summary> private void CheckWechat() { if (string.IsNullOrEmpty(Request.QueryString["echoStr"])) { Response.Write("الرسالة ليست قادمة من واتساب"); Response.End(); } string echoStr = Request.QueryString["echoStr"]; if (CheckSignature()) { Response.Write(echoStr); Response.End(); } } /// <summary> /// التحقق من التوقيع من واتساب /// </summary> /// <returns></returns> /// قم بترتيب معرفات token، timestamp، nonce في ترتيب قاموسي /// قم بدمج سلاسل الثلاثة معرفات (token، timestamp، nonce) في سلسلة واحدة ثم أجري تشفيرها باستخدام sha1 /// المطور يمكنه الحصول على سلسلة النصوص المشفرة ومقارنةها مع signature لتحديد أن الطلب يأتي من واتساب. 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; } }
ثم، على منصة الجمهور، في حالة الحصول على الصلاحيات، يمكنك إنشاء قائمة القوائم المخصصة، ولكن بمجرد بدء إنشاء قائمة القوائم المخصصة، لا يمكن استخدام القائمة التي تم تعديلها يدويًا، مما يعني أنه إذا تمت مراجعة الخادم بنجاح، فإنه يجب استخدام الكود الخاص بك للتحكم.
نحن سنتحدث عن طريقة GetMenuList()، وهي بسيطة فعلاً، وهي فقط استخدام سلسلة JSON. ثم دعوة واجهة API لويكسن. public void GetMenuList()
<em id="__mceDel"> { string weixin1 = ""; weixin1 = @" { "button":[ { "type":"click", "name":"你好!" "key":"hello" }, { "type":"view", "name":"公司简介", "url":"http://www.xnfhtech.com" }, { "name":"产品介绍", "sub_button":[ { "type":"click", "name":"产品1", "key":"p1" }, { "type":"click", "name":"产品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发布成功 } /// <summary> /// Post/get 提交调用抓取 /// </summary> /// <param name="url">提交地址</param> /// <param name="param">参数</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 يمكنه إطلاق ذاكرة الذاكرة داخل block using { reqStream.Write(bt, 0, bt.Length); reqStream.Flush(); } try { using (WebResponse res = req.GetResponse()) { //يتم معالجة محتوى الصفحة المستلمة هنا 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، يتم إرجاع الخطأ } }
حسنًا، أنا أعترف أنني مستهلك غير مستنير، كيف يزيد access_token=IsExistAccess_Token();؟ لا تقلق، سأخبرك الطفل.
عندما نقرأ المستند، نجد أن Access_Token هنا ينتهي صلاحيته كل ساعتين. والطريقة هنا هي أن يتم الحصول عليه تلقائيًا عند انتهاء صلاحيته.
الخامس،هذه السلسلة من JSON، أي قائمة العرض، أتمنى أن يستخدم الجميع الصغرى، إذا كنت تستخدم الكبيرة، فـ، هه، هه، من القلب، إنه صعب للغاية، سيخبرك أنه ليس هناك رمز UTF8، ولكنك بالفعل مشفر، ولكن لا يزال هناك خطأ، لذا قم باستخدام الصغرى فقط، أوه
وما بعد إتمام ساعتين من الحصول التلقائي، سيكون من خلال MenuCreate (تطبيق واجهة خدمة قائمة 微信) للخروج. قم بكتابة الكود.
/// <summary> /// تقلب token كل مرة بطلب كل ساعتين /// </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> /\* بناءً على التاريخ الحالي، قم بتحديد ما إذا كان 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 وعرضها 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)); _youxrq.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 هذا، حسنًا، أنا في الواقع لا أريد أن أقول ذلك بصراحة، من الأفضل أن أقدم الكود مباشرة.
<?xml version="1.0" encoding="utf-8"?> <xml> <Access_Token>الحصول على TOKEN</Access_Token> <Access_YouXRQ>2015/9/12 17:56:31</Access_YouXRQ> </xml>
أنا متأكد أنك لا تريد أن تقول شيئًا عن هذا
حسنًا، أكلت البندقيات بلا صوت، شاهدتكم تتابعون، اليوم سأتوقف هنا، وسنواصل لاحقًا، خمس حفريات الآن، حزنت قلبي.
هذا هو نهاية محتوى هذا المقال، آمل أن يكون قد ساعدكم في التعلم، وأتمنى أن تدعموا دليل التدريب الشجاع.
بيان: محتوى هذا المقال تم جمعه من الإنترنت، حقوق النشر تخص المالك الأصلي، المحتوى تم إدراجه من قبل المستخدمين عبر الإنترنت بطرقهم الخاصة، هذا الموقع لا يملك حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل أي مسؤولية قانونية. إذا اكتشفت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.