亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

.NET微信公眾號開發-6.0模板消息

2019-11-14 15:55:41
字體:
來源:轉載
供稿:網友

一.前言

    為了保證用戶不受到騷擾,在開發者出現需要主動提醒、通知用戶時,才允許開發者在公眾平臺網站中模板消息庫中選擇模板,選擇后獲得模板ID,再根據模板ID向用戶主動推送提醒、通知消息。這個意思也就是,我們作為微信商戶,不能主動的給用戶推送消息,如果這個功能完全開放,那么用戶有可能會受到大量的垃圾信息,為了做一個很好的控制,微信那邊給我們開放了一個模板消息,通過模板消息我們可以友好的給用戶發送一些相關的消息提醒。

二.開發前的準備

 1.0模板消息官方文檔地址

 2.0查看我們的模板消息是否申請成功。申請成功后你可以看到如下圖片:

三.開始編碼

 一般我們在客戶支付成功訂單以后,會有一個支付的跳轉頁面,在我們前面的代碼中也有相應的頁面,代碼如下:

<script type="text/javascript">               //調用微信JS api 支付               function jsApiCall()               {                   WeixinJSBridge.invoke(                   'getBrandWCPayRequest',                   <%=wxJsApiParam%>,//josn串                    function (res)                    {                      if (res.err_msg == "get_brand_wcpay_request:ok")                       {                           var OrderId=$("#OrderId").val();                           var orderPRoductName=$("#orderProductName").val();                           var orderMoneySum=$("#orderMoneySum").val();                            window.location.href="http://www.baidu.com/PaySkip.aspx?OrderId="+OrderId+"&orderMoneySum="+orderMoneySum+"&orderProductName="+orderProductName;//支付成功后的跳轉頁面                        }else                        {                          WeixinJSBridge.call('closeWindow');                        }                                              }                    );               }               function callpay()               {                   if (typeof WeixinJSBridge == "undefined")                   {                       if (document.addEventListener)                       {                           document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);                       }                       else if (document.attachEvent)                       {                           document.attachEvent('WeixinJSBridgeReady', jsApiCall);                           document.attachEvent('onWeixinJSBridgeReady', jsApiCall);                       }                   }                   else                   {                       jsApiCall();                   }               }                          </script>

    在上一篇,微信支付成功后,我們有這樣一個支付跳轉頁面,在這個支付跳轉頁面里,我們可以寫一些我們自己的業務邏輯,比如我們今天的主角,模板消息提醒:直接上代碼

                    #region 發送支付成功的消息                    ErrorMessage errorMessage;                    string username = System.Configuration.ConfigurationManager.AppSettings["weixinid"].ToString();                    string templateId = System.Configuration.ConfigurationManager.AppSettings["templateId"].ToString();                    string first = "您已成功付費,歡迎下次光臨。";                    string orderMoneySum = Request["orderMoneySum"] ?? "0";                    string orderProductName = Request["orderProductName"] ?? "有位停車付費系統測試";                    string Remark = "如有問題請致電400-6238-136或直接在微信留言,我們將第一時間為您服務!";                    Color color = Color.Red;                    Tuple<string, string, Color>[] data = new Tuple<string, string, Color>[]{                    new Tuple<string,string,Color>("first",first,Color.Blue),                    new Tuple<string,string,Color>("orderMoneySum",orderMoneySum,Color.Red),                    new Tuple<string,string,Color>("orderProductName",orderProductName,Color.Orange),                    new Tuple<string,string,Color>("Remark",Remark,Color.Green)                };                    long msgId = TemplateMessage.Send(username, openId, templateId, "", color, data, out errorMessage);                    if (errorMessage.IsSuccess)                    {                        Response.Write("errorMessage " + errorMessage.errmsg + "<br/>");                    }                    else                    {                        Response.Write("errorMessage.errmsg: " + errorMessage.errmsg + "<br/>");                    }                    #endregion

