前言

在h5的页面开发中,分享是不可或缺的一部分,对于一些传播性比较强的页面,活动页之类的,分享功能极为重要。例如,京东等电商年末时会有一系列的总结h5在微信中传播,就不得不提到微信的分享机制。

微信分享

最简单的配置

微信分享静态页

微信分享需要后台回传时间戳、签名等信息,如果页面比较简单,就可以用下述方法做简单设置。

微信默认抓取第一张符合要求的图片作为分享图,图片大于300px × 300px,图片不能是display:none的。

根据上述规则,img的设置可以为这样:

<img src="//img30.360buyimg.com/mobilecms/jfs/t4033/80/1876911537/17072/11729313/589bec20Nc5555ece.jpg" style="position:absolute;width:100%;z-index:0;">

要记得把这张图片放到最前面,如果网页加载了其他符合规则的图片,也能保证正常分享。

(之前看到过一个weixinjsbridge的源码,抓取的规则大概是这样,具体忘记了,后面也找不到那个源代码了,如果有错误,请通知我。)

分享标题是取页面标题,可以使用js动态修改标题,但是iOS下会有问题,有关修改title的hack,方法如下。

/**
* 处理微信设置title问题
* 页面在加载完成后设置title在微信下不会触发改变
*/
define(function(){
return function(src){
var frame = document.createElement('iframe'),flag = false;
frame.style.display = 'none';
frame.onload=frame.onerror=frame.onreadystatechange=function(){
if(flag){return}
flag = true;
setTimeout(function(){document.body.removeChild(frame)},0)
};
//
frame.src = src? (src + (src.indexOf('?') != -1?'&':'?') + '__=' + Date.now()) : '/favicon.ico',
document.body.appendChild(frame);
}
});

类似的hack有很多,基于jquery、原生的也有很多,基本原理就是使用iframe。

之后分享以后,在朋友圈是这样



与好友分享后是这样



如果对于分享的要求不高,上面的方法就可以了。

But,怎么可能?

真正的分享

在传播性极强的h5活动页中,经常会需要带有不同的图片、定制的描述、title等等,此时,必须要申请一个公众号,并且需要后台的配合,才能完整的使用微信的分享功能。

申请公众号交给产品,开发接口交给网关,前端要做什么呢?

先放个官方文档链接,我来简述步骤,如果有疑问,可以留言,或者查阅官方文档。

  1. 页面导入官方js,http://res.wx.qq.com/open/js/jweixin-1.2.0.js。(需要吐槽的是,之前官网是是1.0.0版本,突然变成了1.2.0,毫无通知。。)
  2. 请求接口,获取时间戳、签名等一系列公众号的信息。
  3. 调用wx.config(),把这些必填的信息填入。
  4. 调用wx.ready() 处理一些初始化的内容。此处配置分享到朋友圈、分享给好友的内容。
  5. 调用wx.error()处理错误信息,有时候签名会失效,此处可以重新请求接口,重新进行2-4步。
  6. end

    简单吧,官方文档十分详细,接下来分享一个方法,大家可以自行参考修改。
