WeixinApi.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /**!
  2. * 微信内置浏览器的Javascript API,功能包括:
  3. *
  4. * 1、分享到微信朋友圈
  5. * 2、分享给微信好友
  6. * 3、分享到腾讯微博
  7. * 4、隐藏/显示右上角的菜单入口
  8. * 5、隐藏/显示底部浏览器工具栏
  9. * 6、获取当前的网络状态
  10. * 7、调起微信客户端的图片播放组件
  11. * 8、关闭公众平台Web页面
  12. *
  13. * @author zhaoxianlie(http://www.baidufe.com)
  14. */
  15. window.onerror = function(){
  16. //alert (arguments[0] + arguments[1] + arguments[2])
  17. }
  18. var WeixinApi = (function () {
  19. "use strict";
  20. /**
  21. * 分享到微信朋友圈
  22. * @param {Object} data 待分享的信息
  23. * @p-config {String} appId 公众平台的appId(服务号可用)
  24. * @p-config {String} imageUrl 图片地址
  25. * @p-config {String} link 链接地址
  26. * @p-config {String} desc 描述
  27. * @p-config {String} title 分享的标题
  28. *
  29. * @param {Object} callbacks 相关回调方法
  30. * @p-config {Boolean} async ready方法是否需要异步执行,默认false
  31. * @p-config {Function} ready(argv) 就绪状态
  32. * @p-config {Function} dataLoaded(data) 数据加载完成后调用,async为true时有用,也可以为空
  33. * @p-config {Function} cancel(resp) 取消
  34. * @p-config {Function} fail(resp) 失败
  35. * @p-config {Function} confirm(resp) 成功
  36. * @p-config {Function} all(resp) 无论成功失败都会执行的回调
  37. */
  38. function weixinShareTimeline(data, callbacks) {
  39. callbacks = callbacks || {};
  40. var shareTimeline = function (theData) {
  41. WeixinJSBridge.invoke('shareTimeline', {
  42. "appid":theData.appId ? theData.appId : '',
  43. "img_url":theData.imgUrl,
  44. "link":window.location.href,
  45. "desc":theData.title,
  46. "title":theData.desc,// 注意这里要分享出去的内容是desc
  47. "img_width":"122",
  48. "img_height":"122"
  49. }, function (resp) {
  50. switch (resp.err_msg) {
  51. // share_timeline:cancel 用户取消
  52. case 'share_timeline:cancel':
  53. callbacks.cancel && callbacks.cancel(resp);
  54. break;
  55. // share_timeline:fail 发送失败
  56. case 'share_timeline:fail':
  57. callbacks.fail && callbacks.fail(resp);
  58. break;
  59. // share_timeline:confirm 发送成功
  60. case 'share_timeline:confirm':
  61. case 'share_timeline:ok':
  62. callbacks.confirm && callbacks.confirm(resp);
  63. break;
  64. }
  65. // 无论成功失败都会执行的回调
  66. callbacks.all && callbacks.all(resp);
  67. });
  68. };
  69. WeixinJSBridge.on('menu:share:timeline', function (argv) {
  70. if (callbacks.async && callbacks.ready) {
  71. window["_wx_loadedCb_"] = callbacks.dataLoaded || new Function();
  72. if(window["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) {
  73. window["_wx_loadedCb_"] = new Function();
  74. }
  75. callbacks.dataLoaded = function (newData) {
  76. window["_wx_loadedCb_"](newData);
  77. shareTimeline(newData);
  78. };
  79. // 然后就绪
  80. callbacks.ready && callbacks.ready(argv);
  81. } else {
  82. // 就绪状态
  83. callbacks.ready && callbacks.ready(argv);
  84. shareTimeline(data);
  85. }
  86. });
  87. }
  88. /**
  89. * 发送给微信上的好友
  90. * @param {Object} data 待分享的信息
  91. * @p-config {String} appId 公众平台的appId(服务号可用)
  92. * @p-config {String} imageUrl 图片地址
  93. * @p-config {String} link 链接地址
  94. * @p-config {String} desc 描述
  95. * @p-config {String} title 分享的标题
  96. *
  97. * @param {Object} callbacks 相关回调方法
  98. * @p-config {Boolean} async ready方法是否需要异步执行,默认false
  99. * @p-config {Function} ready(argv) 就绪状态
  100. * @p-config {Function} dataLoaded(data) 数据加载完成后调用,async为true时有用,也可以为空
  101. * @p-config {Function} cancel(resp) 取消
  102. * @p-config {Function} fail(resp) 失败
  103. * @p-config {Function} confirm(resp) 成功
  104. * @p-config {Function} all(resp) 无论成功失败都会执行的回调
  105. */
  106. function weixinSendAppMessage(data, callbacks) {
  107. callbacks = callbacks || {};
  108. var sendAppMessage = function (theData) {
  109. WeixinJSBridge.invoke('sendAppMessage', {
  110. "appid":theData.appId ? theData.appId : '',
  111. "img_url":"http://m.2144.cn/act/wxhtml5/ygys/185111_2259.jpg",
  112. "link":"http://m.2144.cn/act/wxhtml5/ygys/",
  113. "desc":theData.desc,
  114. "title":"愚公移山",
  115. "img_width":"122",
  116. "img_height":"122"
  117. }, function (resp) {
  118. switch (resp.err_msg) {
  119. // send_app_msg:cancel 用户取消
  120. case 'send_app_msg:cancel':
  121. callbacks.cancel && callbacks.cancel(resp);
  122. break;
  123. // send_app_msg:fail 发送失败
  124. case 'send_app_msg:fail':
  125. callbacks.fail && callbacks.fail(resp);
  126. break;
  127. // send_app_msg:confirm 发送成功
  128. case 'send_app_msg:confirm':
  129. case 'send_app_msg:ok':
  130. callbacks.confirm && callbacks.confirm(resp);
  131. break;
  132. }
  133. // 无论成功失败都会执行的回调
  134. callbacks.all && callbacks.all(resp);
  135. });
  136. };
  137. WeixinJSBridge.on('menu:share:appmessage', function (argv) {
  138. if (callbacks.async && callbacks.ready) {
  139. window["_wx_loadedCb_"] = callbacks.dataLoaded || new Function();
  140. if(window["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) {
  141. window["_wx_loadedCb_"] = new Function();
  142. }
  143. callbacks.dataLoaded = function (newData) {
  144. window["_wx_loadedCb_"](newData);
  145. sendAppMessage(newData);
  146. };
  147. // 然后就绪
  148. callbacks.ready && callbacks.ready(argv);
  149. } else {
  150. // 就绪状态
  151. callbacks.ready && callbacks.ready(argv);
  152. sendAppMessage(data);
  153. }
  154. });
  155. }
  156. /**
  157. * 分享到腾讯微博
  158. * @param {Object} data 待分享的信息
  159. * @p-config {String} link 链接地址
  160. * @p-config {String} desc 描述
  161. *
  162. * @param {Object} callbacks 相关回调方法
  163. * @p-config {Boolean} async ready方法是否需要异步执行,默认false
  164. * @p-config {Function} ready(argv) 就绪状态
  165. * @p-config {Function} dataLoaded(data) 数据加载完成后调用,async为true时有用,也可以为空
  166. * @p-config {Function} cancel(resp) 取消
  167. * @p-config {Function} fail(resp) 失败
  168. * @p-config {Function} confirm(resp) 成功
  169. * @p-config {Function} all(resp) 无论成功失败都会执行的回调
  170. */
  171. function weixinShareWeibo(data, callbacks) {
  172. callbacks = callbacks || {};
  173. var shareWeibo = function (theData) {
  174. WeixinJSBridge.invoke('shareWeibo', {
  175. "content":theData.desc,
  176. "url":window.location.href,
  177. }, function (resp) {
  178. switch (resp.err_msg) {
  179. // share_weibo:cancel 用户取消
  180. case 'share_weibo:cancel':
  181. callbacks.cancel && callbacks.cancel(resp);
  182. break;
  183. // share_weibo:fail 发送失败
  184. case 'share_weibo:fail':
  185. callbacks.fail && callbacks.fail(resp);
  186. break;
  187. // share_weibo:confirm 发送成功
  188. case 'share_weibo:confirm':
  189. case 'share_weibo:ok':
  190. callbacks.confirm && callbacks.confirm(resp);
  191. break;
  192. }
  193. // 无论成功失败都会执行的回调
  194. callbacks.all && callbacks.all(resp);
  195. });
  196. };
  197. WeixinJSBridge.on('menu:share:weibo', function (argv) {
  198. if (callbacks.async && callbacks.ready) {
  199. window["_wx_loadedCb_"] = callbacks.dataLoaded || new Function();
  200. if(window["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) {
  201. window["_wx_loadedCb_"] = new Function();
  202. }
  203. callbacks.dataLoaded = function (newData) {
  204. window["_wx_loadedCb_"](newData);
  205. shareWeibo(newData);
  206. };
  207. // 然后就绪
  208. callbacks.ready && callbacks.ready(argv);
  209. } else {
  210. // 就绪状态
  211. callbacks.ready && callbacks.ready(argv);
  212. shareWeibo(data);
  213. }
  214. });
  215. }
  216. /**
  217. * 调起微信Native的图片播放组件。
  218. * 这里必须对参数进行强检测,如果参数不合法,直接会导致微信客户端crash
  219. *
  220. * @param {String} curSrc 当前播放的图片地址
  221. * @param {Array} srcList 图片地址列表
  222. */
  223. function imagePreview(curSrc,srcList) {
  224. if(!curSrc || !srcList || srcList.length == 0) {
  225. return;
  226. }
  227. WeixinJSBridge.invoke('imagePreview', {
  228. 'current' : curSrc,
  229. 'urls' : srcList
  230. });
  231. }
  232. /**
  233. * 显示网页右上角的按钮
  234. */
  235. function showOptionMenu() {
  236. WeixinJSBridge.call('showOptionMenu');
  237. }
  238. /**
  239. * 隐藏网页右上角的按钮
  240. */
  241. function hideOptionMenu() {
  242. WeixinJSBridge.call('hideOptionMenu');
  243. }
  244. /**
  245. * 显示底部工具栏
  246. */
  247. function showToolbar() {
  248. WeixinJSBridge.call('showToolbar');
  249. }
  250. /**
  251. * 隐藏底部工具栏
  252. */
  253. function hideToolbar() {
  254. WeixinJSBridge.call('hideToolbar');
  255. }
  256. /**
  257. * 返回如下几种类型:
  258. *
  259. * network_type:wifi wifi网络
  260. * network_type:edge 非wifi,包含3G/2G
  261. * network_type:fail 网络断开连接
  262. * network_type:wwan 2g或者3g
  263. *
  264. * 使用方法:
  265. * WeixinApi.getNetworkType(function(networkType){
  266. *
  267. * });
  268. *
  269. * @param callback
  270. */
  271. function getNetworkType(callback) {
  272. if (callback && typeof callback == 'function') {
  273. WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
  274. // 在这里拿到e.err_msg,这里面就包含了所有的网络类型
  275. callback(e.err_msg);
  276. });
  277. }
  278. }
  279. /**
  280. * 关闭当前微信公众平台页面
  281. */
  282. function closeWindow() {
  283. WeixinJSBridge.call("closeWindow");
  284. }
  285. /**
  286. * 当页面加载完毕后执行,使用方法:
  287. * WeixinApi.ready(function(Api){
  288. * // 从这里只用Api即是WeixinApi
  289. * });
  290. * @param readyCallback
  291. */
  292. function wxJsBridgeReady(readyCallback) {
  293. if (readyCallback && typeof readyCallback == 'function') {
  294. var Api = this;
  295. var wxReadyFunc = function () {
  296. readyCallback(Api);
  297. };
  298. if (typeof window.WeixinJSBridge == "undefined"){
  299. if (document.addEventListener) {
  300. document.addEventListener('WeixinJSBridgeReady', wxReadyFunc, false);
  301. } else if (document.attachEvent) {
  302. document.attachEvent('WeixinJSBridgeReady', wxReadyFunc);
  303. document.attachEvent('onWeixinJSBridgeReady', wxReadyFunc);
  304. }
  305. }else{
  306. wxReadyFunc();
  307. }
  308. }
  309. }
  310. return {
  311. version :"1.8",
  312. ready :wxJsBridgeReady,
  313. shareToTimeline :weixinShareTimeline,
  314. shareToWeibo :weixinShareWeibo,
  315. shareToFriend :weixinSendAppMessage,
  316. showOptionMenu :showOptionMenu,
  317. hideOptionMenu :hideOptionMenu,
  318. showToolbar :showToolbar,
  319. hideToolbar :hideToolbar,
  320. getNetworkType :getNetworkType,
  321. imagePreview :imagePreview,
  322. closeWindow :closeWindow
  323. };
  324. })();
  325. var WeixinShareInfo = function(){}
  326. var WeixinShareCallbackInfo = function(){}