/**! * 微信內置瀏覽器的Javascript API,功能包括: * * 一、分享到微信朋友圈 * 二、分享給微信好友 * 三、分享到騰訊微博 * 四、新的分享接口,包含朋友圈、好友、微博的分享(for iOS) * 五、隱藏/顯示右上角的菜單入口 * 六、隱藏/顯示底部瀏覽器工具欄 * 七、獲取當前的網絡狀態 * 八、調起微信客戶端的圖片播放組件 * 九、關閉公衆平臺Web頁面 * 十、判斷當前網頁是否在微信內置瀏覽器中打開 * 十一、增長打開掃描二維碼 * 十二、支持WeixinApi的錯誤監控 * 1三、檢測應用程序是否已經安裝(須要官方開通權限) * * @author zhaoxianlie(http://www.baidufe.com) */ var WeixinApi = (function () { "use strict"; /** * 分享到微信朋友圈 * @param {Object} data 待分享的信息 * @p-config {String} appId 公衆平臺的appId(服務號可用) * @p-config {String} imgUrl 圖片地址 * @p-config {String} link 連接地址 * @p-config {String} desc 描述 * @p-config {String} title 分享的標題 * * @param {Object} callbacks 相關回調方法 * @p-config {Boolean} async ready方法是否須要異步執行,默認false * @p-config {Function} ready(argv) 就緒狀態 * @p-config {Function} dataLoaded(data) 數據加載完成後調用,async爲true時有用,也能夠爲空 * @p-config {Function} cancel(resp) 取消 * @p-config {Function} fail(resp) 失敗 * @p-config {Function} confirm(resp) 成功 * @p-config {Function} all(resp) 不管成功失敗都會執行的回調 */ function weixinShareTimeline(data, callbacks) { callbacks = callbacks || {}; var shareTimeline = function (theData) { WeixinJSBridge.invoke('shareTimeline', { "appid":theData.appId ? theData.appId : '', "img_url":theData.imgUrl, "link":theData.link, "desc":theData.title, "title":theData.desc, // 注意這裏要分享出去的內容是desc "img_width":"640", "img_height":"640" }, function (resp) { switch (resp.err_msg) { // share_timeline:cancel 用戶取消 case 'share_timeline:cancel': callbacks.cancel && callbacks.cancel(resp); break; // share_timeline:confirm 發送成功 case 'share_timeline:confirm': case 'share_timeline:ok': callbacks.confirm && callbacks.confirm(resp); break; // share_timeline:fail 發送失敗 case 'share_timeline:fail': default: callbacks.fail && callbacks.fail(resp); break; } // 不管成功失敗都會執行的回調 callbacks.all && callbacks.all(resp); }); }; WeixinJSBridge.on('menu:share:timeline', function (argv) { if (callbacks.async && callbacks.ready) { window["_wx_loadedCb_"] = callbacks.dataLoaded || new Function(); if(window["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) { window["_wx_loadedCb_"] = new Function(); } callbacks.dataLoaded = function (newData) { window["_wx_loadedCb_"](newData); shareTimeline(newData); }; // 而後就緒 callbacks.ready && callbacks.ready(argv); } else { // 就緒狀態 callbacks.ready && callbacks.ready(argv); shareTimeline(data); } }); } /** * 發送給微信上的好友 * @param {Object} data 待分享的信息 * @p-config {String} appId 公衆平臺的appId(服務號可用) * @p-config {String} imgUrl 圖片地址 * @p-config {String} link 連接地址 * @p-config {String} desc 描述 * @p-config {String} title 分享的標題 * * @param {Object} callbacks 相關回調方法 * @p-config {Boolean} async ready方法是否須要異步執行,默認false * @p-config {Function} ready(argv) 就緒狀態 * @p-config {Function} dataLoaded(data) 數據加載完成後調用,async爲true時有用,也能夠爲空 * @p-config {Function} cancel(resp) 取消 * @p-config {Function} fail(resp) 失敗 * @p-config {Function} confirm(resp) 成功 * @p-config {Function} all(resp) 不管成功失敗都會執行的回調 */ function weixinSendAppMessage(data, callbacks) { callbacks = callbacks || {}; var sendAppMessage = function (theData) { WeixinJSBridge.invoke('sendAppMessage', { "appid":theData.appId ? theData.appId : '', "img_url":theData.imgUrl, "link":theData.link, "desc":theData.desc, "title":theData.title, "img_width":"640", "img_height":"640" }, function (resp) { switch (resp.err_msg) { // send_app_msg:cancel 用戶取消 case 'send_app_msg:cancel': callbacks.cancel && callbacks.cancel(resp); break; // send_app_msg:confirm 發送成功 case 'send_app_msg:confirm': case 'send_app_msg:ok': callbacks.confirm && callbacks.confirm(resp); break; // send_app_msg:fail 發送失敗 case 'send_app_msg:fail': default: callbacks.fail && callbacks.fail(resp); break; } // 不管成功失敗都會執行的回調 callbacks.all && callbacks.all(resp); }); }; WeixinJSBridge.on('menu:share:appmessage', function (argv) { if (callbacks.async && callbacks.ready) { window["_wx_loadedCb_"] = callbacks.dataLoaded || new Function(); if(window["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) { window["_wx_loadedCb_"] = new Function(); } callbacks.dataLoaded = function (newData) { window["_wx_loadedCb_"](newData); sendAppMessage(newData); }; // 而後就緒 callbacks.ready && callbacks.ready(argv); } else { // 就緒狀態 callbacks.ready && callbacks.ready(argv); sendAppMessage(data); } }); } /** * 分享到騰訊微博 * @param {Object} data 待分享的信息 * @p-config {String} link 連接地址 * @p-config {String} desc 描述 * * @param {Object} callbacks 相關回調方法 * @p-config {Boolean} async ready方法是否須要異步執行,默認false * @p-config {Function} ready(argv) 就緒狀態 * @p-config {Function} dataLoaded(data) 數據加載完成後調用,async爲true時有用,也能夠爲空 * @p-config {Function} cancel(resp) 取消 * @p-config {Function} fail(resp) 失敗 * @p-config {Function} confirm(resp) 成功 * @p-config {Function} all(resp) 不管成功失敗都會執行的回調 */ function weixinShareWeibo(data, callbacks) { callbacks = callbacks || {}; var shareWeibo = function (theData) { WeixinJSBridge.invoke('shareWeibo', { "content":theData.desc, "url":theData.link }, function (resp) { switch (resp.err_msg) { // share_weibo:cancel 用戶取消 case 'share_weibo:cancel': callbacks.cancel && callbacks.cancel(resp); break; // share_weibo:confirm 發送成功 case 'share_weibo:confirm': case 'share_weibo:ok': callbacks.confirm && callbacks.confirm(resp); break; // share_weibo:fail 發送失敗 case 'share_weibo:fail': default: callbacks.fail && callbacks.fail(resp); break; } // 不管成功失敗都會執行的回調 callbacks.all && callbacks.all(resp); }); }; WeixinJSBridge.on('menu:share:weibo', function (argv) { if (callbacks.async && callbacks.ready) { window["_wx_loadedCb_"] = callbacks.dataLoaded || new Function(); if(window["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) { window["_wx_loadedCb_"] = new Function(); } callbacks.dataLoaded = function (newData) { window["_wx_loadedCb_"](newData); shareWeibo(newData); }; // 而後就緒 callbacks.ready && callbacks.ready(argv); } else { // 就緒狀態 callbacks.ready && callbacks.ready(argv); shareWeibo(data); } }); } /** * 新的分享接口 * @param {Object} data 待分享的信息 * @p-config {String} appId 公衆平臺的appId(服務號可用) * @p-config {String} imgUrl 圖片地址 * @p-config {String} link 連接地址 * @p-config {String} desc 描述 * @p-config {String} title 分享的標題 * * @param {Object} callbacks 相關回調方法 * @p-config {Boolean} async ready方法是否須要異步執行,默認false * @p-config {Function} ready(argv,shareTo) 就緒狀態 * @p-config {Function} dataLoaded(data) 數據加載完成後調用,async爲true時有用,也能夠爲空 * @p-config {Function} cancel(resp,shareTo) 取消 * @p-config {Function} fail(resp,shareTo) 失敗 * @p-config {Function} confirm(resp,shareTo) 成功 * @p-config {Function} all(resp,shareTo) 不管成功失敗都會執行的回調 */ function weixinGeneralShare(data, callbacks) { callbacks = callbacks || {}; var generalShare = function (general,theData) { // 若是是分享到朋友圈,則須要把title和desc交換一下 if(general.shareTo == 'timeline') { var title = theData.title; theData.title = theData.desc || title; theData.desc = title; } // 分享出去 general.generalShare({ "appid":theData.appId ? theData.appId : '', "img_url":theData.imgUrl, "link":theData.link, "desc":theData.desc, "title":theData.title, "img_width":"640", "img_height":"640" }, function (resp) { switch (resp.err_msg) { // general_share:cancel 用戶取消 case 'general_share:cancel': callbacks.cancel && callbacks.cancel(resp ,general.shareTo); break; // general_share:confirm 發送成功 case 'general_share:confirm': case 'general_share:ok': callbacks.confirm && callbacks.confirm(resp ,general.shareTo); break; // general_share:fail 發送失敗 case 'general_share:fail': default: callbacks.fail && callbacks.fail(resp ,general.shareTo); break; } // 不管成功失敗都會執行的回調 callbacks.all && callbacks.all(resp ,general.shareTo); }); }; WeixinJSBridge.on('menu:general:share', function (general) { if (callbacks.async && callbacks.ready) { window["_wx_loadedCb_"] = callbacks.dataLoaded || new Function(); if(window["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) { window["_wx_loadedCb_"] = new Function(); } callbacks.dataLoaded = function (newData) { window["_wx_loadedCb_"](newData); generalShare(general,newData); }; // 而後就緒 callbacks.ready && callbacks.ready(general,general.shareTo); } else { // 就緒狀態 callbacks.ready && callbacks.ready(general,general.shareTo); generalShare(general,data); } }); } /** * 加關注(此功能只是暫時先加上,不過由於權限限制問題,不能用,若是你的站點是部署在*.qq.com下,也許可行) * @param {String} appWeixinId 微信公衆號ID * @param {Object} callbacks 回調方法 * @p-config {Function} fail(resp) 失敗 * @p-config {Function} confirm(resp) 成功 */ function addContact(appWeixinId,callbacks){ callbacks = callbacks || {}; WeixinJSBridge.invoke("addContact", { webtype: "1", username: appWeixinId }, function (resp) { var success = !resp.err_msg || "add_contact:ok" == resp.err_msg || "add_contact:added" == resp.err_msg; if(success) { callbacks.success && callbacks.success(resp); }else{ callbacks.fail && callbacks.fail(resp); } }) } /** * 調起微信Native的圖片播放組件。 * 這裏必須對參數進行強檢測,若是參數不合法,直接會致使微信客戶端crash * * @param {String} curSrc 當前播放的圖片地址 * @param {Array} srcList 圖片地址列表 */ function imagePreview(curSrc,srcList) { if(!curSrc || !srcList || srcList.length == 0) { return; } WeixinJSBridge.invoke('imagePreview', { 'current' : curSrc, 'urls' : srcList }); } /** * 顯示網頁右上角的按鈕 */ function showOptionMenu() { WeixinJSBridge.call('showOptionMenu'); } /** * 隱藏網頁右上角的按鈕 */ function hideOptionMenu() { WeixinJSBridge.call('hideOptionMenu'); } /** * 顯示底部工具欄 */ function showToolbar() { WeixinJSBridge.call('showToolbar'); } /** * 隱藏底部工具欄 */ function hideToolbar() { WeixinJSBridge.call('hideToolbar'); } /** * 返回以下幾種類型: * * network_type:wifi wifi網絡 * network_type:edge 非wifi,包含3G/2G * network_type:fail 網絡斷開鏈接 * network_type:wwan 2g或者3g * * 使用方法: * WeixinApi.getNetworkType(function(networkType){ * * }); * * @param callback */ function getNetworkType(callback) { if (callback && typeof callback == 'function') { WeixinJSBridge.invoke('getNetworkType', {}, function (e) { // 在這裏拿到e.err_msg,這裏面就包含了全部的網絡類型 callback(e.err_msg); }); } } /** * 關閉當前微信公衆平臺頁面 * @param {Object} callbacks 回調方法 * @p-config {Function} fail(resp) 失敗 * @p-config {Function} success(resp) 成功 */ function closeWindow(callbacks) { callbacks = callbacks || {}; WeixinJSBridge.invoke("closeWindow",{},function(resp){ switch (resp.err_msg) { // 關閉成功 case 'close_window:ok': callbacks.success && callbacks.success(resp); break; // 關閉失敗 default : callbacks.fail && callbacks.fail(resp); break; } }); } /** * 當頁面加載完畢後執行,使用方法: * WeixinApi.ready(function(Api){ * // 從這裏只用Api便是WeixinApi * }); * @param readyCallback */ function wxJsBridgeReady(readyCallback) { if (readyCallback && typeof readyCallback == 'function') { var Api = this; var wxReadyFunc = function () { readyCallback(Api); }; if (typeof window.WeixinJSBridge == "undefined"){ if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', wxReadyFunc, false); } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', wxReadyFunc); document.attachEvent('onWeixinJSBridgeReady', wxReadyFunc); } }else{ wxReadyFunc(); } } } /** * 判斷當前網頁是否在微信內置瀏覽器中打開 */ function openInWeixin(){ return /MicroMessenger/i.test(navigator.userAgent); } /* * 打開掃描二維碼 * @param {Object} callbacks 回調方法 * @p-config {Function} fail(resp) 失敗 * @p-config {Function} success(resp) 成功 */ function scanQRCode (callbacks) { callbacks = callbacks || {}; WeixinJSBridge.invoke("scanQRCode",{},function(resp){ switch (resp.err_msg) { // 打開掃描器成功 case 'scan_qrcode:ok': callbacks.success && callbacks.success(resp); break; // 打開掃描器失敗 default : callbacks.fail && callbacks.fail(resp); break; } }); } /** * 檢測應用程序是否已安裝 * by mingcheng 2014-10-17 * * @param {Object} data 應用程序的信息 * @p-config {String} packageUrl 應用註冊的自定義前綴,如 xxx:// 就取 xxx * @p-config {String} packageName 應用的包名 * * @param {Object} callbacks 相關回調方法 * @p-config {Function} fail(resp) 失敗 * @p-config {Function} success(resp) 成功,若是有對應的版本信息,則寫入到 resp.version 中 * @p-config {Function} all(resp) 不管成功失敗都會執行的回調 */ function getInstallState(data, callbacks) { callbacks = callbacks || {}; WeixinJSBridge.invoke("getInstallState", { "packageUrl": data.packageUrl || "", "packageName": data.packageName || "" }, function(resp) { var msg = resp.err_msg, match = msg.match(/state:yes_?(.*)$/); if (match) { resp.version = match[1] || ""; callbacks.success && callbacks.success(resp); } else { callbacks.fail && callbacks.fail(resp); } callbacks.all && callbacks.all(resp); }); } /** * 開啓Api的debug模式,好比出了個什麼錯誤,能alert告訴你,而不是一直很苦逼的在想哪兒出問題了 * @param {Function} callback(error) 出錯後的回調,默認是alert */ function enableDebugMode(callback){ /** * @param {String} errorMessage 錯誤信息 * @param {String} scriptURI 出錯的文件 * @param {Long} lineNumber 出錯代碼的行號 * @param {Long} columnNumber 出錯代碼的列號 */ window.onerror = function(errorMessage, scriptURI, lineNumber,columnNumber) { // 有callback的狀況下,將錯誤信息傳遞到options.callback中 if(typeof callback === 'function'){ callback({ message : errorMessage, script : scriptURI, line : lineNumber, column : columnNumber }); }else{ // 其餘狀況,都以alert方式直接提示錯誤信息 var msgs = []; msgs.push("額,代碼有錯。。。"); msgs.push("\n錯誤信息:" , errorMessage); msgs.push("\n出錯文件:" , scriptURI); msgs.push("\n出錯位置:" , lineNumber + '行,' + columnNumber + '列'); alert(msgs.join('')); } } } return { version :"2.5", enableDebugMode :enableDebugMode, ready :wxJsBridgeReady, shareToTimeline :weixinShareTimeline, shareToWeibo :weixinShareWeibo, shareToFriend :weixinSendAppMessage, generalShare :weixinGeneralShare, addContact :addContact, showOptionMenu :showOptionMenu, hideOptionMenu :hideOptionMenu, showToolbar :showToolbar, hideToolbar :hideToolbar, getNetworkType :getNetworkType, imagePreview :imagePreview, closeWindow :closeWindow, openInWeixin :openInWeixin, getInstallState :getInstallState, scanQRCode :scanQRCode }; })();