從上面的代碼中我們可以看到TemplateMessage.Send()這個方法是我們發送消息的關鍵,我們來看看這個方法是怎樣的:

        #region 發送模板消息        /// <summary>        /// 發送模板消息        /// </summary>        /// <param name="userName">公眾號</param>        /// <param name="touser">接收消息的賬號</param>        /// <param name="templateId">模板id</param>        /// <param name="detailUrl">詳情地址</param>        /// <param name="topColor">頂端顏色</param>        /// <param name="data">數據</param>        /// <param name="errorMessage">返回發送是否成功</param>        /// <returns>返回消息id;如果發送失敗,返回-1。</returns>        public static long Send(string userName, string touser, string templateId, string detailUrl, Color topColor,            Tuple<string, string, Color>[] data, out ErrorMessage errorMessage)        {            errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "");            long id = -1;            //校驗參數            if (string.IsNullOrWhiteSpace(touser))            {                errorMessage.errmsg = "接收消息的賬號不能為空。";                return id;            }            if (string.IsNullOrWhiteSpace(templateId))            {                errorMessage.errmsg = "模板id不能為空。";                return id;            }            if (data == null || data.Length == 0)            {                errorMessage.errmsg = "模板數據不能為空。";                return id;            }            foreach (Tuple<string, string, Color> item in data)            {                if (string.IsNullOrWhiteSpace(item.Item1) || string.IsNullOrWhiteSpace(item.Item2))                {                    errorMessage.errmsg = "模板數據不能為空。";                    return id;                }            }            //獲取許可令牌            accessToken token = AccessToken.Get(userName);            if (token == null)            {                errorMessage.errmsg = "獲取許可令牌失敗。";                return id;            }            string url = string.Format(urlForSending, token.access_token);            //生成待發送的數據            dynamic postData = new ExpandoObject();            postData.touser = touser;            postData.template_id = templateId;            postData.url = detailUrl ?? string.Empty;            postData.topcolor = Utility.GetColorString(topColor);            postData.data = new ExpandoObject();            IDictionary<string, object> dataDict = (IDictionary<string, object>)postData.data;            foreach (Tuple<string, string, Color> item in data)            {                dataDict.Add(item.Item1, new { value = item.Item2, color = Utility.GetColorString(item.Item3) });            }            string json = JsonConvert.SerializeObject(postData);            //發送數據            string responseContent;            if (!HttpHelper.Request(url, out responseContent, httpMethod, json))            {                errorMessage.errmsg = "提交數據到微信服務器失敗。";                return id;            }            //解析結果            JObject jo = JObject.Parse(responseContent);            JToken jt;            if (jo.TryGetValue("errcode", out jt) && jo.TryGetValue("errmsg", out jt))            {                errorMessage.errcode = (int)jo["errcode"];                errorMessage.errmsg = (string)jo["errmsg"];                if (jo.TryGetValue("msgid", out jt))                    id = (long)jt;            }            else                errorMessage.errmsg = "解析返回結果失敗。";            return id;        }         #endregion
 AccessToken token = AccessToken.Get(userName);獲取許可令牌上一篇文章中我們已經說過這個類,這里就不多說了,HttpHelper幫助類的代碼如下:
   /// <summary>    /// HttpHelper:http請求與響應輔助類    /// </summary>    public static class HttpHelper    {        /// <summary>        /// 向微信服務器發送請求時的編碼        /// </summary>        public static readonly Encoding RequestEncoding = Encoding.UTF8;        /// <summary>        /// 微信服務器響應的編碼        /// </summary>        public static readonly Encoding ResponseEncoding = Encoding.UTF8;        /// <summary>        /// 向微信服務器提交數據,并獲取微信服務器響應的數據        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="responseData">返回響應數據</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, out byte[] responseData,            string httpMethod = WebRequestMethods.Http.Get, byte[] data = null)        {            bool success = false;            responseData = null;            Stream requestStream = null;            HttpWebResponse response = null;            Stream responseStream = null;            MemoryStream ms = null;            try            {                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);                request.Method = httpMethod;                if (data != null && data.Length > 0)                {                    request.ContentLength = data.Length;                    requestStream = request.GetRequestStream();                    requestStream.Write(data, 0, data.Length);                }                response = (HttpWebResponse)request.GetResponse();                //由于微信服務器的響應有時沒有正確設置ContentLength,這里不檢查ContentLength                //if (response.ContentLength > 0)                {                    ms = new MemoryStream();                    responseStream = response.GetResponseStream();                    int bufferLength = 2048;                    byte[] buffer = new byte[bufferLength];                    int size = responseStream.Read(buffer, 0, bufferLength);                    while (size > 0)                    {                        ms.Write(buffer, 0, size);                        size = responseStream.Read(buffer, 0, bufferLength);                    }                    responseData = ms.ToArray();                }                success = true;            }            finally            {                if (requestStream != null)                    requestStream.Close();                if (responseStream != null)                    responseStream.Close();                if (ms != null)                    ms.Close();                if (response != null)                    response.Close();            }            return success;        }        /// <summary>        /// 向微信服務器提交數據,并獲取微信服務器響應的數據        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="responseData">返回響應數據</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, out byte[] responseData,            string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            byte[] bytes = string.IsNullOrEmpty(data) ? null : RequestEncoding.GetBytes(data);            return Request(url, out responseData, httpMethod, (byte[])bytes);        }        /// <summary>        /// 向微信服務器提交數據,并獲取微信服務器響應的內容        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="responseContent">返回響應內容</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, out string responseContent,            string httpMethod = WebRequestMethods.Http.Get, byte[] data = null)        {            byte[] responseData;            responseContent = string.Empty;            bool success = Request(url, out responseData, httpMethod, data);            if (success && responseData != null && responseData.Length > 0)                responseContent = ResponseEncoding.GetString(responseData);            return success;        }        /// <summary>        /// 向微信服務器提交數據,并獲取微信服務器響應的內容        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="responseContent">返回響應內容</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, out string responseContent,            string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            byte[] bytes = string.IsNullOrEmpty(data) ? null : RequestEncoding.GetBytes(data);            return Request(url, out responseContent, httpMethod, (byte[])bytes);        }        /// <summary>        /// 向微信服務器提交數據        /// </summary>        /// <param name="url">服務器地址</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, string httpMethod = WebRequestMethods.Http.Get, byte[] data = null)        {            bool success = false;            Stream requestStream = null;            HttpWebResponse response = null;            try            {                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);                request.Method = httpMethod;                if (data != null && data.Length > 0)                {                    request.ContentLength = data.Length;                    requestStream = request.GetRequestStream();                    requestStream.Write(data, 0, data.Length);                }                response = (HttpWebResponse)request.GetResponse();                success = true;            }            finally            {                if (requestStream != null)                    requestStream.Close();                if (response != null)                    response.Close();            }            return success;        }        /// <summary>        /// 組合url,發送數據,然后返回響應字符串        /// </summary>        /// <param name="urlFormat">url格式字符串,第一個參數為userName獲取到的許可令牌,然后依次為parameters中的參數</param>        /// <param name="userName">公眾號</param>        /// <param name="urlParameters">參數</param>        /// <param name="httpMethod">執行請求的http方法</param>        /// <param name="data">請求的內容</param>        /// <returns>返回響應內容;如果請求失敗,或者發生錯誤,返回空字符串</returns>        public static string RequestResponseContent(string urlFormat, string userName, IEnumerable<object> urlParameters = null, string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            string responseContent = string.Empty;            AccessToken token = AccessToken.Get(userName);            if (token == null)                return responseContent;            string url;            if (urlParameters == null)                url = string.Format(urlFormat, token.access_token);            else            {                List<object> paramList = new List<object>(urlParameters);                paramList.Insert(0, token.access_token);                url = string.Format(urlFormat, paramList.ToArray());            }            HttpHelper.Request(url, out responseContent, httpMethod, (string)data);            return responseContent;        }        /// <summary>        /// 組合url,發送數據,然后返回響應的錯誤消息。        /// 注:錯誤消息不一定代表失敗或者錯誤。        /// </summary>        /// <param name="urlFormat">url格式字符串,第一個參數為userName獲取到的許可令牌,然后依次為parameters中的參數</param>        /// <param name="userName">公眾號</param>        /// <param name="urlParameters">參數</param>        /// <param name="httpMethod">執行請求的http方法</param>        /// <param name="data">請求的內容</param>        /// <returns>返回響應的錯誤消息</returns>        public static ErrorMessage RequestErrorMessage(string urlFormat, string userName, IEnumerable<object> urlParameters = null, string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            string responseContent = RequestResponseContent(urlFormat, userName, urlParameters, httpMethod, data);            if (string.IsNullOrWhiteSpace(responseContent))                return new ErrorMessage(ErrorMessage.ExceptionCode, "請求失敗。");            else if (ErrorMessage.IsErrorMessage(responseContent))                return ErrorMessage.Parse(responseContent);            else                return new ErrorMessage(ErrorMessage.ExceptionCode, "解析響應失敗。");        }        /// <summary>        /// 組合url,發送數據,然后返回結果。        /// 注:結果為需要解析的類。        /// </summary>        /// <typeparam name="T">返回結果的類型</typeparam>        /// <param name="urlFormat">url格式字符串,第一個參數為userName獲取到的許可令牌,然后依次為parameters中的參數</param>        /// <param name="userName">公眾號</param>        /// <param name="errorMessage">返回請求是否成功</param>        /// <param name="urlParameters">參數</param>        /// <param name="httpMethod">執行請求的http方法</param>        /// <param name="data">請求的內容</param>        /// <returns>返回結果;如果請求失敗,或者發生錯誤,返回null。</returns>        public static T RequestParsableResult<T>(string urlFormat, string userName, out ErrorMessage errorMessage, IEnumerable<object> urlParameters = null, string httpMethod = WebRequestMethods.Http.Get, string data = null)            where T : IParsable, new()        {            T result = default(T);            errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "請求失敗。");            string responseContent = RequestResponseContent(urlFormat, userName, urlParameters, httpMethod, data);            if (string.IsNullOrWhiteSpace(responseContent))                return result;            if (ErrorMessage.IsErrorMessage(responseContent))                errorMessage = ErrorMessage.Parse(responseContent);            else            {                try                {                    result = Utility.Parse<T>(responseContent);                    if (result != null)                        errorMessage = new ErrorMessage(ErrorMessage.SuccessCode, "請求成功。");                    else                        errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "解析失敗。");                }                catch                {                    errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "解析失敗。");                }            }            return result;        }        /// <summary>        /// 組合url,發送數據,然后返回結果。        /// 注:結果為已知的簡單值類型。        /// </summary>        /// <typeparam name="T">返回結果的類型</typeparam>        /// <param name="urlFormat">url格式字符串,第一個參數為userName獲取到的許可令牌,然后依次為parameters中的參數</param>        /// <param name="userName">公眾號</param>        /// <param name="propertyNameInJson">返回結果在json中的鍵名</param>        /// <param name="errorMessage">返回請求是否成功</param>        /// <param name="urlParameters">參數</param>        /// <param name="httpMethod">執行請求的http方法</param>        /// <param name="data">請求的內容</param>        /// <returns>返回結果;如果請求失敗,或者發生錯誤,返回default(T)。</returns>        public static T RequestValueTypeResult<T>(string urlFormat, string userName, string propertyNameInJson, out ErrorMessage errorMessage, IEnumerable<object> urlParameters = null, string httpMethod = WebRequestMethods.Http.Get, string data = null)            where T : struct        {            errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "請求失敗。");            string responseContent = RequestResponseContent(urlFormat, userName, urlParameters, httpMethod, data);            return ConvertValueTypeResult<T>(responseContent, propertyNameInJson, out errorMessage);        }        /// <summary>        /// 獲取值類型的結果        /// </summary>        /// <typeparam name="T">返回結果的類型</typeparam>        /// <param name="responseContent">響應內容</param>        /// <param name="propertyNameInJson">返回結果在json中的鍵名</param>        /// <param name="errorMessage">返回請求是否成功</param>        /// <returns>返回結果;如果請求失敗,或者發生錯誤,返回default(T)。</returns>        private static T ConvertValueTypeResult<T>(string responseContent, string propertyNameInJson, out ErrorMessage errorMessage)            where T : struct        {            if (string.IsNullOrWhiteSpace(responseContent))            {                errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "請求失敗。");                return default(T);            }            if (ErrorMessage.IsErrorMessage(responseContent))                errorMessage = ErrorMessage.Parse(responseContent);            else                errorMessage = new ErrorMessage(ErrorMessage.SuccessCode, "請求成功。");            JObject jo = JObject.Parse(responseContent);            JToken jt;            if (jo.TryGetValue(propertyNameInJson, out jt))                return ConvertValueTypeResult<T>((string)jt);            else                return default(T);        }        /// <summary>        /// 獲取值類型的結果        /// </summary>        /// <typeparam name="T">返回結果的類型</typeparam>        /// <param name="responseContent">響應內容</param>        /// <param name="propertyNameInJson">返回結果在json中的鍵名</param>        /// <param name="errorMessage">返回請求是否成功</param>        /// <returns>返回結果;如果請求失敗,或者發生錯誤,返回default(T)。</returns>        private static T ConvertValueTypeResult<T>(string value)            where T : struct        {            Type type = typeof(T);            if (type.IsEnum)                return (T)Enum.Parse(type, value);            else if (type == typeof(sbyte))                return (T)(object)Convert.ToSByte(value);            else if (type == typeof(byte))                return (T)(object)Convert.ToByte(value);            else if (type == typeof(char))                return (T)(object)Convert.ToChar(value);            else if (type == typeof(short))                return (T)(object)Convert.ToInt16(value);            else if (type == typeof(ushort))                return (T)(object)Convert.ToUInt16(value);            else if (type == typeof(int))                return (T)(object)Convert.ToInt32(value);            else if (type == typeof(uint))                return (T)(object)Convert.ToUInt32(value);            else if (type == typeof(long))                return (T)(object)Convert.ToInt64(value);            else if (type == typeof(ulong))                return (T)(object)Convert.ToUInt64(value);            else if (type == typeof(float))                return (T)(object)Convert.ToSingle(value);            else if (type == typeof(double))                return (T)(object)Convert.ToDouble(value);            else if (type == typeof(decimal))                return (T)(object)Convert.ToDecimal(value);            else if (type == typeof(bool))                return (T)(object)Convert.ToBoolean(value);            else                throw new ArgumentException("不支持的值類型。");        }        /// <summary>        /// 向微信服務器提交數據        /// </summary>        /// <param name="url">服務器地址</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            byte[] bytes = string.IsNullOrEmpty(data) ? null : RequestEncoding.GetBytes(data);            return Request(url, httpMethod, (byte[])bytes);        }        /// <summary>        /// 上傳文件        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="filename">文件名(不包含路徑)</param>        /// <param name="fileData">文件數據</param>        /// <param name="formData">表單數據</param>        /// <returns>返回服務器的響應字符串</returns>        public static string Upload(string url, string filename, byte[] fileData, NameValueCollection formData = null)        {            string responseContent = string.Empty;            if (string.IsNullOrWhiteSpace(url) || string.IsNullOrWhiteSpace(filename) || fileData == null || fileData.Length == 0)                return responseContent;            // 邊界符            string boundary = "AaB03xAaB03x";            // 開始邊界符            byte[] beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "/r/n");            // 結束符            byte[] endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--/r/n");            //換行            byte[] newLine = Encoding.ASCII.GetBytes("/r/n");            MemoryStream ms = null;            Stream stream = null;            HttpWebResponse response = null;            StreamReader sr = null;            try            {                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);                request.Method = WebRequestMethods.Http.Post;                request.ContentType = "multipart/form-data; boundary=" + boundary;                // 寫入文件                string header = string.Format("Content-Disposition: form-data; filename=/"{0}/"/r/n" +                     "Content-Type: application/octet-stream/r/n/r/n",                     filename);                byte[] headerbytes = Encoding.UTF8.GetBytes(header);                ms = new MemoryStream();                ms.Write(beginBoundary, 0, beginBoundary.Length);                ms.Write(headerbytes, 0, headerbytes.Length);                ms.Write(fileData, 0, fileData.Length);                // 寫入表單數據                if (formData != null && formData.Count > 0)                {                    var formItem = "/r/n--" + boundary +                                           "/r/nContent-Disposition: form-data; name=/"{0}/"" +                                           "/r/n/r/n{1}/r/n";                    foreach (string key in formData.Keys)                    {                        string value = formData[key];                        byte[] bytes = Encoding.UTF8.GetBytes(string.Format(formItem, key, value));                        ms.Write(bytes, 0, bytes.Length);                    }                }                //寫入結束邊界符                ms.Write(newLine, 0, newLine.Length);                ms.Write(endBoundary, 0, endBoundary.Length);                request.ContentLength = ms.Length;                stream = request.GetRequestStream();                stream.Write(ms.ToArray(), 0, (int)ms.Length);                //獲取響應                response = (HttpWebResponse)request.GetResponse();                sr = new StreamReader(response.GetResponseStream(), HttpHelper.ResponseEncoding);                responseContent = sr.ReadToEnd();            }            finally            {                if (ms != null)                    ms.Close();                if (stream != null)                    stream.Close();                if (sr != null)                    sr.Close();                if (response != null)                    response.Close();            }            return responseContent;        }        /// <summary>        /// 上傳文件        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="pathname">包含路徑的文件名</param>        /// <param name="formData">表單數據</param>        /// <returns>返回服務器的響應字符串</returns>        public static string Upload(string url, string pathname, NameValueCollection formData = null)        {            string filename = Path.GetFileName(pathname);            byte[] data = null;            FileStream fs = null;            MemoryStream ms = null;            try            {                fs = new FileStream(pathname, FileMode.Open, FileAccess.Read);                ms = new MemoryStream();                int bufferLength = 2048;                byte[] buffer = new byte[bufferLength];                int size = fs.Read(buffer, 0, bufferLength);                while (size > 0)                {                    ms.Write(buffer, 0, size);                    size = fs.Read(buffer, 0, bufferLength);                }                data = ms.ToArray();            }            finally            {                if (fs != null)                    fs.Close();                if (ms != null)                    ms.Close();            }            return Upload(url, filename, data, formData);        }    }