var wxShares = function(title, desc, link, imgUrl) {
// req为我封装的一个ajax方法
req({
url: '//youdomainulr.com', // 请求接口url
success: function(data) {
if (typeof data == "string") {
data = JSON.parse(data);
}
// 具体的数据结构不一定是这样,只是例子
var appId = data.shareResult.appId,
timestamp = data.shareResult.timestamp,
nonceStr = data.shareResult.nonceStr,
signature = data.shareResult.signature;
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: appId, // 必填,公众号的唯一标识
timestamp: timestamp, // 必填,生成签名的时间戳
nonceStr: nonceStr, // 必填,生成签名的随机串
signature: signature, // 必填,签名,见附录1
jsApiList: ['checkJsApi',
'openLocation',
'getLocation',
'onMenuShareTimeline',
'onMenuShareAppMessage'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function() {
wx.checkJsApi({
jsApiList: [
'getLocation',
'onMenuShareTimeline',
'onMenuShareAppMessage'
],
success: function(res) {
// alert(JSON.stringify(res));
}
});
wx.onMenuShareAppMessage({
title: title, // 分享标题
desc: desc, // 分享描述
link: link, // 分享链接
imgUrl: imgUrl, // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function() {
console.log("分享成功");
// 用户确认分享后执行的回调函数
},
cancel: function() {
// 用户取消分享后执行的回调函数
}
});
wx.onMenuShareTimeline({
title: title, // 分享标题
link: link, // 分享链接
imgUrl: imgUrl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
}); }
});
};

上面的代码给出了分享到朋友圈和分享给好友的例子,其他还有很多渠道如qq、微博,大同小异,请自行参考官方文档。

line分享

微信还不够,我们要做海外站了怎么办?这时需要分享到line。(facebook由于业务不适合,不需要做,我暂时没有研究,如果有空,我会补一篇。)

老样子,先上官方文档。line被墙了,可能需要翻墙。

官方文档极为贴心,基本上可以满足大部分需求,我这里也不赘述了,按照官方文档一步步操作很简单。

But,官网的例子只支持那几种按钮样式,我要自定义样式怎么办?官方提供了提交途径,问题我写一个页面,要搞这么麻烦吗?

于是我想到了唤起app协议,就这么一搜,哈哈哈哈哈



看看贴心的Google智能提示第一个是什么,哈哈哈哈哈哈

然而,我发现,并不能打开官网,剩下的英文网站也没有解答,日语看不懂。o(╥﹏╥)o ,后来终于找到了一篇博客

<meta property="og:title" content="標題"/>
<meta property="og:description" content="內容敘述"/>
<meta property="og:url" content="分享網址"/>
<meta property="og:image" content="分享圖片"/>

注意这上面提到的抓取meta,如果非要适配line,可以这么写,如果不需要,就按照正常的配置就行了。

<title>京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!</title>
<meta name="description" content="京东JD.COM-专业的综合网上购物商城,销售家电、数码通讯、电脑、家居百货、服装服饰、母婴、图书、食品等数万个品牌优质商品.便捷、诚信的服务,为您提供愉悦的网上购物体验!">
<link rel="apple-touch-icon-precomposed" href="//st.360buyimg.com/m/images/apple-touch-icon.png?v=jd201709071824">



如图所示,line内置的爬虫会自己抓取页面上的配置。

上面的写法基本上就满足我们的需要了。因为line是自行抓取分享过来的链接上的内容,他提到的配置我也懒得上线了,就抄着主站上的内容改一改就行了。哈哈

接下來我們來看主要的分享連結,這兩個方法就是這次的主角

//桌機

"https://lineit.line.me/share/ui?url="+ encodeURIComponent("分享的網址")

//手機

"line://msg/text/"+ encodeURIComponent("分享的網址")

这里需要判断环境,pc的话,就另起标签页,它自己会判断cookie登录与否,否则就用类似openapp的这种协议,去唤起line(如果安装了的话,就会打开line)。

这里有一个问题,正常来说,如果用户安装了,则自己打开line正常分享,没装的话,就没法打开这种协议了。

而且,经过我在微信、uc等环境下打开,(我装了line),并不会跳转到line里面,毫无反应,也不提示找不到app。不知道国外的app是不是也是这个调性。

最后与产品协调解决方案是,判断是否在line中,如果在,调用line分享,否则,弹窗展示一个url,让用户去复制粘贴。o(╥﹏╥)o,也算是降级方案了吧。

line环境下的webview发送请求时,ua会带有 Line 这个字段,按照这样处理即可。

方法如下:

function getPlatform () {
var
_ua = navigator.userAgent
, _iswx = _ua.indexOf('MicroMessenger') != -1
, _isLine = _ua.indexOf('Line') != -1
;
if (_iswx) {
return "wx";
} else if (_isLine) {
return "line";
} else {
return "m";
}
}
/**
** obj 为share对象,封装需要传递的描述信息
** callback 为callback对象,封装了一些不同平台下的回调函数
*/
function share(obj, callback) {
getShareInformation(function () {
var
shareObj = obj || {}
, title = obj.title || '默认title'
, desc = obj.desc || '默认描述'
, url = obj.url || '默认url'
, img = obj.img || '默认图片'
, currentPlatform = getPlatform()
;
switch (currentPlatform) {
case 'wx':
// TODO 需要请求微信的一些信息
callback.wxCallback(shareObj);
break;
case 'line':
window.open('line://msg/text/'+ encodeURIComponent(url),"_blank")
break;
case 'm':
callback.mCallback(shareObj);
break;
default:
callback.mCallback(shareObj);
break;
}
}) }

以上。

一篇搞定微信分享和line分享的更多相关文章

  1. 一个PHP文件搞定微信H5支付

     / 更新于 2018-07-02 / 8 条评论 过年期间也坚持要撸码啊接着给博客除草,在这个小除夕是情人节的一天,祝大家新年快乐,情人节能够顺利脱单~~~ 回归正题,这篇文章介绍一下微信H5支付, ...

  2. 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  3. 一篇搞定RSA加密与SHA签名|与Java完全同步

    基础知识 什么是RSA?答:RSA是一种非对称加密算法,常用来对传输数据进行加密,配合上数字摘要算法,也可以进行文字签名. RSA加密中padding?答:padding即填充方式,由于RSA加密算法 ...

  4. 零java基础搞定微信Server

    自从打通了微信client到BLE设备端的通道.我的工作就转移到了server端了.微信的BlueDemoServer是以java编写,而本尊仅仅懂得嵌入式,对JavaWeb一窍不通. 本尊贵为IOT ...

  5. 十分钟搞定微信企业帐号“echostr校验失败,请您检查是否正确解密并输出明文echostr”

    问题域:在这里我们只解决密文可以正确解密,但微信验证提示“echostr校验失败,请您检查是否正确解密并输出明文echostr”的问题. 干货:没有正确验证的原因是:你给微信返回的是字符串,而微信需要 ...

  6. 使用localtunne一分钟搞定微信公众号接入

      记得15年那个刚刚进入工作的时候,公司有个微信公众号的项目,那个时候微信官方没有什么调试工具,也没有什么比较好的本地调试工具.当时有个功能需要调用微信JSSDK里面的扫一扫的功能.由于本地不能调试 ...

  7. python 一篇搞定所有的异常处理

    一:什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在python无法正常处理程序时就会发生一个异常(异常是python对象,表示一个错误) 异常就是 ...

  8. 一篇搞定MongoDB

    MongoDB最基础的东西,我这边就不多说了,这提供罗兄三篇给大家热身 MongoDB初始 MongoDB逻辑与物理存储结构 MongoDB的基础操作 最后对上述内容和关系型数据做个对比 非关系型数据 ...

  9. 一个github搞定微信小程序支付系列

    详情请前往github下载示例代码 源码中包含 支付.退款 功能 so easy,项目经理再也不用担心微信支付啦 是的,已经over了

随机推荐

  1. Win10家庭版重命名Administrator用户文件夹

    需要将Windows系统默认的Administrator帐号文件夹改名为我们自定义的名称.. 但是Win10家庭版找不到组策略gpedit.msc 根据微软官方有关Win10各版本操作系统中对于组策略 ...

  2. MyEclipse 2014各种优化设置

    各种优化大整合,陆续更新使用中的问题,也欢迎大家提问. 1.通用优化设置:字体,UTF-8编码格式设置: http://jingyan.baidu.com/article/b907e627d2c5da ...

  3. R语言安装加载包

    问题描述 在国内因为镜像的原因,直接使用:install.packages("plyr")往往无法成功添加安装包 解决办法 使用国内镜像进行安装,添加repo参数,参考如下: in ...

  4. Spring AOP术语解释

    话说,越来越感觉有些人解释概念真的是晦涩难懂,我刚开始学习Spring aop时,对那些切入点,连接点,引入等概念搞得头疼.太多人就直接照搬定义,让我们这些初学者如何理解啊.下面是我找了大量的博客,终 ...

  5. python进阶学习(二)

    本节学习图形用户界面 ------------------------ 本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口.这里介绍wxPython : 下载地 ...

  6. 程序员也有春天之HTTP/2.0配置

    哎呀,一不小心自己的博客也是HTTP/2.0了,前段时间对网站进行了https迁移并上了CDN,最终的结果是这酱紫的(重点小绿锁,安全标示以及HTTP/2.0请求). 科普 随着互联网的快速发展,HT ...

  7. win7系统盘扩容后不识别修复方法

    谢天谢地 终于在不重装系统的情况下,把C盘修复好了. win7系统,C盘之前是200G,使用中慢慢的就用完, 虽然把几乎所有的软件都移植到D盘了但是还是不能释放更多的空间.剩下60多G的空间,一般够用 ...

  8. UCOS-II学习记录

    本文主要记录使用UCOS II的相关内容.包括如何完成第一个UCOS II应用程序,和如何创建任务,如何获取系统时间,和利用i3086 驱动完成时间获取,屏幕显示,按键驱动,信号量等内容. UCOS- ...

  9. Spring Cloud官方文档中文版-客户端负载均衡:Ribbon

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_spring_cloud_netflix 文中例子我做了一些测试在:h ...

  10. datable 翻页事件处理

    JQuery datatable插件,点下一页在点击事件无效问题 (2013-10-16 16:01:54) 转载▼   分类: C# 在MVC的项目中,我利用jquery datatable 来实现 ...