前言

在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. 【Centos7】Delete virtual bridge

    Previously,Stop service which controls virtual bridges. sudo systemctl stop libvirtd.service #System ...

  2. FBI Warning

    FBI Warning... --------------------------- 电影中的片头部分:<正宗的FBI Warning>: ========== 翻译: fbi warni ...

  3. Vim中常用的命令行

    Vim中常用的命令行... ------------------- 一些真正强大的武器总不是那么容易驾驭的,主角总得付出一些努力才能收获到更加强大的力量,对于 Vim 这种上古神器来说更是如此.由于它 ...

  4. 大咖云集!IMWebConf 2017 前端大会即将在深圳盛大开幕

    2017年火热的夏季,一年一度的IMWebConf强势来袭!9月16日,深圳科兴国际会议中心,我们将全心全意打造一场前端盛宴,恭候各位的光临. 作为一名前端老鸟,笔者有幸也参与了本次的大会的主题分享& ...

  5. BestCoder Round #32_1001 以及 hdu 5182

    http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=570&pid=1001 http://acm.hdu. ...

  6. 优雅的H5下拉刷新【minirefresh】

    序 严格的来说,这是我第一个完全投入的开源项目,它的出现是为了统一移动H5中的下拉刷新,想通过一套框架,多主题拓展方式,适应于任意需求下的任意下拉刷新场景. 另外,这个项目作为独立项目存在,希望能有更 ...

  7. 使用 qemu 搭建内核开发环境

    本文主要介绍在 MacOS 上使用 qemu 搭建 Linux Kernel 的开发环境.(在开始之前需要注意的是,本文中的 Linux 开发环境是一个远程服务器,而 qemu 被安装在本地的 Mac ...

  8. carry-检查数据接口返回数据合法性

    问题背景: 在测试&部署监控过程中,我们常常会遇到外部接口返回数据不靠谱的时候.最常见的场合是从某个http获取如json和xml等结构化的结果,进行解析并处理,在这时候出现以下这几种常见类型 ...

  9. Dapper获取连接类

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  10. 浅谈如何用Java操作MongoDB

    NoSQL数据库因其可扩展性使其变得越来越流行,利用NoSQL数据库可以给你带来更多的好处,MongoDB是一个用C++编写的可度可扩展性的开源NoSQL数据库.本文主要讲述如何使用Java操作Mon ...