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

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

微信開發筆記-調用自定義分享接口

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

引言:

  工作中開發微信網站,簡稱微網站。由于微網站的分享內容是系統自動選取的當前網址,客戶需要改變分享的內容,即點擊屏幕右上角的分享按鈕,選擇發送給朋友和發送到朋友圈,其中的內容和圖片需要自定義。于是查找文檔微信JS-SDK說明文檔一文和網站眾多高手的經驗,大體知道了調用的步驟,但是具體如何調用才能成功卻是不了解的。經過一番試驗,終于成功調用發送朋友和發送到朋友圈兩個接口,此處記錄調用的具體過程。

 

步驟一:引用js文件。

在需要調用JS接口的頁面引入如下JS文件,(支持https):http://res.wx.QQ.com/open/js/jweixin-1.0.0.js

 

步驟二:通過config接口注入權限驗證配置

wx.config({    debug: true, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。    appId: '', // 必填,公眾號的唯一標識    timestamp: , // 必填,生成簽名的時間戳    nonceStr: '', // 必填,生成簽名的隨機串    signature: '',// 必填,簽名,見附錄1    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2});

網上眾多網友也是這樣寫的,但是具體如果配卻談之甚少,接下來介紹本文是如何調用的。

debug和appId,都不用說,很簡單。

timespan生成簽名的時間戳:

/// <summary>        /// 生成時間戳        /// 從 1970 年 1 月 1 日 00:00:00 至今的秒數,即當前的時間,且最終需要轉換為字符串形式        /// </summary>        /// <returns></returns>        public string getTimestamp()        {            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);            return Convert.ToInt64(ts.TotalSeconds).ToString();        }

 

nonceStr生成簽名的隨機串:

/// <summary>        /// 生成隨機字符串        /// </summary>        /// <returns></returns>        public string getNoncestr()        {            Random random = new Random();            return md5Util.GetMD5(random.Next(1000).ToString(), "GBK");        }
/// <summary>    /// MD5Util 的摘要說明。    /// </summary>    public class MD5Util    {        public MD5Util()        {            //            // TODO: 在此處添加構造函數邏輯            //        }        /** 獲取大寫的MD5簽名結果 */        public static string GetMD5(string encypStr, string charset)        {            string retStr;            MD5CryptoServicePRovider m5 = new MD5CryptoServiceProvider();            //創建md5對象            byte[] inputBye;            byte[] outputBye;            //使用GB2312編碼方式把字符串轉化為字節數組.            try            {                inputBye = Encoding.GetEncoding(charset).GetBytes(encypStr);            }            catch (Exception ex)            {                inputBye = Encoding.GetEncoding("GB2312").GetBytes(encypStr);            }            outputBye = m5.ComputeHash(inputBye);            retStr = System.BitConverter.ToString(outputBye);            retStr = retStr.Replace("-", "").ToUpper();            return retStr;        }    }
View Code

 

singature簽名的生成比較麻煩。

首先生成獲取access_token(有效期7200秒,開發者必須在自己的服務全局緩存access_token

public string Getaccesstoken()        {            string appid = System.Configuration.ConfigurationManager.AppSettings["WXZjAppID"].ToString();            string secret = System.Configuration.ConfigurationManager.AppSettings["WXZjAppSecret"].ToString();            string urljson = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;            string strjson = "";            UTF8Encoding encoding = new UTF8Encoding();            HttpWebRequest myRequest =            (HttpWebRequest)WebRequest.Create(urljson);            myRequest.Method = "GET";            myRequest.ContentType = "application/x-www-form-urlencoded";            HttpWebResponse response;            Stream responseStream;            StreamReader reader;            string srcString;            response = myRequest.GetResponse() as HttpWebResponse;            responseStream = response.GetResponseStream();            reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);            srcString = reader.ReadToEnd();            reader.Close();            if (srcString.Contains("access_token"))            {                //CommonJsonModel model = new CommonJsonModel(srcString);                HP.CPS.BLL.WeiXin.CommonJsonModel model = new BLL.WeiXin.CommonJsonModel(srcString);                strjson = model.GetValue("access_token");                session["access_tokenzj"] = strjson;            }            return strjson;        }
public class CommonJsonModelAnalyzer    {        protected string _GetKey(string rawjson)        {            if (string.IsNullOrEmpty(rawjson))                return rawjson;            rawjson = rawjson.Trim();            string[] jsons = rawjson.Split(new char[] { ':' });            if (jsons.Length < 2)                return rawjson;            return jsons[0].Replace("/"", "").Trim();        }        protected string _GetValue(string rawjson)        {            if (string.IsNullOrEmpty(rawjson))                return rawjson;            rawjson = rawjson.Trim();            string[] jsons = rawjson.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);            if (jsons.Length < 2)                return rawjson;            StringBuilder builder = new StringBuilder();            for (int i = 1; i < jsons.Length; i++)            {                builder.Append(jsons[i]);                builder.Append(":");            }            if (builder.Length > 0)                builder.Remove(builder.Length - 1, 1);            string value = builder.ToString();            if (value.StartsWith("/""))                value = value.Substring(1);            if (value.EndsWith("/""))                value = value.Substring(0, value.Length - 1);            return value;        }        protected List<string> _GetCollection(string rawjson)        {            //[{},{}]            List<string> list = new List<string>();            if (string.IsNullOrEmpty(rawjson))                return list;            rawjson = rawjson.Trim();            StringBuilder builder = new StringBuilder();            int nestlevel = -1;            int mnestlevel = -1;            for (int i = 0; i < rawjson.Length; i++)            {                if (i == 0)                    continue;                else if (i == rawjson.Length - 1)                    continue;                char jsonchar = rawjson[i];                if (jsonchar == '{')                {                    nestlevel++;                }                if (jsonchar == '}')                {                    nestlevel--;                }                if (jsonchar == '[')                {                    mnestlevel++;                }                if (jsonchar == ']')                {                    mnestlevel--;                }                if (jsonchar == ',' && nestlevel == -1 && mnestlevel == -1)                {                    list.Add(builder.ToString());                    builder = new StringBuilder();                }                else                {                    builder.Append(jsonchar);                }            }            if (builder.Length > 0)                list.Add(builder.ToString());            return list;        }    }    public class CommonJsonModel : CommonJsonModelAnalyzer    {        private string rawjson;        private bool isValue = false;        private bool isModel = false;        private bool isCollection = false;        public CommonJsonModel(string rawjson)        {            this.rawjson = rawjson;            if (string.IsNullOrEmpty(rawjson))                throw new Exception("missing rawjson");            rawjson = rawjson.Trim();            if (rawjson.StartsWith("{"))            {                isModel = true;            }            else if (rawjson.StartsWith("["))            {                isCollection = true;            }            else            {                isValue = true;            }        }        public string Rawjson        {            get { return rawjson; }        }        public bool IsValue()        {            return isValue;        }        public bool IsValue(string key)        {            if (!isModel)                return false;            if (string.IsNullOrEmpty(key))                return false;            foreach (string subjson in base._GetCollection(this.rawjson))            {                CommonJsonModel model = new CommonJsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    CommonJsonModel submodel = new CommonJsonModel(model.Value);                    return submodel.IsValue();                }            }            return false;        }        public bool IsModel()        {            return isModel;        }        public bool IsModel(string key)        {            if (!isModel)                return false;            if (string.IsNullOrEmpty(key))                return false;            foreach (string subjson in base._GetCollection(this.rawjson))            {                CommonJsonModel model = new CommonJsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    CommonJsonModel submodel = new CommonJsonModel(model.Value);                    return submodel.IsModel();                }            }            return false;        }        public bool IsCollection()        {            return isCollection;        }        public bool IsCollection(string key)        {            if (!isModel)                return false;            if (string.IsNullOrEmpty(key))                return false;            foreach (string subjson in base._GetCollection(this.rawjson))            {                CommonJsonModel model = new CommonJsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    CommonJsonModel submodel = new CommonJsonModel(model.Value);                    return submodel.IsCollection();                }            }            return false;        }        /// <summary>        /// 當模型是對象,返回擁有的key        /// </summary>        /// <returns></returns>        public List<string> GetKeys()        {            if (!isModel)                return null;            List<string> list = new List<string>();            foreach (string subjson in base._GetCollection(this.rawjson))            {                string key = new CommonJsonModel(subjson).Key;                if (!string.IsNullOrEmpty(key))                    list.Add(key);            }            return list;        }        /// <summary>        /// 當模型是對象,key對應是值,則返回key對應的值        /// </summary>        /// <param name="key"></param>        /// <returns></returns>        public string GetValue(string key)        {            if (!isModel)                return null;            if (string.IsNullOrEmpty(key))                return null;            foreach (string subjson in base._GetCollection(this.rawjson))            {                CommonJsonModel model = new CommonJsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                    return model.Value;            }            return null;        }        /// <summary>        /// 模型是對象,key對應是對象,返回key對應的對象        /// </summary>        /// <param name="key"></param>        /// <returns></returns>        public CommonJsonModel GetModel(string key)        {            if (!isModel)                return null;            if (string.IsNullOrEmpty(key))                return null;            foreach (string subjson in base._GetCollection(this.rawjson))            {                CommonJsonModel model = new CommonJsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    CommonJsonModel submodel = new CommonJsonModel(model.Value);                    if (!submodel.IsModel())                        return null;                    else                        return submodel;                }            }            return null;        }        /// <summary>        /// 模型是對象,key對應是集合,返回集合        /// </summary>        /// <param name="key"></param>        /// <returns></returns>        public CommonJsonModel GetCollection(string key)        {            if (!isModel)                return null;            if (string.IsNullOrEmpty(key))                return null;            foreach (string subjson in base._GetCollection(this.rawjson))            {                CommonJsonModel model = new CommonJsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    CommonJsonModel submodel = new CommonJsonModel(model.Value);                    if (!submodel.IsCollection())                        return null;                    else                        return submodel;                }            }            return null;        }        /// <summary>        /// 模型是集合,返回自身        /// </summary>        /// <returns></returns>        public List<CommonJsonModel> GetCollection()        {            List<CommonJsonModel> list = new List<CommonJsonModel>();            if (IsValue())                return list;            foreach (string subjson in base._GetCollection(rawjson))            {                list.Add(new CommonJsonModel(subjson));            }            return list;        }        /// <summary>        /// 當模型是值對象,返回key        /// </summary>        private string Key        {            get            {                if (IsValue())                    return base._GetKey(rawjson);                return null;            }        }        /// <summary>        /// 當模型是值對象,返回value        /// </summary>        private string Value        {            get            {                if (!IsValue())                    return null;                return base._GetValue(rawjson);            }        }    }
View Code

 

接著獲取jsapi_ticket:

用第一步拿到的access_token 采用http GET方式請求獲得jsapi_ticket(有效期7200秒,開發者必須在自己的服務全局緩存jsapi_ticket

public string Getjsapi_ticket()        {            string accesstoken = (string)Session["access_tokenzj"];            string urljson = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accesstoken + "&type=jsapi";            string strjson = "";            UTF8Encoding encoding = new UTF8Encoding();            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(urljson);            myRequest.Method = "GET";            myRequest.ContentType = "application/x-www-form-urlencoded";            HttpWebResponse response = myRequest.GetResponse() as HttpWebResponse;            Stream responseStream = response.GetResponseStream();            StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);            string srcString = reader.ReadToEnd();            reader.Close();            if (srcString.Contains("ticket"))            {                HP.CPS.BLL.WeiXin.CommonJsonModel model = new BLL.WeiXin.CommonJsonModel(srcString);                strjson = model.GetValue("ticket");                Session["ticketzj"] = strjson;            }            return strjson;        }

 

最后生成signature:

public string Getsignature(string nonceStr, string timespanstr)        {            if (Session["access_tokenzj"] == null)            {                Getaccesstoken();            }            if (Session["ticketzj"] == null)            {                Getjsapi_ticket();            }            string url = Request.Url.ToString();            string str = "jsapi_ticket=" + (string)Session["ticketzj"] + "&noncestr=" + nonceStr +                "&timestamp=" + timespanstr + "&url=" + url;// +"&wxref=mp.weixin.qq.com";            string singature = SHA1Util.getSha1(str);            string ss = singature;            return ss;        }
class SHA1Util    {        public static String getSha1(String str)        {            //建立SHA1對象            SHA1 sha = new SHA1CryptoServiceProvider();            //將mystr轉換成byte[]             ASCIIEncoding enc = new ASCIIEncoding();            byte[] dataToHash = enc.GetBytes(str);            //Hash運算            byte[] dataHashed = sha.ComputeHash(dataToHash);            //將運算結果轉換成string            string hash = BitConverter.ToString(dataHashed).Replace("-", "");            return hash;        }    }
View Code

 

本文調用實例:

<script type="text/javascript">        wx.config({            debug: false,            appId: '<%=corpid %>',            timestamp: <%=timestamp%>,            nonceStr: '<%=nonceStr%>',            signature: '<%=signature %>',            jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage']        });    </script>

 

步驟三:調用接口

在進行完第二步的調用后,步驟三就顯得非常輕巧了。

wx.ready(function(){    // config信息驗證后會執行ready方法,所有接口調用都必須在config接口獲得結果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對于用戶觸發時才調用的接口,則可以直接調用,不需要放在ready函數中。});

本文的調用實例是:
<script type="text/Javascript" >    wx.ready(function () {        wx.onMenuShareAppMessage({            title: '<%=shareTitle %>',            desc: '<%=shareContent %>',            link: '<%=currentUrl %>',            imgUrl: '<%=shareImageUrl %>'        });        wx.onMenuShareTimeline({            title: '<%=shareContent %>',            link: '<%=currentUrl %>',            imgUrl: '<%=shareImageUrl %>'        });    })     </script>

本文基本上總結到此處。

易出現的問題:

1、檢查后臺是否設置:右上角公眾號名稱--功能設置--JS接口安全域名

2、檢查代碼里的appid和公眾號后臺的id是否一致

3、圖片的調用地址是絕對路徑(相對路徑好像不行)。



引用文檔:
微信JS-SDK說明文檔

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日产欧美a一级在线| 亚洲福利在线观看| 久久久在线观看| 91国内在线视频| 亚洲午夜激情免费视频| 欧美高清激情视频| 国内精品模特av私拍在线观看| 国产成人精品久久二区二区91| 色悠悠国产精品| 孩xxxx性bbbb欧美| 日韩黄色在线免费观看| 日韩亚洲一区二区| 国产精品99免视看9| 亚洲午夜色婷婷在线| 91av视频在线播放| 亚洲欧美日韩一区二区三区在线| 91地址最新发布| 亚洲一区精品电影| 欧美在线观看www| 久久久久久有精品国产| 91精品国产综合久久香蕉922| 日本午夜精品理论片a级appf发布| 欧美第一黄色网| 亚洲综合精品一区二区| 国产精品久久久久久久久久久久久| 国产美女直播视频一区| 欧美成人免费播放| 国产日韩中文字幕| 成人午夜小视频| 成人免费在线网址| 亚洲第一区中文字幕| 日韩的一区二区| 久久综合国产精品台湾中文娱乐网| 欧美激情视频一区二区| 91chinesevideo永久地址| 日韩中文在线中文网在线观看| 福利视频第一区| 国内精品久久久久久中文字幕| 国产精品免费看久久久香蕉| 日韩美女福利视频| 亚洲色图国产精品| 欧美日韩黄色大片| 综合欧美国产视频二区| 国产日韩欧美夫妻视频在线观看| 欧美孕妇与黑人孕交| 欧美寡妇偷汉性猛交| 亚洲国内高清视频| 精品久久久免费| 26uuu久久噜噜噜噜| 中文字幕免费精品一区| 超薄丝袜一区二区| 欧美精品九九久久| 国产精品午夜视频| 日本亚洲欧美成人| 国产精品日韩欧美大师| 亚洲成人教育av| 午夜精品免费视频| 欧美激情亚洲综合一区| 亚洲精品午夜精品| 日韩欧美极品在线观看| 日韩激情av在线播放| 久久久亚洲影院你懂的| 成人免费视频在线观看超级碰| 97福利一区二区| 97国产精品免费视频| 亚洲天堂网在线观看| 青青a在线精品免费观看| 中文字幕精品久久久久| 91久久久久久久久久久| 91在线视频精品| 国产免费一区二区三区香蕉精| 亚洲mm色国产网站| 亚洲第一综合天堂另类专| 国产自产女人91一区在线观看| 色一情一乱一区二区| 欧洲永久精品大片ww免费漫画| 日韩在线小视频| 国产免费观看久久黄| 亚洲精品自拍第一页| 欧美国产在线视频| 亚洲最大av网站| 国产网站欧美日韩免费精品在线观看| 国产精品久久在线观看| 欧美一级成年大片在线观看| 中文字幕av一区二区三区谷原希美| 国产日韩中文字幕| 亚洲一区二区三区乱码aⅴ| 国产精品久久久久久久久久免费| 亚洲国产另类久久精品| 最近的2019中文字幕免费一页| 亚洲japanese制服美女| 91精品久久久久久久久不口人| 国产日韩欧美影视| 欧美丰满少妇xxxxx| 国产午夜精品全部视频在线播放| 一区二区在线免费视频| 91免费在线视频| 欧美www在线| 欧美日韩色婷婷| 亚洲欧美日韩精品久久亚洲区| 国产精品色视频| 久久久精品2019中文字幕神马| 不卡av在线网站| 亚洲国产天堂久久综合| 在线视频国产日韩| 精品动漫一区二区| 亚洲激情电影中文字幕| 上原亚衣av一区二区三区| 久久久亚洲国产| 日本午夜人人精品| 久久成人一区二区| 亚洲欧美日韩国产成人| 亚洲性视频网站| 中文.日本.精品| 亚洲精品中文字幕有码专区| 欧美成人黑人xx视频免费观看| 日韩中文字幕视频在线观看| 精品欧美国产一区二区三区| 日韩精品亚洲精品| 日韩av网站导航| 亚洲欧美国产va在线影院| 中文字幕日韩视频| 久久久人成影片一区二区三区观看| 日韩精品福利网站| 另类图片亚洲另类| 日韩欧亚中文在线| 亚洲二区中文字幕| 国产精品草莓在线免费观看| 国产大片精品免费永久看nba| 成人有码视频在线播放| www.日本久久久久com.| 久久久影视精品| 一区二区三区天堂av| 热久久免费视频精品| 国产精品专区h在线观看| 日本欧美爱爱爱| 久久久久久18| 一区二区三区 在线观看视| 欧美亚洲一区在线| 国产精品入口福利| 欧美专区国产专区| 欧美亚洲国产日本| 成人激情电影一区二区| 一区二区三区在线播放欧美| 亚洲精品xxxx| 日韩免费精品视频| 伊人久久久久久久久久久久久| 国产日韩亚洲欧美| 亚洲人成网站999久久久综合| 美日韩精品免费观看视频| 欧美性猛交xxxx久久久| 琪琪亚洲精品午夜在线| 国产精品色视频| 国产一区香蕉久久| 久久五月情影视| 欧美一区二区三区免费视| 国产午夜精品久久久| 日韩激情第一页| 亚洲精品中文字幕有码专区| 久久久久久久一区二区| 亚洲国产精品久久| 欧美国产日韩精品| 国产成人精品综合久久久| 日韩黄在线观看|