微信自定义分享 前端填坑

需求都是大同小异的,要做微信分享,当然了,微信内部浏览器右上角 ‘...’ 点击就可以分享,但是往往分享的信息是不尽人意的,因为自动获取title,不能显示description,还很有可能拿不到图片,这样的信息分享给我的话,我就默认是小广告了(手动摊手~~~)。所以自定义分享势在必行。

1.配置微信JS接口安全域名(参考微信官方文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 JSSDK使用步骤

微信公众号配置JS接口安全域名,并且把ip地址加入白名单。我在测试环境中,如果不添加白名单,获取的appid直接报错为非法appid,导致接下来的步骤根本没法进行。

2.依次获取 access_token,jsapi_ticket,signature
获取这些神奇的东西的步骤实际上是这样的:

appid & appsecret ====> access_token ====> jsapi_ticket ====> signature

①首先用appid和appsecret获取access_token,这里的appid和appsecret是公众号里可以拿到的。

②根据获取的access_token,请求路径 https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi 获取 jsapi_ticket 。返回值为一段JSON,参考官方文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 附录1-JS-SDK使用权限签名算法

③进行签名算法,signature=sha1(string1)。

签名 signature = sha1(string1)。这里的 string1 是由4部分组成,分别是

  • jsapi_ticket:获取到的
  • timestamp:随机时间戳
  • noncestr:随机字符串
  • url:要分享页面的路径,这里需要强调一下,这个url的域名,需要跟公众号JS接口安全域名一致。

string1 = jsapi_ticket=jsapi_ticket的值&noncestr=noncestr的值&timestamp=timestamp的值&url=url的值

后台算法 sha1() 加密字符串 string1 生成签名 signature 。

①②③这些步骤是后台完成,前端只需要接收后台传过来的值即可。

需要注意的是,我的业务需求是前端获取本页面路径,向后台发送页面路径,也就是组成签名算法中的 url 的值,所以看各自需求,写法不固定,但是这个值是必需的。由于后台要求,不可以全局缓存 access_token ,所以这个功能并没有做,也就是说一天请求的 access_token 的次数上限就是2000。(还真是对自己的产品没信心哦~~~)。至于路径的转义字符,路径加多个参数,参数与参数之间需要用 '&' 来连接,但是在我的项目中,直接传递 '&' ,到后台的时候会直接转义为 '&' 导致 url 与当前路径不一致,进而导致 signature 签名错误,所以我直接在前端转义成 '&', 其他的任务交给后台处理,当然这只是一个现象,这个还是要根据后台的情况而定的,我的后台是 php,不同的后台会遇到的问题也许不大相同,慢慢来喽~~

<!--------微信自定义分享-------->
//先调用微信js
<script src="//res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
//微信分享
//只能调用微信内部浏览器右上角'...' 唤起微信分享,无法做到自定义按钮调用分享接口
var urlstr = window.location.href;
var urlPath = urlstr.replace(/&/g,'%26'); 
$.ajax({
    url: k_host + "/WxGetSignature", //k_host 为本地路径,忽略就好,这个实际上就是把需要分享页面的 url 传给后台
    data:{
        url: urlPath,
    },
    async: true,
    type: 'POST',
    cache: false,
    dataType: 'json',
    success:function(data){
            var res = data.data;
            wx.config({
                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId: res.appid,
                timestamp: res.timestamp, // 必填,生成签名的时间戳
                nonceStr: res.noncestr, // 必填,生成签名的随机串
                signature: res.signature,// 必填,签名
                jsApiList: [ // 必填,需要使用的JS接口列表
                    'onMenuShareTimeline',
                    'onMenuShareAppMessage',
                    'onMenuShareQQ',
                    'onMenuShareWeibo',
                    'onMenuShareQZone'
                ]
            });
            wx.ready(function () {
                wx.onMenuShareAppMessage({
                    title: '测试用 title',
                    desc: '测试用 description',
                    imgUrl: '分享图标的路径', // 分享图标
                    type: '', // 分享类型,music、video或link,不填默认为link
                    dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
                    link: urlstr, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                    success : function () {
                        //分享成功需要执行的函数
                    },
                    cancel: function (err) {
                        // console.log(err);
                        // 用户取消分享后执行的回调函数
                    }
                });
                wx.onMenuShareTimeline({
                    title: '测试用 title',
                    desc: '测试用 description',
                    imgUrl: '分享图标的路径', // 分享图标
                    type: '', // 分享类型,music、video或link,不填默认为link
                    dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
                    link: urlstr, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                    success : function () {
                        //分享成功需要执行的函数
                    },
                    cancel: function (err) {
                        console.log(err);
                        // 用户取消分享后执行的回调函数
                    }
                });
            });
            wx.error(function(res){
            });
    },
    error:function(request){
        alert("连接失败,请检查网络,稍后再试");
    }
});
<!--------微信自定义分享-------->

以上是前端代码,遇到的问题基本就是 JS 接口安全域名,添加 IP 到白名单,签名算法,其他很顺利。本来打算一开始去做成点击自定义按钮调起微信分享,结果去官方社区查了以后发现,是不可行的,没有方法和接口提供给开发者, 虽然微信自己的 demo 中有这种点击按钮,调用分享,可是在真机测试中,并没有什么毛用,打debugger发现代码根本没进分享,后来就放弃,如果哪位大神有办法的话,请指点一二。

所有的调试都是在微信开发工具中完成的,不然微信的 debugger 模式是无法开启的(吐槽一下开发者工具,不是那么好用哦~~~)。

希望能帮到在微信分享坑中无法自拔的小伙伴们(哭笑不得.gif)~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容