首页 > 代码库 > 微信分享功能不可用+不能产生回调

微信分享功能不可用+不能产生回调

之前微信分享一直正常可用,可最近报出微信分享后不能按规定的图片描述链接分享,而且不能产生回调导致不能通过分享增加用户参与活动次数,老代码如下:

document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
        window.shareData = {  
            "imgUrl": "{$shareimg}", 
            "timeLineLink": "{$sharelink}",
            "sendFriendLink": "{$sharelink}",
            "weiboLink":  "{$sharelink}",
            "tTitle":  "{$sharetitle}",
            "tContent": "{$sharedesc}",
            "fTitle":  "{$sharetitle}",
            "fContent": "{$sharedesc}",
            "wContent": "{$sharedesc}",
        };
       /*发送给好友*/
        WeixinJSBridge.on('menu:share:appmessage', function (argv) {
            WeixinJSBridge.invoke('sendAppMessage', { 
                "img_url": window.shareData.imgUrl,
                "img_width": "640",
                "img_height": "640",
                "link": window.shareData.sendFriendLink,
                "desc": window.shareData.fContent,
                "title": window.shareData.fTitle
            }, function (res) {
                   if(res.err_msg == 'send_app_msg:ok' || res.err_msg == 'send_app_msg:confirm'){
                        //转发成功
                        $.ajax({
                            type: 'POST',
                            url: "{php echo $this->createMobileUrl('setadd', array('id' => $id))}",
                            //data: {"id":0},
                            dataType: 'json',
                            success: function(e) {                               
                            alert(e.msg);    
                            if (e.success!=0){
                                $("#lcount").text(e.success);
                            }
                            return true;
                            },
                            error: function(e, t) {
                                return false;
                            }
                        });
                    };
                _report('send_msg', res.err_msg);
            })
        });

        //分享到朋友圈
        WeixinJSBridge.on('menu:share:timeline', function (argv) {
            WeixinJSBridge.invoke('shareTimeline', {
                "img_url": window.shareData.imgUrl,
                "img_width": "640",
                "img_height": "640",
                "link": window.shareData.timeLineLink,
                "desc": window.shareData.tContent,
                "title": window.shareData.tTitle
            }, function (res) {
                if(res.err_msg == 'share_timeline:ok' || res.err_msg == 'share_timeline:confirm'){
                        //转发成功
                        $.ajax({
                            type: 'POST',
                            url: "{php echo $this->createMobileUrl('setadd', array('id' => $id))}",
                            //data: {"id":0},
                            dataType: 'json',
                            success: function(e) {                               
                            alert(e.msg);
                            if (e.success!=0){
                                $("#lcount").text(e.success);
                            }
                            return true;
                            },
                            error: function(e, t) {
                                return false;
                            }
                        });
                    };
                _report('timeline', res.err_msg);
            });
        });

        //分享到微博
        WeixinJSBridge.on('menu:share:weibo', function (argv) {
            WeixinJSBridge.invoke('shareWeibo', {
                "content": window.shareData.wContent,
                "url": window.shareData.weiboLink,
            }, function (res) {
                _report('weibo', res.err_msg);
            });
        });
        }, false)

网上查找资料发现,腾讯为打击诱导分享可能做了一些改动技术分享

技术分享
在github上找到了民间高手发布的weixinAPI,实践证明可用可行,代码如下:

/**!
 * 微信内置浏览器的Javascript API,功能包括:
 *
 * 1、分享到微信朋友圈
 * 2、分享给微信好友
 * 3、分享到腾讯微博
 * 4、隐藏/显示右上角的菜单入口
 * 5、隐藏/显示底部浏览器工具栏
 * 6、获取当前的网络状态
 * 7、调起微信客户端的图片播放组件
 * 8、关闭公众平台Web页面
 * 9、判断当前网页是否在微信内置浏览器中打开
 * 10、支持WeixinApi的错误监控
 * 11、发送电子邮件
 * 12、禁止用户分享
 *
 * @author zhaoxianlie(http://www.baidufe.com)
 */
