专门用于微信公众平台的Javascript API

  1 /**!
  2  * 微信内置浏览器的Javascript API,功能包括:
  3  *
  4  * 1、分享到微信朋友圈
  5  * 2、分享给微信好友
  6  * 3、分享到腾讯微博
  7  * 4、新的分享接口,包含朋友圈、好友、微博的分享(for iOS)
  8  * 5、隐藏/显示右上角的菜单入口
  9  * 6、隐藏/显示底部浏览器工具栏
 10  * 7、获取当前的网络状态
 11  * 8、调起微信客户端的图片播放组件
 12  * 9、关闭公众平台Web页面
 13  * 10、判断当前网页是否在微信内置浏览器中打开
 14  * 11、增加打开扫描二维码
 15  * 12、支持WeixinApi的错误监控
 16  * 13、检测应用程序是否已经安装(需要官方开通权限)
 17  * 14、发送电子邮件
 18  * 15、禁止用户分享
 19  *
 20  * @author guanguoxiang(http://www.ggxapp.com)
 21  */
 22 (function (window) {
 23
 24     "use strict";
 25
 26     /**
 27      * 定义WeixinApi
 28      */
 29     var WeixinApi = {
 30         version: 4.1
 31     };
 32
 33     // 将WeixinApi暴露到window下:全局可使用,对旧版本向下兼容
 34     window.WeixinApi = WeixinApi;
 35
 36     /////////////////////////// CommonJS /////////////////////////////////
 37     if (typeof define === ‘function‘ && (define.amd || define.cmd)) {
 38         if (define.amd) {
 39             // AMD 规范,for:requirejs
 40             define(function () {
 41                 return WeixinApi;
 42             });
 43         } else if (define.cmd) {
 44             // CMD 规范,for:seajs
 45             define(function (require, exports, module) {
 46                 module.exports = WeixinApi;
 47             });
 48         }
 49     }
 50
 51     /**
 52      * 对象简单继承,后面的覆盖前面的,继承深度:deep=1
 53      * @private
 54      */
 55     var _extend = function () {
 56         var result = {}, obj, k;
 57         for (var i = 0, len = arguments.length; i < len; i++) {
 58             obj = arguments[i];
 59             if (typeof obj === ‘object‘) {
 60                 for (k in obj) {
 61                     obj[k] && (result[k] = obj[k]);
 62                 }
 63             }
 64         }
 65         return result;
 66     };
 67
 68     /**
 69      * 内部私有方法,分享用
 70      * @private
 71      */
 72     var _share = function (cmd, data, callbacks) {
 73         callbacks = callbacks || {};
 74
 75         // 分享过程中的一些回调
 76         var progress = function (resp) {
 77             switch (true) {
 78                 // 用户取消
 79                 case /\:cancel$/i.test(resp.err_msg) :
 80                     callbacks.cancel && callbacks.cancel(resp);
 81                     break;
 82                 // 发送成功
 83                 case /\:(confirm|ok)$/i.test(resp.err_msg):
 84                     callbacks.confirm && callbacks.confirm(resp);
 85                     break;
 86                 // fail 发送失败
 87                 case /\:fail$/i.test(resp.err_msg) :
 88                 default:
 89                     callbacks.fail && callbacks.fail(resp);
 90                     break;
 91             }
 92             // 无论成功失败都会执行的回调
 93             callbacks.all && callbacks.all(resp);
 94         };
 95
 96         // 执行分享,并处理结果
 97         var handler = function (theData, argv) {
 98
 99             // 加工一下数据
100             if (cmd.menu == ‘menu:share:timeline‘ ||
101                 (cmd.menu == ‘general:share‘ && argv.shareTo == ‘timeline‘)) {
102
103                 var title = theData.title;
104                 theData.title = theData.desc || title;
105                 theData.desc = title || theData.desc;
106             }
107
108             // 新的分享接口,单独处理
109             if (cmd.menu === ‘general:share‘) {
110                 // 如果是收藏操作,并且在wxCallbacks中配置了favorite为false,则不执行回调
111                 if (argv.shareTo == ‘favorite‘ || argv.scene == ‘favorite‘) {
112                     if (callbacks.favorite === false) {
113                         return argv.generalShare(theData, function () {
114                         });
115                     }
116                 }
117                 if (argv.shareTo === ‘timeline‘) {
118                     WeixinJSBridge.invoke(‘shareTimeline‘, theData, progress);
119                 } else if (argv.shareTo === ‘friend‘) {
120                     WeixinJSBridge.invoke(‘sendAppMessage‘, theData, progress);
121                 } else if (argv.shareTo === ‘QQ‘) {
122                     WeixinJSBridge.invoke(‘shareQQ‘, theData, progress);
123                 }else if (argv.shareTo === ‘weibo‘) {
124                     WeixinJSBridge.invoke(‘shareWeibo‘, theData, progress);
125                 }
126             } else {
127                 WeixinJSBridge.invoke(cmd.action, theData, progress);
128             }
129         };
130
131         // 监听分享操作
132         WeixinJSBridge.on(cmd.menu, function (argv) {
133             callbacks.dataLoaded = callbacks.dataLoaded || new Function();
134             if (callbacks.async && callbacks.ready) {
135                 WeixinApi["_wx_loadedCb_"] = callbacks.dataLoaded;
136                 if (WeixinApi["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) {
137                     WeixinApi["_wx_loadedCb_"] = new Function();
138                 }
139                 callbacks.dataLoaded = function (newData) {
140                     callbacks.__cbkCalled = true;
141                     var theData = _extend(data, newData);
142                     theData.img_url = theData.imgUrl || theData.img_url;
143                     delete theData.imgUrl;
144                     WeixinApi["_wx_loadedCb_"](theData);
145                     handler(theData, argv);
146                 };
147                 // 然后就绪
148                 if (!(argv && (argv.shareTo == ‘favorite‘ || argv.scene == ‘favorite‘) && callbacks.favorite === false)) {
149                     callbacks.ready && callbacks.ready(argv, data);
150                     // 如果设置了async为true,但是在ready方法中并没有手动调用dataLoaded方法,则自动触发一次
151                     if (!callbacks.__cbkCalled) {
152                         callbacks.dataLoaded({});
153                         callbacks.__cbkCalled = false;
154                     }
155                 }
156             } else {
157                 // 就绪状态
158                 var theData = _extend(data);
159                 if (!(argv && (argv.shareTo == ‘favorite‘ || argv.scene == ‘favorite‘) && callbacks.favorite === false)) {
160                     callbacks.ready && callbacks.ready(argv, theData);
161                 }
162                 handler(theData, argv);
163             }
164         });
165     };
166
167     /**
168      * 分享到微信朋友圈
169      * @param       {Object}    data       待分享的信息
170      * @p-config    {String}    appId      公众平台的appId(服务号可用)
171      * @p-config    {String}    imgUrl     图片地址
172      * @p-config    {String}    link       链接地址
173      * @p-config    {String}    desc       描述
174      * @p-config    {String}    title      分享的标题
175      *
176      * @param       {Object}    callbacks  相关回调方法
177      * @p-config    {Boolean}   async                   ready方法是否需要异步执行,默认false
178      * @p-config    {Function}  ready(argv, data)       就绪状态
179      * @p-config    {Function}  dataLoaded(data)        数据加载完成后调用,async为true时有用,也可以为空
180      * @p-config    {Function}  cancel(resp)    取消
181      * @p-config    {Function}  fail(resp)      失败
182      * @p-config    {Function}  confirm(resp)   成功
183      * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调
184      */
185     WeixinApi.shareToTimeline = function (data, callbacks) {
186         _share({
187             menu: ‘menu:share:timeline‘,
188             action: ‘shareTimeline‘
189         }, {
190             "appid": data.appId ? data.appId : ‘‘,
191             "img_url": data.imgUrl,
192             "link": data.link,
193             "desc": data.desc,
194             "title": data.title,
195             "img_width": "640",
196             "img_height": "640"
197         }, callbacks);
198     };
199
200     /**
201      * 发送给微信上的好友
202      * @param       {Object}    data       待分享的信息
203      * @p-config    {String}    appId      公众平台的appId(服务号可用)
204      * @p-config    {String}    imgUrl     图片地址
205      * @p-config    {String}    link       链接地址
206      * @p-config    {String}    desc       描述
207      * @p-config    {String}    title      分享的标题
208      *
209      * @param       {Object}    callbacks  相关回调方法
210      * @p-config    {Boolean}   async                   ready方法是否需要异步执行,默认false
211      * @p-config    {Function}  ready(argv, data)       就绪状态
212      * @p-config    {Function}  dataLoaded(data)        数据加载完成后调用,async为true时有用,也可以为空
213      * @p-config    {Function}  cancel(resp)    取消
214      * @p-config    {Function}  fail(resp)      失败
215      * @p-config    {Function}  confirm(resp)   成功
216      * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调
217      */
218     WeixinApi.shareToFriend = function (data, callbacks) {
219         _share({
220             menu: ‘menu:share:appmessage‘,
221             action: ‘sendAppMessage‘
222         }, {
223             "appid": data.appId ? data.appId : ‘‘,
224             "img_url": data.imgUrl,
225             "link": data.link,
226             "desc": data.desc,
227             "title": data.title,
228             "img_width": "640",
229             "img_height": "640"
230         }, callbacks);
231     };
232
233
234     /**
235      * 分享到腾讯微博
236      * @param       {Object}    data       待分享的信息
237      * @p-config    {String}    link       链接地址
238      * @p-config    {String}    desc       描述
239      *
240      * @param       {Object}    callbacks  相关回调方法
241      * @p-config    {Boolean}   async                   ready方法是否需要异步执行,默认false
242      * @p-config    {Function}  ready(argv, data)       就绪状态
243      * @p-config    {Function}  dataLoaded(data)        数据加载完成后调用,async为true时有用,也可以为空
244      * @p-config    {Function}  cancel(resp)    取消
245      * @p-config    {Function}  fail(resp)      失败
246      * @p-config    {Function}  confirm(resp)   成功
247      * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调
248      */
249     WeixinApi.shareToWeibo = function (data, callbacks) {
250         _share({
251             menu: ‘menu:share:weibo‘,
252             action: ‘shareWeibo‘
253         }, {
254             "content": data.desc,
255             "url": data.link
256         }, callbacks);
257     };
258
259     /**
260      * 新的分享接口
261      * @param       {Object}    data       待分享的信息
262      * @p-config    {String}    appId      公众平台的appId(服务号可用)
263      * @p-config    {String}    imgUrl     图片地址
264      * @p-config    {String}    link       链接地址
265      * @p-config    {String}    desc       描述
266      * @p-config    {String}    title      分享的标题
267      *
268      * @param       {Object}    callbacks  相关回调方法
269      * @p-config    {Boolean}   async                   ready方法是否需要异步执行,默认false
270      * @p-config    {Function}  ready(argv, data)       就绪状态
271      * @p-config    {Function}  dataLoaded(data)        数据加载完成后调用,async为true时有用,也可以为空
272      * @p-config    {Function}  cancel(resp)    取消
273      * @p-config    {Function}  fail(resp)      失败
274      * @p-config    {Function}  confirm(resp)   成功
275      * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调
276      */
277     WeixinApi.generalShare = function (data, callbacks) {
278         _share({
279             menu: ‘general:share‘
280         }, {
281             "appid": data.appId ? data.appId : ‘‘,
282             "img_url": data.imgUrl,
283             "link": data.link,
284             "desc": data.desc,
285             "title": data.title,
286             "img_width": "640",
287             "img_height": "640"
288         }, callbacks);
289     };
290
291     /**
292      * 设置页面禁止分享:包括朋友圈、好友、腾讯微博、qq
293      * @param callback
294      */
295     WeixinApi.disabledShare = function (callback) {
296         callback = callback || function () {
297             alert(‘当前页面禁止分享!‘);
298         };
299         [‘menu:share:timeline‘, ‘menu:share:appmessage‘, ‘menu:share:qq‘,
300             ‘menu:share:weibo‘, ‘general:share‘].forEach(function (menu) {
301                 WeixinJSBridge.on(menu, function () {
302                     callback();
303                     return false;
304                 });
305             });
306     };
307
308     /**
309      * 加关注(此功能只是暂时先加上,不过因为权限限制问题,不能用,如果你的站点是部署在*.qq.com下,也许可行)
310      * @param       {String}    appWeixinId     微信公众号ID
311      * @param       {Object}    callbacks       回调方法
312      * @p-config    {Function}  fail(resp)      失败
313      * @p-config    {Function}  confirm(resp)   成功
314      */
315     WeixinApi.addContact = function (appWeixinId, callbacks) {
316         callbacks = callbacks || {};
317         WeixinJSBridge.invoke("addContact", {
318             webtype: "1",
319             username: appWeixinId
320         }, function (resp) {
321             var success = !resp.err_msg || "add_contact:ok" == resp.err_msg
322                 || "add_contact:added" == resp.err_msg;
323             if (success) {
324                 callbacks.success && callbacks.success(resp);
325             } else {
326                 callbacks.fail && callbacks.fail(resp);
327             }
328         })
329     };
330
331     /**
332      * 调起微信Native的图片播放组件。
333      * 这里必须对参数进行强检测,如果参数不合法,直接会导致微信客户端crash
334      *
335      * @param {String} curSrc 当前播放的图片地址
336      * @param {Array} srcList 图片地址列表
337      */
338     WeixinApi.imagePreview = function (curSrc, srcList) {
339         if (!curSrc || !srcList || srcList.length == 0) {
340             return;
341         }
342         WeixinJSBridge.invoke(‘imagePreview‘, {
343             ‘current‘: curSrc,
344             ‘urls‘: srcList
345         });
346     };
347
348     /**
349      * 显示网页右上角的按钮
350      */
351     WeixinApi.showOptionMenu = function () {
352         WeixinJSBridge.call(‘showOptionMenu‘);
353     };
354
355
356     /**
357      * 隐藏网页右上角的按钮
358      */
359     WeixinApi.hideOptionMenu = function () {
360         WeixinJSBridge.call(‘hideOptionMenu‘);
361     };
362
363     /**
364      * 显示底部工具栏
365      */
366     WeixinApi.showToolbar = function () {
367         WeixinJSBridge.call(‘showToolbar‘);
368     };
369
370     /**
371      * 隐藏底部工具栏
372      */
373     WeixinApi.hideToolbar = function () {
374         WeixinJSBridge.call(‘hideToolbar‘);
375     };
376
377     /**
378      * 返回如下几种类型:
379      *
380      * network_type:wifi     wifi网络
381      * network_type:edge     非wifi,包含3G/2G
382      * network_type:fail     网络断开连接
383      * network_type:wwan     2g或者3g
384      *
385      * 使用方法:
386      * WeixinApi.getNetworkType(function(networkType){
387      *
388      * });
389      *
390      * @param callback
391      */
392     WeixinApi.getNetworkType = function (callback) {
393         if (callback && typeof callback == ‘function‘) {
394             WeixinJSBridge.invoke(‘getNetworkType‘, {}, function (e) {
395                 // 在这里拿到e.err_msg,这里面就包含了所有的网络类型
396                 callback(e.err_msg);
397             });
398         }
399     };
400
401     /**
402      * 关闭当前微信公众平台页面
403      * @param       {Object}    callbacks       回调方法
404      * @p-config    {Function}  fail(resp)      失败
405      * @p-config    {Function}  success(resp)   成功
406      */
407     WeixinApi.closeWindow = function (callbacks) {
408         callbacks = callbacks || {};
409         WeixinJSBridge.invoke("closeWindow", {}, function (resp) {
410             switch (resp.err_msg) {
411                 // 关闭成功
412                 case ‘close_window:ok‘:
413                     callbacks.success && callbacks.success(resp);
414                     break;
415
416                 // 关闭失败
417                 default :
418                     callbacks.fail && callbacks.fail(resp);
419                     break;
420             }
421         });
422     };
423
424     /**
425      * 当页面加载完毕后执行,使用方法:
426      * WeixinApi.ready(function(Api){
427      *     // 从这里只用Api即是WeixinApi
428      * });
429      * @param readyCallback
430      */
431     WeixinApi.ready = function (readyCallback) {
432
433         /**
434          * 加一个钩子,同时解决Android和iOS下的分享问题
435          * @private
436          */
437         var _hook = function () {
438             var _WeixinJSBridge = {};
439             Object.keys(WeixinJSBridge).forEach(function (key) {
440                 _WeixinJSBridge[key] = WeixinJSBridge[key];
441             });
442             Object.keys(WeixinJSBridge).forEach(function (key) {
443                 if (typeof WeixinJSBridge[key] === ‘function‘) {
444                     WeixinJSBridge[key] = function () {
445                         try {
446                             var args = arguments.length > 0 ? arguments[0] : {},
447                                 runOn3rd_apis = args.__params ? args.__params.__runOn3rd_apis || [] : [];
448                             [‘menu:share:timeline‘, ‘menu:share:appmessage‘, ‘menu:share:weibo‘,
449                                 ‘menu:share:qq‘, ‘general:share‘].forEach(function (menu) {
450                                     runOn3rd_apis.indexOf(menu) === -1 && runOn3rd_apis.push(menu);
451                                 });
452                         } catch (e) {
453                         }
454                         return _WeixinJSBridge[key].apply(WeixinJSBridge, arguments);
455                     };
456                 }
457             });
458         };
459
460         if (readyCallback && typeof readyCallback == ‘function‘) {
461             var Api = this;
462             var wxReadyFunc = function () {
463                 _hook();
464                 readyCallback(Api);
465             };
466             if (typeof window.WeixinJSBridge == "undefined") {
467                 if (document.addEventListener) {
468                     document.addEventListener(‘WeixinJSBridgeReady‘, wxReadyFunc, false);
469                 } else if (document.attachEvent) {
470                     document.attachEvent(‘WeixinJSBridgeReady‘, wxReadyFunc);
471                     document.attachEvent(‘onWeixinJSBridgeReady‘, wxReadyFunc);
472                 }
473             } else {
474                 wxReadyFunc();
475             }
476         }
477     };
478
479     /**
480      * 判断当前网页是否在微信内置浏览器中打开
481      */
482     WeixinApi.openInWeixin = function () {
483         return /MicroMessenger/i.test(navigator.userAgent);
484     };
485
486     /*
487      * 打开扫描二维码
488      * @param       {Object}    callbacks       回调方法
489      * @p-config    {Boolean}   needResult      是否直接获取分享后的内容
490      * @p-config    {String}    desc            扫描二维码时的描述
491      * @p-config    {Function}  fail(resp)      失败
492      * @p-config    {Function}  success(resp)   成功
493      */
494     WeixinApi.scanQRCode = function (callbacks) {
495         callbacks = callbacks || {};
496         WeixinJSBridge.invoke("scanQRCode", {
497             needResult: callbacks.needResult ? 1 : 0,
498             desc: callbacks.desc || ‘WeixinApi Desc‘
499         }, function (resp) {
500             switch (resp.err_msg) {
501                 // 打开扫描器成功
502                 case ‘scanQRCode:ok‘:
503                 case ‘scan_qrcode:ok‘:
504                     callbacks.success && callbacks.success(resp);
505                     break;
506
507                 // 打开扫描器失败
508                 default :
509                     callbacks.fail && callbacks.fail(resp);
510                     break;
511             }
512         });
513     };
514
515     /**
516      * 检测应用程序是否已安装
517      *         by mingcheng 2014-10-17
518      *
519      * @param       {Object}    data               应用程序的信息
520      * @p-config    {String}    packageUrl      应用注册的自定义前缀,如 xxx:// 就取 xxx
521      * @p-config    {String}    packageName        应用的包名
522      *
523      * @param       {Object}    callbacks       相关回调方法
524      * @p-config    {Function}  fail(resp)      失败
525      * @p-config    {Function}  success(resp)   成功,如果有对应的版本信息,则写入到 resp.version 中
526      * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调
527      */
528     WeixinApi.getInstallState = function (data, callbacks) {
529         callbacks = callbacks || {};
530
531         WeixinJSBridge.invoke("getInstallState", {
532             "packageUrl": data.packageUrl || "",
533             "packageName": data.packageName || ""
534         }, function (resp) {
535             var msg = resp.err_msg, match = msg.match(/state:yes_?(.*)$/);
536             if (match) {
537                 resp.version = match[1] || "";
538                 callbacks.success && callbacks.success(resp);
539             } else {
540                 callbacks.fail && callbacks.fail(resp);
541             }
542
543             callbacks.all && callbacks.all(resp);
544         });
545     };
546
547     /**
548      * 发送邮件
549      * @param       {Object}  data      邮件初始内容
550      * @p-config    {String}  subject   邮件标题
551      * @p-config    {String}  body      邮件正文
552      *
553      * @param       {Object}    callbacks       相关回调方法
554      * @p-config    {Function}  fail(resp)      失败
555      * @p-config    {Function}  success(resp)   成功
556      * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调
557      */
558     WeixinApi.sendEmail = function (data, callbacks) {
559         callbacks = callbacks || {};
560         WeixinJSBridge.invoke("sendEmail", {
561             "title": data.subject,
562             "content": data.body
563         }, function (resp) {
564             if (resp.err_msg === ‘send_email:sent‘) {
565                 callbacks.success && callbacks.success(resp);
566             } else {
567                 callbacks.fail && callbacks.fail(resp);
568             }
569             callbacks.all && callbacks.all(resp);
570         })
571     };
572
573     /**
574      * 开启Api的debug模式,比如出了个什么错误,能alert告诉你,而不是一直很苦逼的在想哪儿出问题了
575      * @param    {Function}  callback(error) 出错后的回调,默认是alert
576      */
577     WeixinApi.enableDebugMode = function (callback) {
578         /**
579          * @param {String}  errorMessage   错误信息
580          * @param {String}  scriptURI      出错的文件
581          * @param {Long}    lineNumber     出错代码的行号
582          * @param {Long}    columnNumber   出错代码的列号
583          */
584         window.onerror = function (errorMessage, scriptURI, lineNumber, columnNumber) {
585
586             // 有callback的情况下,将错误信息传递到options.callback中
587             if (typeof callback === ‘function‘) {
588                 callback({
589                     message: errorMessage,
590                     script: scriptURI,
591                     line: lineNumber,
592                     column: columnNumber
593                 });
594             } else {
595                 // 其他情况,都以alert方式直接提示错误信息
596                 var msgs = [];
597                 msgs.push("额,代码有错。。。");
598                 msgs.push("\n错误信息:", errorMessage);
599                 msgs.push("\n出错文件:", scriptURI);
600                 msgs.push("\n出错位置:", lineNumber + ‘行,‘ + columnNumber + ‘列‘);
601                 alert(msgs.join(‘‘));
602             }
603         }
604     };
605
606 })(window);
时间: 2024-10-01 09:51:51

专门用于微信公众平台的Javascript API的相关文章

专门用于微信公众平台的Javascript API---导言

1.初始化等待分享 // 开发阶段,开启WeixinApi的调试模式 WeixinApi.enableDebugMode(); // 初始化WeixinApi,等待分享 WeixinApi.ready(function(Api) { // 微信分享的数据 var wxData = { "appId": "", // 服务号可以填写appId "imgUrl" : 'http://www.baidufe.com/fe/blog/static/img

可用于微信公众平台的机器人

微信大行其道,让很多开发者趋之若鹜,但是如果想做一个智能的公众帐号又非常困难. 图灵机器人平台,基于自然语言处理.知识库和云计算等技术,为广大开发者.合作伙伴提供的一系列智能语义处理能力(包括语义理解.智能问答.知识库对接等)的服务平台.截止到目前为止,平台已经积累了近百亿条语料库和GB级别的基础数据,经测试平台的整体准确度已经达到90%以上,而且平台已经应用于HTC的小Hi语音助手.中国电信的微信平台.海尔的智能家电控制系统等,广受企业的好评.  感兴趣的朋友或者你正好也在经营你的公众号,那就

微信公众平台开发基础知识38问

最近接触微信公众号后台的开发,看了一些资料基本可以满足简单的需求开发.笔者将这些问题及解答整理出来,以帮助更多初学者少走弯路. 1.订阅号与服务号的主要区别是什么? 订阅号每天能群发一条消息,没有自定义菜单及高级接口权限(目前 个人.企业订阅号关联腾讯微博认证之后才有自定义菜单):服务号有自定义菜单微信认证之后有高级接口权限,但每月只能群发一条消息. 2.到底该申请订阅号还是服务号? 申请哪种类型的公众账号,主要取决于账号的用途.服务号主要面向企业和组织,旨在为用户提供服务:订阅号主要面向媒体和

微信公众平台开发教程新手解惑40则

[编者按]由CSDN和<程序员>杂志联合主办的 2014年微信开发者大会 将于8月23日在北京举行,邀请了来自于一线的微信开发商技术负责人或资深工程师从企业应用开发高级篇.智能客服与LBS.微信支付.微信上的HTML5社交应用.微信小店开发等角度为与会者带来实战分享( 议程 ).目前报名处于优惠票价阶段,通过申请加入CSDN CTO俱乐部即可享受8折购票价格(票款中均含午餐),在8月1日前完成付款的同学还将免费获赠微信开发图书一本(两选一,活动现场发放).  值得一提的是,CSDN优秀博主.畅

微信公众平台开发教程第1篇-新手解惑

1.订阅号与服务号的主要区别是什么?订阅号每天能群发一条消息,没有自定义菜单及高级接口权限(目前 个人.企业订阅号关联腾讯微博认证之后才有自定义菜单):服务号有自定义菜单微信认证之后有高级接口权限,但每月只能群发一条消息. 2.到底该申请订阅号还是服务号?申请哪种类型的公众账号,主要取决于账号的用途.服务号主要面向企业和组织,旨在为用户提供服务:订阅号主要面向媒体和个人,旨在为用户提供信息和资讯. 3.订阅号是否支持编程开发?不管是订阅号,还是服务号,在高级功能中都有编辑模式和开发模式,订阅号也

微信公众平台开发调试方法

在这篇微信公众平台开发教程中,我们将介绍如何进行微信公众平台上的开发调试方法. 一.方倍微信调试器 微信调试器是方倍工作室开发的用于微信公众平台接口开发调试的工具,具有Token校验.模拟关注及取消关注.发送文本/图片/语音/视频/位置/链接.模拟事件发送等功能.其原型是微擎的Emulator. 微信调试器目前不支持IE浏览器下的使用,请下载Chrome浏览器或下载Firefox浏览器. 微信调试器的地址是 http://debug.fangbei.org/ .其界面如下 使用方法 1. Tok

微信好友限制人数5000个 微信公众平台是微信营销出路

刚过完520,微信就做出了一个新动作:微信好友数量将不能超过5000个,但"群不计算在内,订阅公号另计算",主要目的在于阻止大量恶意营销行为.个人微信号要成为营销工具越来越找不着方向了,微信公众平台才是出路. "这一举措实际上是为了遏制朋友圈的营销行为,因为普通用户的好友及关注的公众账号数量并不会有这么多,所以这个规定并不会阻碍普通用户使用微信."微信内部人士说. 个人微信号不好整了,整个微信公众平台吧,现在微信公众平台开发教程官方也放出,第三方的微信公众平台开放接

Django+wechatpy接入微信公众平台以及授权登录

确定Django环境可以正常运行,环境搭建见:Linux 搭建Nginx+uwsgi+Django环境 安装 wechatpy[cryptography] sudo pip3 install wechatpy[cryptography] 修改settings.py 接入微信公众号的连接去掉csrf验证,详情参考:解决Django+Vue前后端分离的跨域问题及关闭csrf验证的后半部分 在settings.py 加入微信公众号配置 AppID = '' AppSecret = '' Token =

微信公众平台开发(103) JS API支付

本文介绍如何使用JS API支付接口完成微信支付. 一.JS API支付接口(getBrandWCPayRequest) 微信JS API只能在微信内置浏览器中使用,其他浏览器调用无效.微信提供getBrandWCPayRequest接口供商户前端网页调用,调用之前微信会鉴定商户支付权限,若商户具有调起支付的权限,则将开始支付流程.这里主要介绍支付前的接口调用规则,支付状态消息通知机制请参加下文.接口需要注意:所有传入参数都是字符串类型! getBrandWCPayRequest参数如表6-5所