微信分享功能

不得不说,微信开发平台给的文档还是很多的,但是,细节没有到位,相信大家都觉得微信坑比,哈哈。话不多说,开始进入代码。

首先说说微信jssdk的问题,刚开始公众号jssdk是在后台加载,但是,我踩到了和大家一样的坑,微信二次分享(A==>B,B==>C),B分享到C的时候,jssdk如果是在后台加载,微信会在你地址栏上面追加参数,比如说form=xxx,这个时候,就算你在前端处理过url,后台还是jssdk路径错误,这个是不可避免的,所以,我把jssdk加载放置前端通过ajax加载,这样每次分享的jssdk都能成功加载:

$.post(‘${basePath}/wx/jssdk.do‘,{url:location.href.split(‘#‘)[0]},function(row){//url直接用当前路径后台代码自己构造,微信给出很详细了
        console.log(row);
        //appId=row.rows.appId;
        wx.config({
            debug: true,
            appId: row.rows.appId,
            timestamp: row.rows.timestamp,
            nonceStr: row.rows.nonceStr,
            signature: row.rows.signature,
            jsApiList: [
                ‘onMenuShareTimeline‘,
                ‘onMenuShareAppMessage‘,
                ‘onMenuShareQQ‘,
                ‘onMenuShareWeibo‘,
                ‘onMenuShareQZone‘
            ]
        });
})

这个时候,无论是怎么分享,jssdk都是加载成功的。

下面是分享的具体代码:

 var onceId = uuid();
    wx.ready(function () {
         //分享到朋友圈
        wx.onMenuShareTimeline({
            title: ‘111‘, // 分享标题
            link: thisUrl+‘?shareId=‘+onceId, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            //link: ‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=‘+appId+‘&redirect_uri=‘+thisUrl+‘&response_type=code&scope=snsapi_userinfo&state=‘+onceId+‘#wechat_redirect‘,  //分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: ‘http://escloud-media.oss-cn-hangzhou.aliyuncs.com/escloud/newsmsg-small.png‘, // 分享图标
            success: function () {
                data.shareUrl=thisUrl+‘?shareId=‘+onceId;
                   data.shareId=onceId;
                   data.shareModel=‘9‘;
                   data.shareType=‘2‘;
                   data.openId=openId;
                   httpPost(‘${basePath}/wx/clientshare.do‘,data);
                   onceId = uuid();
                   // 用户确认分享后执行的回调函数
                   //alert(‘success‘);
            },
            cancel: function () {
                //alert(‘222‘);
                // 用户取消分享后执行的回调函数
            }
        });

           //分享给朋友
           wx.onMenuShareAppMessage({
               title: ‘111‘, // 分享标题
               desc: ‘222‘, // 分享描述
               link: thisUrl+‘?shareId=‘+onceId, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
               //link: ‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=‘+appId+‘&redirect_uri=‘+encodeURIComponent(thisUrl)+‘&response_type=code&scope=snsapi_userinfo&state=‘+onceId+‘#wechat_redirect‘,  //分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
               imgUrl: ‘http://escloud-media.oss-cn-hangzhou.aliyuncs.com/escloud/newsmsg-small.png‘, // 分享图标${basePath}/images/wechat/h1.jpg
               type: ‘‘, // 分享类型,music、video或link,不填默认为link
               dataUrl: ‘‘, // 如果type是music或video,则要提供数据链接,默认为空
               success: function (data) {
                   data.shareUrl=thisUrl+‘?shareId=‘+onceId;
                   data.shareId=onceId;
                   data.shareModel=‘9‘;
                   data.shareType=‘1‘;
                   data.openId=openId;
                   httpPost(‘${basePath}/wx/clientshare.do‘,data);
                   onceId = uuid();
                   // 用户确认分享后执行的回调函数
                   //alert(‘success‘);
               },
               cancel: function () {
                   //alert(‘222‘);
                   // 用户取消分享后执行的回调函数
               }
           });
})

这里只拿分享给朋友和朋友圈为例,其他分享意义不大,这里会看到一个link,这个link是分享地址,大家应该看到我有注掉一行代码,这里又有一个坑了,直接分享网页授权,朋友圈是无法分享的,你表面上是分享成功了,实际上你分享出去的东西只有你自己可见,别人的朋友圈不会出现你分享的内容(亲测)。所以,我们还是要分享当前路径,出去一些不必要参数的路径,下面贴完整代码:

function getQueryString(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)","i");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) return unescape(r[2]);
    return null;
}
$(function () {
    var isShare=false;
    if(getQueryString(‘shareId‘)!=null){
        isShare=true;
    }
     var thisUrl=location.href;
     if(thisUrl.indexOf("?")>0){
         thisUrl=thisUrl.substring(0, thisUrl.indexOf("?"));
     }
    var data={shareUrl:thisUrl};
    var openId=‘${openId}‘;

    $.post(‘${basePath}/wx/jssdk.do‘,{url:location.href.split(‘#‘)[0]},function(row){
        console.log(row);
        //appId=row.rows.appId;
        wx.config({
            debug: true,
            appId: row.rows.appId,
            timestamp: row.rows.timestamp,
            nonceStr: row.rows.nonceStr,
            signature: row.rows.signature,
            jsApiList: [
                ‘onMenuShareTimeline‘,
                ‘onMenuShareAppMessage‘,
                ‘onMenuShareQQ‘,
                ‘onMenuShareWeibo‘,
                ‘onMenuShareQZone‘
            ]
        });
        //alert(‘1‘);
        if(isShare==true){
            //通过分享进入页面
            //alert(‘2‘);
            var fromurl=thisUrl;
            var url=‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=‘+row.rows.appId+‘&redirect_uri=‘+encodeURIComponent(fromurl)+‘&response_type=code&scope=snsapi_userinfo&state=getopen#wechat_redirect‘;
            location.href=url;
        }else{
            //通过公众号进入
            if(getQueryString(‘state‘)==‘ok‘){
                $("#follow").hide();
            }else if(getQueryString(‘state‘)==‘getopen‘){
                //通过网页授权二次进入
                var access_code=getQueryString(‘code‘);
                if (access_code==null){
                    //alert(‘2‘);
                    var fromurl=thisUrl;
                    var url=‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=‘+row.rows.appId+‘&redirect_uri=‘+encodeURIComponent(fromurl)+‘&response_type=code&scope=snsapi_userinfo&state=getopen#wechat_redirect‘;
                    location.href=url;
                } else {
                    //alert(access_code);
                    $.post(‘${basePath}/wx/openid.do‘,{code:access_code},function(result){
                        console.log(result);
                        //alert(result.rows.openId);
                        //alert(result.rows.accessToken);
                        openId=result.rows.openId;
                        $.post(‘${basePath}/wx/checkofollow.do‘,{openId:result.rows.openId},function(ret){
                            console.log(ret);
                            //alert(ret.rows.subscribe);
                            if(ret!=null&&ret.rows.subscribe==‘1‘){
                                $("#follow").hide();
                            }else{
                                $("#follow").show();
                            }
                        });
                    });
                }
            }
        }
    });

    var onceId = uuid();
    wx.ready(function () {
         //分享到朋友圈
        wx.onMenuShareTimeline({
            title: ‘111‘, // 分享标题
            link: thisUrl+‘?shareId=‘+onceId, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            //link: ‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=‘+appId+‘&redirect_uri=‘+thisUrl+‘&response_type=code&scope=snsapi_userinfo&state=‘+onceId+‘#wechat_redirect‘,  //分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: ‘http://escloud-media.oss-cn-hangzhou.aliyuncs.com/escloud/newsmsg-small.png‘, // 分享图标
            success: function () {
                data.shareUrl=thisUrl+‘?shareId=‘+onceId;
                   data.shareId=onceId;
                   data.shareModel=‘9‘;
                   data.shareType=‘2‘;
                   data.openId=openId;
                   httpPost(‘${basePath}/wx/clientshare.do‘,data);
                   onceId = uuid();
                   // 用户确认分享后执行的回调函数
                   //alert(‘success‘);
            },
            cancel: function () {
                //alert(‘222‘);
                // 用户取消分享后执行的回调函数
            }
        });

           //分享给朋友
           wx.onMenuShareAppMessage({
               title: ‘111‘, // 分享标题
               desc: ‘222‘, // 分享描述
               link: thisUrl+‘?shareId=‘+onceId, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
               //link: ‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=‘+appId+‘&redirect_uri=‘+encodeURIComponent(thisUrl)+‘&response_type=code&scope=snsapi_userinfo&state=‘+onceId+‘#wechat_redirect‘,  //分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
               imgUrl: ‘http://escloud-media.oss-cn-hangzhou.aliyuncs.com/escloud/newsmsg-small.png‘, // 分享图标${basePath}/images/wechat/h1.jpg
               type: ‘‘, // 分享类型,music、video或link,不填默认为link
               dataUrl: ‘‘, // 如果type是music或video,则要提供数据链接,默认为空
               success: function (data) {
                   data.shareUrl=thisUrl+‘?shareId=‘+onceId;
                   data.shareId=onceId;
                   data.shareModel=‘9‘;
                   data.shareType=‘1‘;
                   data.openId=openId;
                   httpPost(‘${basePath}/wx/clientshare.do‘,data);
                   onceId = uuid();
                   // 用户确认分享后执行的回调函数
                   //alert(‘success‘);
               },
               cancel: function () {
                   //alert(‘222‘);
                   // 用户取消分享后执行的回调函数
               }
           });
        //分享到QQ
        wx.onMenuShareQQ({
            title: ‘111‘, // 分享标题
            desc: ‘222‘, // 分享描述
            link: thisUrl+‘?shareId=‘+onceId, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            //link: ‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=‘+appId+‘&redirect_uri=‘+thisUrl+‘&response_type=code&scope=snsapi_userinfo&state=‘+onceId+‘#wechat_redirect‘,  //分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: ‘http://escloud-media.oss-cn-hangzhou.aliyuncs.com/escloud/newsmsg-small.png‘, // 分享图标
            success: function () {
                data.shareUrl=thisUrl+‘?shareId=‘+onceId;
                   data.shareId=onceId;
                   data.shareModel=‘9‘;
                   data.shareType=‘9‘;
                   data.openId=openId;
                   httpPost(‘${basePath}/wx/clientshare.do‘,data);
                   onceId = uuid();
                   // 用户确认分享后执行的回调函数
                   //alert(‘success‘);
            },
            cancel: function () {
                //alert(‘222‘);
               // 用户取消分享后执行的回调函数
            }
        });
        //分享到腾讯微博
        wx.onMenuShareWeibo({
            title: ‘111‘, // 分享标题
            desc: ‘222‘, // 分享描述
            link: thisUrl+‘?shareId=‘+onceId, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            //link: ‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=‘+appId+‘&redirect_uri=‘+thisUrl+‘&response_type=code&scope=snsapi_userinfo&state=‘+onceId+‘#wechat_redirect‘, // 分享链接
            imgUrl: ‘http://escloud-media.oss-cn-hangzhou.aliyuncs.com/escloud/newsmsg-small.png‘, // 分享图标
            success: function () {
                data.shareUrl=thisUrl+‘?shareId=‘+onceId;
                   data.shareId=onceId;
                   data.shareModel=‘9‘;
                   data.shareType=‘9‘;
                   data.openId=openId;
                   httpPost(‘${basePath}/wx/clientshare.do‘,data);
                   onceId = uuid();
                   // 用户确认分享后执行的回调函数
                   //alert(‘success‘);
            },
            cancel: function () {
                //alert(‘222‘);
                // 用户取消分享后执行的回调函数
            }
        });
        //分享到QQ空间
        wx.onMenuShareQZone({
            title: ‘111‘, // 分享标题
            desc: ‘222‘, // 分享描述
            link: thisUrl+‘?shareId=‘+onceId, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            //link: ‘https://open.weixin.qq.com/connect/oauth2/authorize?appid=‘+appId+‘&redirect_uri=‘+thisUrl+‘&response_type=code&scope=snsapi_userinfo&state=‘+onceId+‘#wechat_redirect‘, // 分享链接
            imgUrl: ‘http://escloud-media.oss-cn-hangzhou.aliyuncs.com/escloud/newsmsg-small.png‘, // 分享图标
            success: function () {
                data.shareUrl=thisUrl+‘?shareId=‘+onceId;
                   data.shareId=onceId;
                   data.shareModel=‘9‘;
                   data.shareType=‘9‘;
                   data.openId=openId;
                   httpPost(‘${basePath}/wx/clientshare.do‘,data);
                   onceId = uuid();
                   // 用户确认分享后执行的回调函数
                   //alert(‘success‘);
            },
            cancel: function () {
                // 用户取消分享后执行的回调函数
            }
        });
    });
});

通过标识符判断用户是否通过分享进入到公众号,如果是,则进行跳转网页授权获取用户详情,然后获取用户是否关注公众号(如何获取参考微信文档),然后显示按钮标签什么的,用户如果点击就出你们做好的关注页面。ps后台代码就不贴出来了,微信文档给的都很详细。希望能帮助到大家,不懂的可以私。对了,这里还有一个坑,微信有两个token,网页授权是一个token,还有一个是7200秒的token,获取用户详情的时候,调用的是7200秒的token,不要用错了哦

时间: 2024-10-12 04:15:33

微信分享功能的相关文章

Android微信分享功能实例+demo

Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留言  o(∩_∩)o 哈哈 代码如下: package com.wx; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import a

微信开发】【Asp.net MVC】-- 微信分享功能

[微信开发][Asp.net MVC]-- 微信分享功能 2017-01-15 09:09 by stoneniqiu, 12886 阅读, 15 评论, 收藏, 编辑 内嵌在微信中的网页,右上角都会有一个默认的分享功能.如下图所示,第一个为自定义的效果,第二个为默认的效果.实现了自定义的分享链接是不是更让人有点击的欲望?下面讲解下开发的过程. 一.准备,设置js接口安全域名 这需要使用微信的jssdk,先需要在微信公众号后台进行设置:公众号设置-->功能设置-->JS接口安全域名.打开这个页

js-sdk微信分享功能的实现(vue)

代码 mounted(){ //在mounted里执行 let ua = navigator.userAgent.toLowerCase(); //判断是否是微信端 if (ua.match(/MicroMessenger/i) == "micromessenger") { this.getWxShare() } } methods:{ getWxShare(){ let url = window.location.href.split('#')[0] axios.get(`${com

在App中添加微信分享功能

随着微信平台运用越来越普遍,在app中往往需要将看到的消息发送给微信好友,分享到朋友圈,因此就需要添加微信分享的功能.我们可以通过微信的开发者平台上的相关文档来实现这个简单的功能. 1.在微信开发者平台注册应用程序的id,通过审核后可以获得一个appid 2.有了appID后下载最新的微信终端sdk文件,SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 这三个.资料下载页面: https://open.weixin.qq.com/cgi-bin/showd

在Unity3D项目中接入ShareSDK实现安卓平台微信分享功能(可使用ShareSDK默认UI或自定义UI)

最近公司的大厅要重做,我协助主程一起制作新大厅和新框架,前面制作的编辑器也派上了用场.等全部功能做完后我会再写一个复盘,这两天主程在忙于写热更新的功能,所以把接入分享SDK功能的任务交给了我,ShareSDK官网的文档比较分散,而且关于Unity的文档比较简略,所以还是有不少的坑.写篇博客分享一下,并加强理解记忆. 第一步,先去ShareSDK的官网下载最新版本的ShareSDK(完全免费).地址:http://www.mob.com/ 我们选择ShareSDK For Unity3D,页面会直

点击网页分享按钮,触发微信分享功能

微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添加分享到朋友圈,关注微信号等按钮. 我们可以发现微信内嵌浏览器定义了一个私有 JavaScript 对象:WeixinJSBridge,通过操作这个对象的相关方法可以实现分享到微信朋友圈,和判断一个微信号的关注状态以及实现关注指定微信号等功能. 分享到朋友圈 function weixinShareTim

【微信开发】【Asp.net MVC】-- 微信分享功能

内嵌在微信中的网页,右上角都会有一个默认的分享功能.如下图所示,第一个为自定义的效果,第二个为默认的效果.实现了自定义的分享链接是不是更让人有点击的欲望?下面讲解下开发的过程. 一.准备,设置js接口安全域名 这需要使用微信的jssdk,先需要在微信公众号后台进行设置:公众号设置-->功能设置-->JS接口安全域名.打开这个页面之后你会看到下面的提示.需要先下载这个文件并上传到指定域名的根目录. 这个文件里面是一个字符串,从名称看是用来校验用的.先上传了这个文件,你才能保存成功.这样你就可以使

ionic微信分享功能实例

最近的项目有分享的需求,在网上找了很多关于分享功能的介绍,这边介绍一个demo(xuli大神所写),也算是对于这项功能的一个总结吧. 一.先生成一个apk包 具体可以直接下载xuli大神的代码git clone https://github.com/xu-li/cordova-plugin-wechat-example.git 然后打包apk. 二.根据apk包生成签名 下载签名工具,将apk安装到安卓手机中,在项目config.xml文件中找到包名,将包名输入到签名工具GenSignature

微信分享功能开发代码整理

微信分享对接php项目: 做微信分享开发要注意所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名” 1,Jssdk类包的引入Jssdk.class.php生成注册微信官方分享按钮的权限参数,代码如下: <?php // +---------------------------------------------------------------------- // | 微信分享核心包类 // +--------

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

之前微信分享一直正常可用,可最近报出微信分享后不能按规定的图片描述链接分享,而且不能产生回调导致不能通过分享增加用户参与活动次数,老代码如下: document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { window.shareData = { "imgUrl": "{$shareimg}", "timeLineLink": "{$shareli