HttpHelper

四.最終效果如下:

五.微信公眾號開發系列導航

1.0初始微信公眾號

2.0創建自定義菜單

3.0查詢自定義菜單

4.0公眾號消息處理

5.0微信支付

6.0模板消息


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久精品国产一区二区| 精品中文字幕乱| 色综合天天狠天天透天天伊人| 色偷偷9999www| 一区二区成人av| 2019中文字幕在线| 91高清免费在线观看| 最近中文字幕日韩精品| 国产视频精品一区二区三区| 欧美华人在线视频| 亚洲人成电影网站色www| 欧美性猛交xxxxx水多| 欧美天天综合色影久久精品| 精品香蕉在线观看视频一| 黄色成人在线播放| 亚洲国产精品人人爽夜夜爽| 亚洲免费影视第一页| 精品动漫一区二区| 庆余年2免费日韩剧观看大牛| 毛片精品免费在线观看| 欧美精品videofree1080p| 在线亚洲午夜片av大片| 国产精品精品一区二区三区午夜版| 亚洲第一男人av| 国产成人精品视| 亚洲第一区在线| www.99久久热国产日韩欧美.com| 国产精品久久久精品| 97在线观看免费高清| 国产精品私拍pans大尺度在线| 性色av一区二区三区| 在线成人免费网站| 欧美亚洲国产视频小说| 国产日韩亚洲欧美| 国产精品久久久久久亚洲影视| 91在线免费观看网站| 57pao成人国产永久免费| 在线观看久久av| 日韩在线免费观看视频| 欧美成人免费一级人片100| 国产精品va在线播放我和闺蜜| 国产精品一久久香蕉国产线看观看| 裸体女人亚洲精品一区| 亚洲精品乱码久久久久久金桔影视| 亚洲欧美日韩天堂| 欧美成人免费大片| 热久久视久久精品18亚洲精品| 欧美一级成年大片在线观看| 亚洲欧洲午夜一线一品| 国产午夜精品视频免费不卡69堂| 国产精品成人v| 久久久久久久久国产精品| 97久久伊人激情网| 国产999精品视频| 欧美国产高跟鞋裸体秀xxxhd| 欧美一级bbbbb性bbbb喷潮片| 国产一区二区三区日韩欧美| 3344国产精品免费看| 中文字幕国产日韩| 久久综合色影院| 久久久久久久久网站| 久久99久久99精品免观看粉嫩| 91精品视频观看| 日韩欧美亚洲综合| 国产精品久久久久久网站| 色悠久久久久综合先锋影音下载| 欧美日韩中文字幕在线视频| 欧美自拍大量在线观看| 国产精品成人一区二区三区吃奶| 欧美精品手机在线| 亚洲xxxxx性| 欧美成人午夜激情视频| 国产999精品视频| 欧美中文字幕在线播放| 91在线色戒在线| 68精品国产免费久久久久久婷婷| www国产精品com| 国产精品十八以下禁看| 91精品国产高清久久久久久| 一区二区三区视频观看| 亚洲男人7777| 日韩在线视频观看正片免费网站| 亚洲午夜久久久久久久| 欧美激情视频三区| 久久久噜噜噜久噜久久| 欧美激情第一页xxx| 国产亚洲精品一区二555| 欧美精品18videosex性欧美| 91精品国产高清久久久久久| 久久人人爽人人爽爽久久| 国产亚洲欧洲黄色| 国产视频在线一区二区| 久久久国产精彩视频美女艺术照福利| 亚洲午夜未满十八勿入免费观看全集| 日韩一区视频在线| 久久影视电视剧免费网站清宫辞电视| 国产在线视频一区| 久久久国产精彩视频美女艺术照福利| 国产精品在线看| 亚洲free嫩bbb| 正在播放国产一区| 国产精品丝袜白浆摸在线| 成人免费网视频| 久久天天躁狠狠躁夜夜爽蜜月| 国产一区二区三区直播精品电影| 91欧美精品成人综合在线观看| 亚洲一区二区中文字幕| 久久精品99久久香蕉国产色戒| 91免费福利视频| 久久久爽爽爽美女图片| 亚洲精品国产精品自产a区红杏吧| 日韩电影大全免费观看2023年上| 欧美成人免费一级人片100| 亚洲一区亚洲二区| 欧美激情第一页xxx| 69久久夜色精品国产7777| 久久久久成人网| 久久成人在线视频| 国产成人啪精品视频免费网| 欧美日韩国产成人在线观看| 日韩精品免费在线观看| 国产精品久久久久久av下载红粉| 国产精品欧美一区二区三区奶水| 91亚洲精品久久久久久久久久久久| 日韩精品视频在线播放| 91久久精品在线| 国产成人一区二区| 欧美男插女视频| 欧美亚洲成人精品| 亚洲黄色www| 国产视频欧美视频| 欧美激情三级免费| 欧美激情亚洲视频| 亚洲最新中文字幕| 欧美午夜性色大片在线观看| 国产精品自拍网| 欧美与黑人午夜性猛交久久久| 欧美在线激情网| 91av视频在线| 中文字幕国产亚洲| 成人欧美一区二区三区在线湿哒哒| 国产一区二区在线免费| 久久久久久12| 97久久精品人人澡人人爽缅北| 久久久久九九九九| 欧美劲爆第一页| 另类美女黄大片| 在线精品高清中文字幕| 亚洲偷欧美偷国内偷| 日韩成人黄色av| 精品国产老师黑色丝袜高跟鞋| 欧美黑人视频一区| 成人激情综合网| 欧美在线欧美在线| 欧美老女人性生活| 国产成人一区二区三区| 国产亚洲美女精品久久久| 欧美另类69精品久久久久9999| 精品国偷自产在线视频99| 日韩av中文字幕在线免费观看| 国产亚洲欧美日韩美女| 九九热精品视频| 成人疯狂猛交xxx| 97成人在线视频|