微信分享_微信分享功能 - CSDN
  • 想在微站里面实现分享帖子给朋友和朋友圈,显示图片和简介,就这么简单的功能折腾了1星期。。。主要是微信官方文档没看清楚,怪自己了。官方文档在这里,...

    想在微站里面实现分享帖子给朋友和朋友圈,显示图片和简介,就这么简单的功能折腾了1星期。。。主要是微信官方文档没看清楚,怪自己了。

    官方文档在这里,https://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

    参考 http://www.cnblogs.com/stoneniqiu/p/6286599.html 这篇文章。

    遇到invalid signature签名错误。找了半天,各种调试,终于找到问题了,每个新闻的id是变动的,

    url需要传入完整的地址,在微信官方手册里面查到的。

    比如页面是http://www.baidu.com/wx.aspx?id=111,需要完整传入,不能仅仅在url里面传入http://www.baidu.com/wx.aspx

    下面是 stoneniqiu  的具体做法,大家可以参考一下。

     

    内嵌在微信中的网页,右上角都会有一个默认的分享功能。如下图所示,第一个为自定义的效果,第二个为默认的效果。实现了自定义的分享链接是不是更让人有点击的欲望?下面讲解下开发的过程。

    一、准备,设置js接口安全域名

    这需要使用微信的jssdk,先需要在微信公众号后台进行设置:公众号设置-->功能设置-->JS接口安全域名。打开这个页面之后你会看到下面的提示。需要先下载这个文件并上传到指定域名的根目录。

    这个文件里面是一个字符串,从名称看是用来校验用的。先上传了这个文件,你才能保存成功。这样你就可以使用jssdk了。

     二、前端配置

     首先要说明的是分享功能是一个配置功能,绑定在按钮的click事件中是没有效果的。也就是说只有点击右上角的分享才有效果(有的文字内容分享不知道是怎么实现的)。官方的js有四个步骤,首先是引入jssdk:

    <script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>

    根据官方的配置参数,我们可以定义一个WXShareModel对象:

    复制代码
    复制代码
       public class WXShareModel
        {
            public string appId { get; set; }
            public string nonceStr { get; set; }
            public long timestamp { get; set; }
    
            public string signature { get; set; }
    
            public string ticket { get; set; }
            public string url { get; set; }
    
            public void MakeSign()
            {
                 var string1Builder = new StringBuilder();
                 string1Builder.Append("jsapi_ticket=").Append(ticket).Append("&")
                              .Append("noncestr=").Append(nonceStr).Append("&")
                              .Append("timestamp=").Append(timestamp).Append("&")
                              .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
                var string1 = string1Builder.ToString();
                signature = Util.Sha1(string1, Encoding.Default);
    
            }
        }
    复制代码
    复制代码

    然后是进行配置:

    复制代码
    复制代码
    wx.config({
            debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: '@Model.appId', // 必填,公众号的唯一标识
            timestamp: '@Model.timestamp', // 必填,生成签名的时间戳
            nonceStr: '@Model.nonceStr', // 必填,生成签名的随机串
            signature: '@Model.signature',// 必填,签名,见附录1
            jsApiList: ["checkJsApi", "onMenuShareTimeline", "onMenuShareAppMessage", "onMenuShareQQ", "onMenuShareQZone"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
        });
    
        wx.ready(function () {
            document.querySelector('#checkJsApi').onclick = function () {
                wx.checkJsApi({
                    jsApiList: [
                'getNetworkType',
                'previewImage'
                    ],
                    success: function (res) {
                        alert(JSON.stringify(res));
                    }
                });
            };
        //朋友圈
            wx.onMenuShareTimeline({
                title: '暖木科技', // 分享标题
                link: 'http://www.warmwood.com/home/lampindex', // 分享链接
                imgUrl: 'http://www.warmwood.com/images/s1.jpg',
                success: function (res) {
                    alert('已分享');
                },
                cancel: function (res) {
                    alert('已取消');
                },
                fail: function (res) {
                    alert(JSON.stringify(res));
                }
            });
            //朋友
            wx.onMenuShareAppMessage({
                title: '暖木科技', // 分享标题
                desc: '宝宝的睡眠很重要,你的睡眠也很重要', // 分享描述
                link: 'http://www.warmwood.com/home/lampindex', // 分享链接
                imgUrl: 'http://www.warmwood.com/images/s1.jpg', // 分享图标
                type: '', // 分享类型,music、video或link,不填默认为link
                dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
                success: function () {
                    // 用户确认分享后执行的回调函数
                    alert("分享");
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                    alert("取消分享");
                }
            });
        });
    复制代码
    复制代码

    然后剩下就是后端的事情了。后端的关键是获取access_token和jsapi_ticket以及生成正确的签名。另外如果要统计分享的数量,最好就是在success方法中进行统计了。

    三、生成签名

    1.access_token 

    获取access_token方法全平台都是一致的。

    public const string AccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
    复制代码
    复制代码
     public TokenResult GetAccessToken()
            {
                var url = string.Format(WxDeviceConfig.AccessTokenUrl, WxDeviceConfig.AppId, WxDeviceConfig.APPSECRET);
                var res = SendHelp.Send<TokenResult>(null, url, null, CommonJsonSendType.GET);
                return res;
            }
    复制代码
    复制代码

    access_token的超时时间是7200秒,所以先可以缓存起来。SendHelp文章末尾可下载

    2.获取jsapi_ticket

    access_token的作用就是为了获取jsapi_ticket。用get方式获取,url:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi,返回的JSON对象如下。

    复制代码
    复制代码
    {
    "errcode":0,
    "errmsg":"ok",
    "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
    "expires_in":7200
    }
    复制代码
    复制代码

    所以可以定义一个模型:

    复制代码
    复制代码
    public class jsapiTicketModel
        {
            public string errcode { get; set; }
            public string errmsg { get; set; }
    
            public string ticket { get; set; }
    
            public string expires_in { get; set; }
        }
    复制代码
    复制代码

    再完成获取ticket的方法:

     public jsapiTicketModel GetJsApiTicket(string accessToken)
            {
                var url = string.Format(WxPayConfig.Jsapi_ticketUrl, accessToken);
                return SendHelp.Send<jsapiTicketModel>(accessToken, url, "", CommonJsonSendType.GET);
            }

    ticket过期时间也是7200秒,并且不能频繁的请求,所以也需要再服务端缓存起来。

     private void setCacheTicket(string cache)
            {
                _cacheManager.Set(tokenKey, cache, 7200);
            }

    MemoryCacheManager:

    View Code

    3.签名

    终于到这一步了,然后你在文档中看到让你失望的一幕:

    么有C#的demo,支付那边都提供了,为啥jssdk没有提供,好吧先不吐槽了。官方也说明白签名的规则。一开始我使用的是https://github.com/night-king/weixinSDK中的签名:

    复制代码
    复制代码
     public static string Sha1(string orgStr, string encode = "UTF-8")
            {
                var sha1 = new SHA1Managed();
                var sha1bytes = System.Text.Encoding.GetEncoding(encode).GetBytes(orgStr);
                byte[] resultHash = sha1.ComputeHash(sha1bytes);
                string sha1String = BitConverter.ToString(resultHash).ToLower();
                sha1String = sha1String.Replace("-", "");
                return sha1String;
            }//错误示例
    复制代码
    复制代码

    得出的结果和官方校验的不一致,一直提示签名错误。

     

     正确的写法是:

    复制代码
    复制代码
    public static string Sha1(string orgStr, Encoding encode)
            {
                SHA1 sha1 = new SHA1CryptoServiceProvider();
                byte[] bytes_in = encode.GetBytes(orgStr);
                byte[] bytes_out = sha1.ComputeHash(bytes_in);
                sha1.Dispose();
                string result = BitConverter.ToString(bytes_out);
                result = result.Replace("-", "");
                return result;  
            }
    复制代码
    复制代码

    和官方校验的结果一直后,就ok了(忽略大小写)。另外一个需要注意的地方是签名中的url。如果页面有参数,model中的url也需要带参数,#号后面的不要。不然也是会报签名错误。

    复制代码
    复制代码
     public ActionResult H5Share()
            {
                var model = new WXShareModel();
                model.appId = WxPayConfig.APPID;
                model.nonceStr = WxPayApi.GenerateNonceStr();
                model.timestamp = Util.CreateTimestamp();
                model.ticket = GetTicket();
                model.url = "http://www.warmwood.com/AuthWeiXin/share";// domain + Request.Url.PathAndQuery;
                model.MakeSign();
                Logger.Debug("获取到ticket:" + model.ticket);
                Logger.Debug("获取到签名:" + model.signature);
                return View(model);
            }
    复制代码
    复制代码

    四、小结

    wx.config中的debug为true会alert各种操作结果。参数正确之后界面会提示:

     

    至此,分享的功能就ok了。也就打开了调用其他jssdk的大门。另外文中的SendHelp对象是用的Senparc (基于.net4.5)的dll。

    参考资料:

    签名校验:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

    官方文档:https://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

     

    我的核心代码

    复制代码
    [System.Web.Services.WebMethod]
        public static WXShareModel GetKey(string str)
        {
            WXShareModel aModel = new WXShareModel();
            WXToolsHelper tb = new WXToolsHelper();
            string AppId = "你的APPID";
            string secret = "你的secret";
            string access_token = tb.GetAccess_Token(AppId, secret);
            aModel.appId = AppId;
            aModel.nonceStr = tb.CreatenNonce_str();
            aModel.timestamp = tb.CreatenTimestamp();
            aModel.ticket = tb.GetTicket(access_token);
            aModel.url = str;
            aModel.MakeSign();
            return aModel;
        }
    public class WXShareModel
        {
            public string appId { get; set; }
            public string nonceStr { get; set; }
            public long timestamp { get; set; }
            public string ticket { get; set; }
            public string url { get; set; }
            public string signature { get; set; }
    
            public void MakeSign()
            {
                var string1Builder = new StringBuilder();
                string1Builder.Append("jsapi_ticket=").Append(ticket).Append("&")
                             .Append("noncestr=").Append(nonceStr).Append("&")
                             .Append("timestamp=").Append(timestamp).Append("&")
                             .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
                var string1 = string1Builder.ToString();
                signature = Sha1(string1, Encoding.Default);
            }
     public static string Sha1(string orgStr, Encoding encode)
            {
                SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
                byte[] bytes_in = encode.GetBytes(orgStr);
                byte[] bytes_out = sha1.ComputeHash(bytes_in);
                sha1.Dispose();
                string result = BitConverter.ToString(bytes_out);
                result = result.Replace("-", "");
                return result;
            }
    public class WXToolsHelper
        {
            /// <summary>
            /// 获取全局的access_token,程序缓存
            /// </summary>
            /// <param name="AppId">第三方用户唯一凭证</param>
            /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param>
            /// <returns>得到的全局access_token</returns>
            public string GetAccess_Token(string AppId, string AppSecret)
            {
                try
                {
                    //先查缓存数据
                    if (HttpContext.Current.Cache["access_token"] != null)
                    {
                        return HttpContext.Current.Cache["access_token"].ToString();
                    }
                    else
                    {
                        return GetToken(AppId, AppSecret);
                    }
                }
                catch
                {
                    return GetToken(AppId, AppSecret);
                }
            }
    
            /// <summary>
            /// 获取全局的access_token
            /// </summary>
            /// <param name="AppId">第三方用户唯一凭证</param>
            /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param>
            /// <returns>得到的全局access_token</returns>
            public string GetToken(string AppId, string AppSecret)
            {
                var client = new System.Net.WebClient();
                client.Encoding = System.Text.Encoding.UTF8;
                var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", AppId, AppSecret);
                var data = client.DownloadString(url);
                var jss = new JavaScriptSerializer();
                var access_tokenMsg = jss.Deserialize<Dictionary<string, object>>(data);
                //放入缓存中
                HttpContext.Current.Cache.Insert("access_token", access_tokenMsg["access_token"], null, DateTime.Now.AddSeconds(7100), TimeSpan.Zero, CacheItemPriority.Normal, null);
    
                //清除jsapi_ticket缓存
                HttpContext.Current.Cache.Remove("ticket");
    
                //获取jsapi_ticket,为了同步
                GetTicket(access_tokenMsg["access_token"].ToString());
    
                return access_tokenMsg["access_token"].ToString();
            }
    
    
            /// <summary>
            /// 获取jsapi_ticket,程序缓存
            /// </summary>
            /// <param name="access_token">全局的access_token</param>
            /// <returns>得到的jsapi_ticket</returns>
            public string GetJsapi_Ticket(string access_token)
            {
                try
                {
                    //先查缓存数据
                    if (HttpContext.Current.Cache["ticket"] != null)
                    {
                        return HttpContext.Current.Cache["ticket"].ToString();
                    }
                    else
                    {
                        return GetTicket(access_token);
                    }
                }
                catch
                {
                    return GetTicket(access_token);
                }
            }
    
    
            /// <summary>
            /// 获取jsapi_ticket
            /// </summary>
            /// <param name="access_token">全局的access_token</param>
            /// <returns>得到的jsapi_ticket</returns>
            public string GetTicket(string access_token)
            {
                var client = new System.Net.WebClient();
                client.Encoding = System.Text.Encoding.UTF8;
                var url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
                var data = client.DownloadString(url);
                var jss = new JavaScriptSerializer();
                var ticketMsg = jss.Deserialize<Dictionary<string, object>>(data);
                try
                {
                    //放入缓存中
                    HttpContext.Current.Cache.Insert("ticket", ticketMsg["ticket"], null, DateTime.Now.AddSeconds(7100), TimeSpan.Zero, CacheItemPriority.Normal, null);
                    return ticketMsg["ticket"].ToString();
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
    
            /// <summary>
            /// 微信权限签名的 sha1 算法
            /// 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同
            /// </summary>
            /// <param name="jsapi_ticket">获取到的jsapi_ticket</param>
            /// <param name="noncestr">生成签名的随机串</param>
            /// <param name="timestamp">生成签名的时间戳</param>
            /// <param name="url">签名用的url必须是调用JS接口页面的完整URL</param>
            /// <returns></returns>
            public string GetShal(string jsapi_ticket, string noncestr, long timestamp, string url)
            {
                string strSha1 = string.Format("jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url);
                return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSha1, "sha1").ToLower();
            }
    
            /// <summary>
            /// 微信权限签名( sha1 算法 )
            /// 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同
            /// </summary>
            /// <param name="AppId">第三方用户唯一凭证</param>
            /// /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param>
            /// <param name="noncestr">生成签名的随机串</param>
            /// <param name="timestamp">生成签名的时间戳</param>
            /// <param name="url">签名用的url必须是调用JS接口页面的完整URL</param>
            /// <returns></returns>
            public string Get_Signature(string AppId, string AppSecret, string noncestr, long timestamp, string url)
            {
                string access_token = GetAccess_Token(AppId, AppSecret); //获取全局的access_token
                string jsapi_ticket = GetJsapi_Ticket(access_token); //获取jsapi_ticket
    
                string strSha1 = string.Format("jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url);
                return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSha1, "sha1").ToLower();
            }
    
    
            /// <summary>
            /// 微信权限签名( sha1 算法 )
            /// 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同
            /// </summary>
            /// <param name="AppId">第三方用户唯一凭证</param>
            /// /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param>
            /// <param name="noncestr">生成签名的随机串</param>
            /// <param name="timestamp">生成签名的时间戳</param>
            /// <param name="url">签名用的url必须是调用JS接口页面的完整URL</param>
            /// <returns></returns>
            public void signatureOut(string AppId, string AppSecret, string noncestr, long timestamp, string url, out string access_token, out string jsapi_ticket, out string signature)
            {
                access_token = GetAccess_Token(AppId, AppSecret); //获取全局的access_token
    
                jsapi_ticket = GetJsapi_Ticket(access_token); //获取jsapi_ticket
    
                string strSha1 = string.Format("jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url);
    
                signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSha1, "sha1").ToLower();
            }
    
            private string[] strs = new string[]
    {
    "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
    "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
    };
            /// <summary>
            /// 创建随机字符串 
            /// </summary>
            /// <returns></returns>
            public string CreatenNonce_str()
            {
                Random r = new Random();
                var sb = new StringBuilder();
                var length = strs.Length;
                for (int i = 0; i < 15; i++)
                {
                    sb.Append(strs[r.Next(length - 1)]);
                }
                return sb.ToString();
            }
    
    
            /// <summary>
            /// 创建时间戳 
            /// </summary>
            /// <returns></returns>
            public long CreatenTimestamp()
            {
                return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
            }
    
    
        }
    复制代码

     

     

    前段调用

    复制代码
    var strUrl = location.href.split('#')[0];
    $.ajax({
        type: "Post",
        url: "config.aspx/GetKey",
        //方法传参的写法一定要对,strUrl为形参的名字    
        data: "{'str':'" + strUrl + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            //返回的数据用data.d获取内容    
            $("#wx-share-sign").val(data.d.signature);
            wxconifg(data.d);
        },
        error: function (err) {
            alert('55');
        }
    });
    function wxconifg(WXDate) {
        wx.config({
            debug: false,
            appId: '你的APPID',
            timestamp: WXDate.timestamp,
            nonceStr: WXDate.nonceStr,
            signature: WXDate.signature,
            jsApiList: ["checkJsApi", "onMenuShareTimeline", "onMenuShareAppMessage", "onMenuShareQQ", "onMenuShareQZone"]
        });
        wx.ready(function () {
            wx.onMenuShareAppMessage({
                title: $("#wx-share-title").val(),
                desc: $("#wx-share-desc").val(),
                link: strUrl,
                imgUrl: $("#wx-share-img").val(),
                trigger: function (res) {
                },
                success: function (res) {
                },
                cancel: function (res) {
                },
                fail: function (res) {
                    alert(JSON.stringify(res));
                }
            });
            //分享到朋友圈
            wx.onMenuShareTimeline({
                title: 'XX新闻|'+$("#wx-share-desc").val(),
                desc: $("#wx-share-desc").val(),
                link: $("#wx-share-link").val(),
                imgUrl: $("#wx-share-img").val(),
                type: 'link',
                dataUrl: strUrl,
                trigger: function (res) {
                },
                success: function (res) {
                },
                cancel: function (res) {
                },
                fail: function (res) {
                    alert(JSON.stringify(res));
                }
            });
        });
    } 
    复制代码
    展开全文
  • HTML5微信分享图标和文本设置

    千次下载 热门讨论 2020-07-29 14:18:40
    ​想必大家都在自己的微信朋友圈看到过别人分享的一些网页链接消息,但是你...今天要跟大家分享的就是如何让自己的网页在微信分享朋友圈中拥有一个自己个性的图标以及自定义分享中的描述文字。--->详情见我的博客哦!
  • 微信分享完整demo

    2020-07-30 23:30:05
    微信分享完整demo,带appid,同时有签名文件,下载可用
  • 微信分享功能

    千次阅读 2018-07-11 10:27:44
    最近做微信分享功能,第一次做,看了好久的官方文档,最终解决了,在这里记录一下。1.登录微信公众平台:https://mp.weixin.qq.com/需要在微信公众号后台进行设置:公众号设置--&gt;功能设置--&gt;JS接口...

    最近做微信分享功能,第一次做,看了好久的官方文档,最终解决了,在这里记录一下。

    1.登录微信公众平台:https://mp.weixin.qq.com/

    需要在微信公众号后台进行设置:公众号设置-->功能设置-->JS接口安全域名。打开这个页面之后你会看到下面的提示。需要先下载这个文件并上传到指定域名的根目录(配置的域名+MP_verify_bjZ2nipw3mAGlvUF.txt必需要能访问才能保存成功)。

    2.前台页面的开发

    页面中引入<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>   
    和以下代码;

    $(function(){
        var busiParam={"busiData":{}};
        var title,desc,link,imgUrl;
        //对ajax的封装(自己用的框架,你们可以直接用ajax),去后台数据库查询分享的标题,图片路径,描述,link
        stc.rest.query("/AgentWechat/ShareData",{"busiParam":JSON.stringify(busiParam)},function(data){
            var wechatData=data.shareData[0];
            title=wechatData.wechat_title;
            desc=wechatData.wechat_description;
            link=location.href.split('#')[0];
            imgUrl=wechatData.wechat_imgurl;
                });
        var url= location.href.split('#')[0];
        var appId,timestamp,nonceStr,signature;
        var busiParam={"busiData":{"url":url}};
        //对ajax的封装,根据appId等数据,得到以下数据
        stc.rest.query("/AgentWechat/wechatShare",{"busiParam":JSON.stringify(busiParam)},function(data){
            appId=data.appid;// 必填,公众号的唯一标识  
            timestamp=data.timestamp; // 必填,生成签名的时间戳  
            nonceStr=data.noncestr;// 必填,生成签名的随机串  
            signature= data.signature;// 必填,签名  
            wx.config({    
                debug: false,  //是否开启调试模式 
                appId: appId,    
                timestamp: timestamp,    
                nonceStr: nonceStr,    
                signature: signature,    
                jsApiList: [    
                            'onMenuShareTimeline',    //调用的接口
                            'onMenuShareAppMessage'    
                            ]    
            });
        });
        wx.ready(function () {    
            var shareData = {    
                    title: title,    
                    desc: desc,    
                    link: link,    
                    imgUrl: imgUrl,    
                    success: function (res) {    
                        console('已分享');    
                    },    
                    cancel: function (res) {    
                    }    
            };    
            wx.onMenuShareAppMessage({    
                title: title,    
                desc: desc,    
                link: link,    
                imgUrl: imgUrl,    
                trigger: function (res) {    
                    //  console('用户点击发送给朋友');    
                },    
                success: function (res) {    
                    console('已分享');    
                },    
                cancel: function (res) {    
                    //alert('已取消');    
                },    
                fail: function (res) {    
                    console(JSON.stringify(res));    
                }    
            });    
            wx.onMenuShareTimeline(shareData);    
        });    
        wx.error(function (res) {    
            console("error: " + res.errMsg);    
        });    

    });


    3.后台开发,主要是根据appid,AppSecret等数据获取参数

    @RequestMapping(value="/wechatShare",method=RequestMethod.GET)
        @ResponseBody
        public JSONObject wechatShare(HttpServletRequest request,HttpServletResponse response,
                Locale  locale) throws Exception{
            JSONObject json = new JSONObject();
            String[] params=new String[]{"url"};
            Map<String,Object> paramMap=RequestUtils.getParamMap(request, params);
            logger.info("~~~~~url~~~~~::"+paramMap.get("url").toString().replace("&amp;", "&"));
            // 微信appid  
            String appid = bank_config.getString("WECHAY_APPID");
            logger.info("~~~~~appid~~~~~::"+appid);
            // 微信secret   
            String secret = bank_config.getString("WECHAT_AppSecret");
            logger.info("~~~~~AppSecret~~~~~::"+secret);
            // 初始化access_token  
            String access_token = "";  
            //  获取URL 这里的URL指的是需要分享的那个页面地址,建议这里不要写成固定地址,而是获取当前地址.  
            String url = paramMap.get("url").toString().replace("&amp;", "&");

            // 创建通过Api获取Token的链接与参数  
            String requestTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";  
            requestTokenUrl = requestTokenUrl.replace("APPID", appid);  
            requestTokenUrl = requestTokenUrl.replace("SECRET", secret);  
            logger.info("~~~~~requestTokenUrl~~~~~::"+requestTokenUrl);
            JSONObject jsonObject2 = CommonUtil.httpsRequestResult(appid, secret);
            logger.info("~~~~~jsonObject2~~~~~::"+jsonObject2);
            if(jsonObject2!=null){
                // 创建日期赋值为当前日期  
                long  createDate =new Date().getTime()/1000;
                // 获取Token值  
                access_token = jsonObject2.getString("access_token");
                logger.info("~~~~~access_token~~~~~::"+access_token);
                // 获取Token有效期值  
                String expires_in = jsonObject2.getString("expires_in");
                
            }
                 //获取ACCESS_TOKEN
            String requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";  
            requestUrl = requestUrl.replace("ACCESS_TOKEN", access_token);  
            logger.info("~~~~~requestUrl~~~~~::"+requestUrl);
            // 获取凭证  
            JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);  
            logger.info("~~~~~获取凭证~~~~~::"+jsonObject);
            if(jsonObject!=null){  

                try { 

               //jsapi_ticket是公众号用于调用微信JS接口的临时票据。

                    String ticket = jsonObject.getString("ticket");  
                    logger.info("~~~~~获取凭证jsapi_ticket~~~~~::"+ticket);
                    Sign sign = new Sign();
                    Map<String, String> MapRestult = sign.sign(ticket, url);
                    json.put("noncestr", MapRestult.get("nonceStr"));
                    logger.info("~~~~~noncestr~~~~~::"+MapRestult.get("nonceStr"));
                    json.put("timestamp", MapRestult.get("timestamp"));
                    logger.info("~~~~~timestamp~~~~~::"+MapRestult.get("timestamp"));
                    json.put("jsapi_ticket", MapRestult.get("jsapi_ticket"));
                    logger.info("~~~~~jsapi_ticket~~~~~::"+MapRestult.get("jsapi_ticket"));
                    json.put("signature", MapRestult.get("signature"));
                    logger.info("~~~~~signature~~~~~::"+MapRestult.get("signature"));
                    json.put("url", MapRestult.get("url"));
                    logger.info("~~~~~url~~~~~::"+MapRestult.get("url"));
                    json.put("appid",bank_config.getString("WECHAY_APPID"));
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }
            return json;  
        }
       
    在这里数据返回正常,就可以正常分享了,下面上一下我做测分享成功的截图,其实不难,调式代码的时候仔细看日志,就行

    以下是上面用到的工具类 CommonUtil,

    package com.xxx.prm.util;xxx
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ConnectException;
    import java.net.URL;

    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;

    import net.sf.json.JSONObject;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import com.xxx.prm.cdsp.userCenter.localreq.bean.MyX509TrustManager;



    /**
    * 类名: CommonUtil </br>
    * 描述: 通用工具类 </br>
    * 开发人员: tomcat </br>
    * 创建时间:  2018-06-30 </br>
    * 发布版本:V1.0  </br>
     */
    public class CommonUtil {
        private static Logger log = LoggerFactory.getLogger(CommonUtil.class);

        /**
         * 发送https请求
         *
         * @param requestUrl 请求地址
         * @param requestMethod 请求方式(GET、POST)
         * @param outputStr 提交的数据
         * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
         */
        public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
            JSONObject jsonObject = null;
            try {
                // 创建SSLContext对象,并使用我们指定的信任管理器初始化
                TrustManager[] tm = { new MyX509TrustManager() };
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
                // 从上述SSLContext对象中得到SSLSocketFactory对象
                SSLSocketFactory ssf = sslContext.getSocketFactory();

                URL url = new URL(requestUrl);
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                conn.setSSLSocketFactory(ssf);
                
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                // 设置请求方式(GET/POST)
                conn.setRequestMethod(requestMethod);

                // 当outputStr不为null时向输出流写数据
                if (null != outputStr) {
                    OutputStream outputStream = conn.getOutputStream();
                    // 注意编码格式
                    outputStream.write(outputStr.getBytes("UTF-8"));
                    outputStream.close();
                }

                // 从输入流读取返回内容
                InputStream inputStream = conn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String str = null;
                StringBuffer buffer = new StringBuffer();
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }

                // 释放资源
                bufferedReader.close();
                inputStreamReader.close();
                inputStream.close();
                inputStream = null;
                conn.disconnect();
                jsonObject = JSONObject.fromObject(buffer.toString());
            } catch (ConnectException ce) {
                log.error("连接超时:{}", ce);
            } catch (Exception e) {
                log.error("https请求异常:{}", e);
            }
            return jsonObject;
        }
        /**
         * 获取接口访问凭证
         *
         * @param appid 凭证
         * @param appsecret 密钥
         * @return
         */
        public static JSONObject httpsRequestResult(String appid, String appsecret) {
             // 凭证获取(GET)
            String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
            String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
            // 发起GET请求获取凭证
            log.info("~~~~~~~~~token_url~~~~~~~~~"+token_url);
            JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
            return jsonObject;
        }
    }

    package com.sitech.prm.cdsp.userCenter.localreq.bean;
    /** 
     * @author 作者 E-mail: 
     * @version 创建时间:2018年5月30日 下午3:13:18 
     * 类说明 
     */

    工具类Sign

    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    import java.util.Formatter;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    public class Sign {
        private Log logger = LogFactory.getLog(Sign.class);
        public Map<String, String> sign(String jsapi_ticket, String url) {
            Map<String, String> ret = new HashMap<String, String>();
            String nonce_str = create_nonce_str();
            String timestamp = create_timestamp();
            String string1;
            String signature = "";
            // 注意这里参数名必须全部小写,且必须有序
            string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str
                    + "&timestamp=" + timestamp + "&url=" + url;
            logger.debug("[string1] = " + string1);
            try {
                MessageDigest crypt = MessageDigest.getInstance("SHA-1");
                crypt.reset();
                crypt.update(string1.getBytes("UTF-8"));
                signature = byteToHex(crypt.digest());
                logger.debug("[signature] = " + signature);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            ret.put("url", url);
            ret.put("jsapi_ticket", jsapi_ticket);
            ret.put("nonceStr", nonce_str);
            ret.put("timestamp", timestamp);
            ret.put("signature", signature);
            logger.debug("[ret] = " + ret);
           return ret;
        }
        private static String byteToHex(final byte[] hash) {
            Formatter formatter = new Formatter();
            for (byte b : hash) {
                formatter.format("%02x", b);
            }
            String result = formatter.toString();
            formatter.close();
            return result;
        }
        private static String create_nonce_str() {
            return UUID.randomUUID().toString();
        }
        private static String create_timestamp() {
            return Long.toString(System.currentTimeMillis() / 1000);
        }
        /**
         * 用SHA1算法生成安全签名
         * 
         * @param token
         *            票据
         * @param timestamp
         *            时间戳
         * @param nonce
         *            随机字符串
         * @param encrypt
         *            密文
         * @return 安全签名
         * @throws NoSuchAlgorithmException
         * @throws AesException
         */
        public String getSHA1(String token, String timestamp, String nonce)
                throws NoSuchAlgorithmException {
            String[] array = new String[] { token, timestamp, nonce };
            StringBuffer sb = new StringBuffer();
            // 字符串排序
            Arrays.sort(array);
            for (int i = 0; i < 3; i++) {
                sb.append(array[i]);
            }
            String str = sb.toString();
            // SHA1签名生成
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(str.getBytes());
            byte[] digest = md.digest();
            StringBuffer hexstr = new StringBuffer();
            String shaHex = "";
            for (int i = 0; i < digest.length; i++) {
                shaHex = Integer.toHexString(digest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexstr.append(0);
                }
                hexstr.append(shaHex);
            }
            return hexstr.toString();
        }

    }

    工具类MyX509TrustManager 

    package com.xx.prm.cdsp.userCenter.localreq.bean;
    /** 
     * @author 作者 E-mail: 
     * @version 创建时间:2018年5月30日 下午3:20:11 
     * 类说明 
     */
    import java.security.cert.CertificateException;  
    import java.security.cert.X509Certificate;  
      
    import javax.net.ssl.X509TrustManager;  
      
    public class MyX509TrustManager implements X509TrustManager {  
        public void checkClientTrusted(X509Certificate[] chain, String authType)  
                throws CertificateException  
              {  
              }  
      
              public void checkServerTrusted(X509Certificate[] chain, String authType)  
                throws CertificateException  
              {  
              }  
      
              public X509Certificate[] getAcceptedIssuers()  
              {  
                return null;  
              }  
    }  



    展开全文
  • 微信分享

    2018-03-06 14:43:53
    微信内部分享失败。改为页面跳转,分享成功//加载微信配置 var sharelink = ""; var host = window.location.host; var wxdata=new Object(); $.ajax({ type : 'get', url : jsRoot + "/market/...

    微信内部分享失败。改为页面跳转,分享成功

    //加载微信配置
    var	sharelink  = "";
    var host = window.location.host;
    var wxdata=new Object();
    $.ajax({	
    	type : 'get',
    	url : jsRoot + "/market/macts/getjsapiTicket",
    	async:true,
    	contentType: "application/x-www-form-urlencoded; charset=gbk",
    	data : {
    		"url":location.href.split('#')[0]
    	},
    	dataType : 'json',
    	success : function(data, status) {
    		var rstate = data.result;
    		if(rstate == "0"){
    			var ticket = data.message.ticket;
    			host="http://"+host;
    			var	code = encodeURIComponent(host+jsRoot + "/chucwx/couponCores?reqType=1");
    //			sharelink = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+ ticket.appId + "&redirect_uri=" + code+ "&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
    			sharelink = host+jsRoot+"/chucwx/welcome?appid="+ ticket.appId + "&redirect_uri=" + code;
    
    			wxdata.atitle="领券中心";
    			wxdata.sharelink=sharelink;
    			wxdata.imgurl=host+jsRoot+"/chucwx/resources/img/quan.jpg";
    			wxdata.shareinfo="你的小伙伴给你分享了一份优惠!";
    			wxdata.desc = "海量优惠,等你来领!";
    			
    			wx.config({
    			    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    			    appId: ticket.appId, // 必填,公众号的唯一标识
    			    timestamp: ticket.timestamp, // 必填,生成签名的时间戳
    			    nonceStr: ticket.nonceStr, // 必填,生成签名的随机串
    			    signature: ticket.signature,// 必填,签名,见附录1
    			    jsApiList : [
    							'openLocation',
    							'onMenuShareAppMessage',
    							'onMenuShareTimeline'
    			         	]
    
    			});
    		}else{
    			//alert(data.error);
    		}
    	},
    	error : function(data, status, e) {
    		alert('获取数据失败..');
    	}
    });
    
    
    wx.ready(function(){  
        wx.onMenuShareTimeline({  
            title: wxdata.atitle,  
            link: wxdata.sharelink,  
            imgUrl: wxdata.imgurl,  
            success: function () {   
                // 用户确认分享后执行的回调函数  
    //             alert('分享到朋友圈成功');  
            },  
            cancel: function () {   
                // 用户取消分享后执行的回调函数  
    //             alert('你没有分享到朋友圈');  
            }  
        });  
        wx.onMenuShareAppMessage({  
        	  title: wxdata.atitle,  
        	  desc: wxdata.desc,  
              link: wxdata.sharelink,  
              imgUrl: wxdata.imgurl,  
              trigger: function (res) {  
                // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回  
              },  
              success: function (res) {  
    //              alert('分享给朋友成功');  
              },  
              cancel: function (res) {  
    //            alert('你没有分享给朋友');  
              },  
              fail: function (res) {  
                alert(JSON.stringify(res));  
              }  
            });  
    });  

    welcome  jsp页面


    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
    <c:set var="rootPath" value="${pageContext.request.contextPath}" />
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html ng-app="mainApp">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport"
    	content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
    <title></title>
    
    </head>
    <body>
    
    
    </body>
    <script>
    
    	var redirect_uri=getQueryString("redirect_uri");
    	var appid=getQueryString("appid");
    
    	var url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appid+"&redirect_uri="+encodeURIComponent(redirect_uri)+"&response_type=code&scope=snsapi_base&state=0#wechat_redirect";
    	//alert(redirect_uri)
    	window.location.href= url; 
    	window.location.reload; 
    	
    	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; 
    	} 
    </script>
    </html>

    展开全文
  • H5微信分享、自定义微信分享

    万次阅读 热门讨论 2019-08-12 08:54:09
    在微信公众平台的接口权限内可以看到,个人版公众号是没有权限自定义微信分享的,所以需要企业版公众号并开通认证。 具体步骤: 步骤一:绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里...

    在一个h5页面添加微信,分享给微信好友、朋友圈、腾讯微博

    下面来实现 。

    需要:

    1、需要一个企业版的微信公众号(认证过的)

    2、一台服务器

    企业版的微信公众号原因:

    在微信公众平台的接口权限内可以看到,个人版公众号是没有权限自定义微信分享的,所以需要企业版公众号并开通认证。

    具体步骤:

    步骤一:绑定域名

    先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

    备注:登录后可在“开发者中心”查看对应的接口权限。(这一步骤应该没有什么问题)

    步骤二:引入JS文件

    在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js

    如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.4.0.js (支持https)。

    备注:支持使用 AMD/CMD 标准模块加载方法加载(没问题,很简单,一个script就搞定了)

    步骤三:通过config接口注入权限验证配置

    所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

    wx.config({
        debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: '', // 必填,公众号的唯一标识
        timestamp: , // 必填,生成签名的时间戳
        nonceStr: '', // 必填,生成签名的随机串
        signature: '',// 必填,签名
        jsApiList: [] // 必填,需要使用的JS接口列表
    });

    这一步就有很大的问题了,这么多的参数是从哪里来的!

    ——1.先不管其他的,我们现在所需要的:(appId是微信公众号的appId,可以写死或者服务器返回)

      timestamp: , // 必填,生成签名的时间戳
        nonceStr: '', // 必填,生成签名的随机串
        signature: '',// 必填,签名

    这样看来,其实真正需要的是 signature 签名

    ——2.看下signature 的生成流程:

    生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。

    1.参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html

    2.用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

    上面的是官方的文档,说要拿到并且缓存 access_token 接口调用凭据 和 jsapi_ticket 临时票据,拿着access_token 去获取jsapi_ticket ,获得jsapi_ticket之后,自己生成个随机字符串(不懂的,网上百度怎么搞)加上时间戳,加上url地址,自己拼接好,最后进行sha1处理,就得到signature, 很是扯皮!另外access_token 一天的次数2000次jsapi_ticket 一天的次数是100万次,都缓存下来,也可以只缓存token;(我是只缓存了token)

    ——这里说一下 access_token 

    access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

    公众平台的API调用所需的access_token的使用及生成方式说明:

    1、建议公众号开发者使用中控服务器统一获取和刷新Access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;

    2、目前Access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

    3、Access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

    公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。小程序无需配置IP白名单。

    简单来说就是调用微信的分享接口,需要用到一个凭证access_token,而这个凭证是有数量和有效时间限制的,所以需要用自己的服务器做缓存处理,当access_token过期后再去请求新的access_token,需要一台服务器和配置ip白名单。

    PHP来做的话:

     a. 先定义个access_tokenjson文件,我选择用json文件存,没有用数据库存

    {
        "access_token": "xxx",
        "expires": 12345
    }

     b.jssdk.php文件: 文件夹目录要有修改权限 sudo chmod -R 777 your_dir 

    思路:先取缓存的token的时间,与现在的时间对比,如果现在的时间大于缓存时间,则把现在时间+7200赋给缓存的时间,如果超时请求新的token,如果没超时用缓存的token,再生成jsapi_ticket,生成signature签名。

    步骤四:通过ready接口处理成功验证 又回到前端页面上

    wx.ready(function(){
        // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    });

    配置好就可以用分享接口了

    分享接口

    自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)

     

    wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
        wx.updateAppMessageShareData({ 
            title: '', // 分享标题
            desc: '', // 分享描述
            link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: '', // 分享图标
            success: function () {
              // 设置成功
            }
    });

    更多接口可以去文档里看

     

    展开全文
  • 微信JSSDK分享功能详解

    万次阅读 热门讨论 2017-04-19 16:23:09
    微信6.0之后JSSDK的调用,微信分享功能的实现,傻瓜教程
  • 如果要完成微信分享,还是有需要去微信官方开发文档看一下的。附上地址:微信开发平台微信公众平台开发文档自己老年记忆力过段时间肯定会忘记如何去实现这个功能,所以记录一下。因为自己不是写客户端的(Android、...
  • vue分享微信、朋友圈

    千次阅读 2020-05-14 14:40:06
    文章目录vue实现微信分享效果图前提: 公众号相关配置使用遇到问题 vue实现微信分享 效果图 前提: 公众号相关配置 参考微信公众平台 使用 mounted() { this.shareWx(); }, methods: { shareWx() { // alert...
  • 二、配置微信分享的SDK 三、微信分享示例 四、微信分享的结果回调 五、微信分享的踩坑总结 一、申请应用 1、首先到 [ 微信开放平台官网] 申请注册帐号,这些流程就忽略了到官网一看...
  • Android微信分享功能集成开发指南(这一篇就够了)

    万次阅读 多人点赞 2018-09-10 09:12:13
    看到网上很多关于微信分享的博客、帖子,说实话,没几篇写的全的,很多都是复制粘贴,介绍的也不全,缺少代码的分析,关键性的代码总是漏一句两句,看着就很难受。所以,在这里我打算写一篇关于微信分享的博客,总结...
  • 作为系列文章的第五篇,本文重点探讨数据采集层中的微信分享追踪系统。微信分享,早已成为移动互联网运营的主要方向之一,以Web H5页面(下面称之为微信海报)为载体,利用微信庞大的好友关系进行传播,实现宣传、...
  • 微信分享取消分享之后的回调仍是分享成功

    万次阅读 热门讨论 2018-09-17 14:20:46
    用的友盟SDK实现微信分享,发现微信分享途中如果取消分享,回调的error是nil,微信分享成功的回调返回的error也是nil,无法识别是否分享成功。问了友盟的客服才知道微信在8月13号对分享功能做了调整。...
  • 微信H5页面自定义微信分享内容

    千次阅读 2018-10-11 11:57:47
    默认在微信中打开的网页,微信分享后,标题只显示公众号名称,描述为网页URL,当我们想要微信分享后的标题、内容、图表、链接都是自定义内容,则需要集成微信JS-SDK的分享接口,在分享所在的页面注入JS-SDK权限验证...
  • 如今,社会化分享成了App必不可少的一个功能,而其中最重要的莫过于微信分享,由于微信庞大的用户群及活跃度,因此我们的App往往都需要集成微信分享,微信开放平台也提供了相应的分享SDK。鉴于看到很多人说调不起...
  • android实现微信分享功能

    千次阅读 2019-07-16 11:12:49
    本片文章的主要内容:微信分享,包括分享到好友、分享到朋友圈。 解决方案: 使用原生微信提供的sdk及其解决方案 使用已有的轮子(github里找) 使用第三方,如极光推送等。 方案一 首先,来探讨一下第一种方案:...
  • 静态页面实现微信分享

    千次阅读 2017-02-06 16:28:24
    微信分享网页的时候,希望分享出来的链接是标题+描述+缩略图,微信开发代码示例里已提供了方法,但只适用于动态页面。我使用phpcms把页面生成了静态文件,示例代码就起不到作用了。在网上找了下,有大神使用ajax实现...
  • H5之外部浏览器唤起微信分享

    万次阅读 多人点赞 2019-01-07 10:37:57
    最近在做一个手机站,要求点击分享可以直接打开微信分享出去。而不是jiathis,share分享这种的点击出来二维码。在网上看了很多,都说APP能唤起微信,手机网页实现不了。也找了很多都不能直接唤起微信。 总结出来一...
  • 在上个项目中主要用的是微信分享,由于项目前期的产品需求要求QQ分享、微信分享和微博分享等,所以集成了友盟的分享SDK, 友盟分享SDK主要是对以上各家分享做了封装,方便开发者使用. 下面是微信分享的具体流程图 (*...
  • 微信分享SDK接入——Java

    万次阅读 热门讨论 2017-07-17 21:02:37
    原先的网页需要分享到微信,可是...后台基于javaweb,微信的分享流程大致如下,详细见官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115java版微信分享的步骤首先要有一个公众号和已经备案
1 2 3 4 5 ... 20
收藏数 195,740
精华内容 78,296
关键字:

微信分享