123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551 |
- /**!
- * 微信内置浏览器的Javascript API,功能包括:
- *
- * 1、分享到微信朋友圈
- * 2、分享给微信好友
- * 3、分享到腾讯微博
- * 4、新的分享接口,包含朋友圈、好友、微博的分享(for iOS)
- * 5、隐藏/显示右上角的菜单入口
- * 6、隐藏/显示底部浏览器工具栏
- * 7、获取当前的网络状态
- * 8、调起微信客户端的图片播放组件
- * 9、关闭公众平台Web页面
- * 10、判断当前网页是否在微信内置浏览器中打开
- * 11、增加打开扫描二维码
- * 12、支持WeixinApi的错误监控
- * 13、检测应用程序是否已经安装(需要官方开通权限)
- * 14、打开微信内置地图(认证过的公众号可用)
- * 15、发送电子邮件
- *
- * @author zhaoxianlie(http://www.baidufe.com)
- */
- (function (window) {
- "use strict";
- /**
- * 定义WeixinApi
- */
- var WeixinApi = {
- version:2.8
- };
- // 将WeixinApi暴露到window下:全局可使用,对旧版本向下兼容
- window.WeixinApi = WeixinApi;
- /////////////////////////// CommonJS /////////////////////////////////
- if (typeof define === 'function' && (define.amd || define.cmd)) {
- if (define.amd) {
- // AMD 规范,for:requirejs
- define(function () {
- return WeixinApi;
- });
- } else if (define.cmd) {
- // CMD 规范,for:seajs
- define(function (require, exports, module) {
- module.exports = WeixinApi;
- });
- }
- }
- /**
- * 内部私有方法,分享用
- * @private
- */
- var _share = function (cmd, data, callbacks) {
- callbacks = callbacks || {};
- // 分享过程中的一些回调
- var progress = function (resp) {
- switch (true) {
- // 用户取消
- case /\:cancel$/i.test(resp.err_msg) :
- callbacks.cancel && callbacks.cancel(resp);
- break;
- // 发送成功
- case /\:(confirm|ok)$/i.test(resp.err_msg):
- callbacks.confirm && callbacks.confirm(resp);
- break;
- // fail 发送失败
- case /\:fail$/i.test(resp.err_msg) :
- default:
- callbacks.fail && callbacks.fail(resp);
- break;
- }
- // 无论成功失败都会执行的回调
- callbacks.all && callbacks.all(resp);
- };
- // 执行分享,并处理结果
- var handler = function (theData, argv) {
- // 新的分享接口,单独处理
- if (cmd.menu === 'menu:general:share') {
- // 如果是分享到朋友圈,则需要把title和desc交换一下
- if (argv.shareTo == 'timeline') {
- var title = theData.title;
- theData.title = theData.desc || title;
- theData.desc = title;
- } else if (argv.shareTo == 'favorite') {
- // 如果是收藏操作,并且在wxCallbacks中配置了favorite为false,则不执行回调
- if (callbacks.favorite === false) {
- return argv.generalShare(theData, function () {
- });
- }
- }
- argv.generalShare(theData, progress);
- } else {
- WeixinJSBridge.invoke(cmd.action, theData, progress);
- }
- };
- // 监听分享操作
- WeixinJSBridge.on(cmd.menu, function (argv) {
- if (callbacks.async && callbacks.ready) {
- var _callbackKey = "_wx_loadedCb_";
- WeixinApi[_callbackKey] = callbacks.dataLoaded || new Function();
- if (WeixinApi[_callbackKey].toString().indexOf(_callbackKey) > 0) {
- WeixinApi[_callbackKey] = new Function();
- }
- callbacks.dataLoaded = function (newData) {
- WeixinApi[_callbackKey](newData);
- handler(newData, argv);
- };
- // 然后就绪
- if (!(argv && argv.shareTo == 'favorite' && callbacks.favorite === false)) {
- callbacks.ready && callbacks.ready(argv);
- }
- } else {
- // 就绪状态
- if (!(argv && argv.shareTo == 'favorite' && callbacks.favorite === false)) {
- callbacks.ready && callbacks.ready(argv);
- }
- handler(data, argv);
- }
- });
- };
- /**
- * 分享到微信朋友圈
- * @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) 无论成功失败都会执行的回调
- */
- WeixinApi.shareToTimeline = function (data, callbacks) {
- _share({
- menu:'menu:share:timeline',
- action:'shareTimeline'
- }, {
- "appid":data.appId ? data.appId : '',
- "img_url":data.imgUrl,
- "link":data.link,
- "desc":data.title,
- "title":data.desc,
- "img_width":"640",
- "img_height":"640"
- }, callbacks);
- };
- /**
- * 发送给微信上的好友
- * @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) 无论成功失败都会执行的回调
- */
- WeixinApi.shareToFriend = function (data, callbacks) {
- _share({
- menu:'menu:share:appmessage',
- action:'sendAppMessage'
- }, {
- "appid":data.appId ? data.appId : '',
- "img_url":data.imgUrl,
- "link":data.link,
- "desc":data.desc,
- "title":data.title,
- "img_width":"640",
- "img_height":"640"
- }, callbacks);
- };
- /**
- * 分享到腾讯微博
- * @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) 无论成功失败都会执行的回调
- */
- WeixinApi.shareToWeibo = function (data, callbacks) {
- _share({
- menu:'menu:share:weibo',
- action:'shareWeibo'
- }, {
- "content":data.desc,
- "url":data.link
- }, callbacks);
- };
- /**
- * 新的分享接口
- * @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) 无论成功失败都会执行的回调
- */
- WeixinApi.generalShare = function (data, callbacks) {
- _share({
- menu:'menu:general:share'
- }, {
- "appid":data.appId ? data.appId : '',
- "img_url":data.imgUrl,
- "link":data.link,
- "desc":data.title,
- "title":data.desc,
- "img_width":"640",
- "img_height":"640"
- }, callbacks);
- };
- /**
- * 加关注(此功能只是暂时先加上,不过因为权限限制问题,不能用,如果你的站点是部署在*.qq.com下,也许可行)
- * @param {String} appWeixinId 微信公众号ID
- * @param {Object} callbacks 回调方法
- * @p-config {Function} fail(resp) 失败
- * @p-config {Function} confirm(resp) 成功
- */
- WeixinApi.addContact = function (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 图片地址列表
- */
- WeixinApi.imagePreview = function (curSrc, srcList) {
- if (!curSrc || !srcList || srcList.length == 0) {
- return;
- }
- WeixinJSBridge.invoke('imagePreview', {
- 'current':curSrc,
- 'urls':srcList
- });
- };
- /**
- * 显示网页右上角的按钮
- */
- WeixinApi.showOptionMenu = function () {
- WeixinJSBridge.call('showOptionMenu');
- };
- /**
- * 隐藏网页右上角的按钮
- */
- WeixinApi.hideOptionMenu = function () {
- WeixinJSBridge.call('hideOptionMenu');
- };
- /**
- * 显示底部工具栏
- */
- WeixinApi.showToolbar = function () {
- WeixinJSBridge.call('showToolbar');
- };
- /**
- * 隐藏底部工具栏
- */
- WeixinApi.hideToolbar = function () {
- 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
- */
- WeixinApi.getNetworkType = function (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) 成功
- */
- WeixinApi.closeWindow = function (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
- */
- WeixinApi.ready = function (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();
- }
- }
- };
- /**
- * 判断当前网页是否在微信内置浏览器中打开
- */
- WeixinApi.openInWeixin = function () {
- return /MicroMessenger/i.test(navigator.userAgent);
- };
- /*
- * 打开扫描二维码
- * @param {Object} callbacks 回调方法
- * @p-config {Function} fail(resp) 失败
- * @p-config {Function} success(resp) 成功
- */
- WeixinApi.scanQRCode = function (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) 无论成功失败都会执行的回调
- */
- WeixinApi.getInstallState = function (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);
- });
- };
- /**
- * 从网页里直接调起微信地图
- *
- * @param {Object} data 打开地图所需要的数据
- * @p-config {String} latitude 纬度
- * @p-config {String} longitude 经度
- * @p-config {String} name POI名称
- * @p-config {String} adress 地址
- * @p-config {String} scale 缩放
- * @p-config {String} infoUrl 查看位置界面底部的超链接
- *
- * @param {Object} callbacks 相关回调方法
- * @p-config {Function} fail(resp) 失败
- * @p-config {Function} success(resp) 成功
- * @p-config {Function} all(resp) 无论成功失败都会执行的回调
- */
- WeixinApi.openLocation = function (data, callbacks) {
- callbacks = callbacks || {};
- WeixinJSBridge.invoke('openLocation', {
- "latitude":data.latitude,
- "longitude":data.longitude,
- "name":data.name,
- "address":data.address,
- "scale":data.scale || 14,
- "infoUrl":data.infoUrl || ''
- }, function (resp) {
- if (resp.err_msg === "open_location:ok") {
- callbacks.success && callbacks.success(resp);
- } else {
- callbacks.fail && callbacks.fail(resp);
- }
- callbacks.all && callbacks.all(resp);
- });
- };
- /**
- * 发送邮件
- * @param {Object} data 邮件初始内容
- * @p-config {String} subject 邮件标题
- * @p-config {String} body 邮件正文
- *
- * @param {Object} callbacks 相关回调方法
- * @p-config {Function} fail(resp) 失败
- * @p-config {Function} success(resp) 成功
- * @p-config {Function} all(resp) 无论成功失败都会执行的回调
- */
- WeixinApi.sendEmail = function (data, callbacks) {
- callbacks = callbacks || {};
- WeixinJSBridge.invoke("sendEmail", {
- "title":data.subject,
- "content":data.body
- }, function (resp) {
- if (resp.err_msg === 'send_email:sent') {
- callbacks.success && callbacks.success(resp);
- } else {
- callbacks.fail && callbacks.fail(resp);
- }
- callbacks.all && callbacks.all(resp);
- })
- };
- /**
- * 开启Api的debug模式,比如出了个什么错误,能alert告诉你,而不是一直很苦逼的在想哪儿出问题了
- * @param {Function} callback(error) 出错后的回调,默认是alert
- */
- WeixinApi.enableDebugMode = function (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(''));
- }
- }
- };
- })(window);
|