(function (window) {

    "use strict";

    /**
     * 定义WeixinApi
     */
    var WeixinApi = {
        version: 4.3
    };

    // 将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;
            });
        }
    }

    /**
     * 对象简单继承,后面的覆盖前面的,继承深度:deep=1
     * @private
     */
    var _extend = function () {
        var result = {}, obj, k;
        for (var i = 0, len = arguments.length; i < len; i++) {
            obj = arguments[i];
            if (typeof obj === 'object') {
                for (k in obj) {
                    obj[k] && (result[k] = obj[k]);
                }
            }
        }
        return result;
    };

    /**
     * 内部私有方法,分享用
     * @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:share:timeline' ||
                (cmd.menu == 'general:share' && argv.shareTo == 'timeline')) {

                var title = theData.title;
                theData.title = theData.desc || title;
                theData.desc = title || theData.desc;
            }

            // 如果是收藏操作,并且在wxCallbacks中配置了favorite为false,则不执行回调
            if (argv && (argv.shareTo == 'favorite' || argv.scene == 'favorite')) {
                if (callbacks.favorite === false) {
                    WeixinJSBridge.invoke('sendAppMessage', theData, new Function());
                } else {
                    WeixinJSBridge.invoke(cmd.action, theData, progress);
                }
            } else {
                // 新的分享接口,单独处理
                if (cmd.menu === 'general:share') {
                    if (argv.shareTo === 'timeline') {
                        WeixinJSBridge.invoke('shareTimeline', theData, progress);
                    } else if (argv.shareTo === 'friend') {
                        WeixinJSBridge.invoke('sendAppMessage', theData, progress);
                    } else if (argv.shareTo === 'QQ') {
                        WeixinJSBridge.invoke('shareQQ', theData, progress);
                    } else if (argv.shareTo === 'weibo') {
                        WeixinJSBridge.invoke('shareWeibo', theData, progress);
                    }
                } else {
                    WeixinJSBridge.invoke(cmd.action, theData, progress);
                }
            }
        };

        // 监听分享操作
        WeixinJSBridge.on(cmd.menu, function (argv) {
            callbacks.dataLoaded = callbacks.dataLoaded || new Function();
            if (callbacks.async && callbacks.ready) {
                WeixinApi["_wx_loadedCb_"] = callbacks.dataLoaded;
                if (WeixinApi["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) {
                    WeixinApi["_wx_loadedCb_"] = new Function();
                }
                callbacks.dataLoaded = function (newData) {
                    callbacks.__cbkCalled = true;
                    var theData = http://www.mamicode.com/_extend(data, newData);>
加入了share.js后,可以通过WeixinApi.ready()来完成分享功能

		// 需要分享的内容,请放到ready里
		WeixinApi.ready(function(Api) {
			// 微信分享的数据
			var wxData = {
				"imgUrl": "{$shareimg}", 
			    "link" : "{$sharelink}",
			    "desc" : "{$sharedesc}",
			    "title" : "{$sharetitle}"
			};
			// 分享的回调
			var wxCallbacks = {
			    // 收藏操作是否触发回调,默认是开启的
			    favorite : false,
			    // 分享操作开始之前
			    ready : function() {
			        // 你可以在这里对分享的数据进行重组
	        
			    },
			    // 分享被用户自动取消
			    cancel : function(resp) {
			        // 你可以在你的页面上给用户一个小Tip,为什么要取消呢?
	        
			    },
			    // 分享失败了
			    fail : function(resp) {
			        // 分享失败了,是不是可以告诉用户:不要紧,可能是网络问题,一会儿再试试?
	        
			    },
			    // 分享成功
			    confirm : function(resp) {
			        // 分享成功了,我们是不是可以做一些分享统计呢?
	        		//转发成功
                        $.ajax({
                            type: 'POST',
                            url: "{php echo $this->createMobileUrl('setadd', array('id' => $id))}",
                            //data: {"id":0},
                            dataType: 'json',
                            success: function(e) {                               
                            alert(e.msg);    
                            if (e.success!=0){
                                $("#lcount").text(e.success);
                            }
                            return true;
                            },
                            error: function(e, t) {
                                return false;
                            }
                        });
			    },
			    // 整个分享过程结束
			    all : function(resp,shareTo) {
			        // 如果你做的是一个鼓励用户进行分享的产品,在这里是不是可以给用户一些反馈了?
	        
			    }
			};
			// 用户点开右上角popup菜单后,点击分享给好友,会执行下面这个代码
			Api.shareToFriend(wxData, wxCallbacks);
			// 点击分享到朋友圈,会执行下面这个代码
			Api.shareToTimeline(wxData, wxCallbacks);
			// 点击分享到腾讯微博,会执行下面这个代码
			Api.shareToWeibo(wxData, wxCallbacks);
			// iOS上,可以直接调用这个API进行分享,一句话搞定
			Api.generalShare(wxData,wxCallbacks);
		}); 

回调里面控制了分享过程中的各个流程




微信分享功能不可用+不能产生回调