起源:

最近公司在做一个活动的h5页面,在微信内打开时需要进行微信授权,然后后端会重定向到这个页面并且携带了一些参数(openid等)。问题是点击微信的原生分享时,会把携带的这些参数一起分享出去,等于把用户信息泄露了。所以为了解决这个问题,只能实现自定义微信分享的功能,可以自定义分享的地址、标题、图标还有简介。

事先需要做的:

1.微信公众号:必须是经过微信认证的,没有认证的或者认证过期的都不可以;

2.经过备案的域名:必须是备案过的,不然是无法使用的;

3.绑定域名:首先你需要将需要分享的网址的域名绑定到微信公众平台上面,

具体操作:先登录微信公众平台进入“公众号设置”的“功能设置”里填写:JS接口安全域名;还要在"安全中心"中设置:IP白名单

后台需要做的:

1.后台服务器:前台页面需要后台服务器传过来一些配置参数,比如appId、timestamp、nonceStr、signature这几个参数都是后台从微信公众平台获取到的, 需要后台进行配合;

2.获取access_token:利用公共号APPID、APPSECRET从微信服务器获取对应的access_token,这里是后台开发小伙伴的范围不多做解释;

后台需要传的参数格式:


签名的生成步骤:

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

  1. 获取access_token(有效期7200秒,2个小时开发者必须在自己的服务全局缓存access_token):access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。具体请参考以下官方文档:

https://link.zhihu.com/?target=https%3A//developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html

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

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

返回的JSON如下:

{"access_token":"ACCESS_TOKEN","expires_in":7200}
  1. 用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,2个小时,开发者必须在自己的服务全局缓存jsapi_ticket)
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
}
  1. 生成JS-SDK权限验证的签名

参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。

首先:对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:

顺序依次为:jsapi_ticket,noncestr,timestamp,url。

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com?params=value

然后:对string1进行sha1签名,得到signature。

signature=sha1(string1) // 0f9de62fce790f9a083d5c99e95740ceb90c27ed

注意事项

签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
签名用的url必须是调用JS接口页面的完整URL。
出于安全考虑,开发者必须在服务器端实现签名的逻辑。

前端需要做的:

参考官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

1、在项目中引用微信的js-sdk

官方文档上写的是1.6.0

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

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

2、配置config

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用。同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用。其中的签名信息signature需要服务器端提供。timestamp和nonceStr是参与签名生成的字段,因此也可以由服务端一并提供,代码如下所示:

wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: '', timestamp: , nonceStr: '', signature: '',jsApiList: []
});

参数说明:
appId:公众号的唯一标识,在公众号中可以取到;
timestamp:生成签名的时间戳
nonceStr:生成签名的随机串
signature:最后生成的签名
jsApiList:需要使用的JS接口列表,我们这里是用分享接口,将分享几个api接口填进去,例如:[‘updateAppMessageShareData’, ‘updateTimelineShareData’, ‘onMenuShareQQ’]

3、通过ready接口处理成功验证

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

4、通过error接口处理失败验证

wx.error(function(res){// config信息验证失败会执行error函数,// 如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,// 也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});

所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数:

success:接口调用成功时执行的回调函数。
fail:接口调用失败时执行的回调函数。
complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。
cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。
trigger:监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。

备注:不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回。

以上几个函数都带有一个参数,类型为对象,其中除了每个接口本身返回的数据之外,还有一个通用属性errMsg,其值格式如下:

调用成功时:“xxx:ok” ,其中xxx为调用的接口名

用户取消时:“xxx:cancel”,其中xxx为调用的接口名

调用失败时:其值为具体错误信息

官方示例代码:

自定义“分享给微信朋友”及“分享到QQ好友”按钮的分享内容(JSSDK 1.4.0以上版本支持):

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

自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(JSSDK 1.4.0以上版本支持):

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

获取“分享给朋友”按钮点击状态及自定义分享内容接口(即将废弃):

wx.onMenuShareAppMessage({title: '', // 分享标题desc: '', // 分享描述link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: '', // 分享图标type: '', // 分享类型,music、video或link,不填默认为linkdataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空success: function () {// 用户点击了分享后执行的回调函数}
});

获取“分享到朋友圈”按钮点击状态及自定义分享内容接口(即将废弃):

wx.onMenuShareTimeline({title: '', // 分享标题link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: '', // 分享图标success: function () {// 用户点击了分享后执行的回调函数}
},

获取“分享到QQ”按钮点击状态及自定义分享内容接口(即将废弃):

wx.onMenuShareQQ({title: '', // 分享标题desc: '', // 分享描述link: '', // 分享链接imgUrl: '', // 分享图标success: function () {// 用户确认分享后执行的回调函数},cancel: function () {// 用户取消分享后执行的回调函数}
});

注意:

如果用旧版的 wx.onMenuShareTimeline、wx.onMenuShareAppMessage、wx.onMenuShareQQ 接口,请用1.4.0或者1.0.0的SDK。

我们用新接口的时候一直提示没有权限,用原接口的时候提示签名错误,后来换了1.0.0的SDK,后台又重新检查了下签名,并把 jsapi_ticket 缓存去掉。主要就是要一步步去测试,然后就神奇的好了。

完整的自定义分享代码:

getWXShare() {axios.get('***/***/getShareTicket', MD5({url: location.href}), function (data) {if (data.code === 200) {wx.config({// debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: data.data.appId, //后台 必填,公众号的唯一标识timestamp: data.data.timestamp, // 必填,后台生成签名的时间戳nonceStr: data.data.nonceStr, // 必填,后台生成签名的随机串signature: data.data.signature,// 必填,后台签名jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'onMenuShareAppMessage','onMenuShareTimeline', 'onMenuShareQQ', 'onMenuShareQZone']});wx.ready(function () {//分享到朋友圈(旧)wx.onMenuShareTimeline({title: '要分享的标题', // 分享标题desc: '要分享的简介',link: "要分享的地址", // 分享链接,imgUrl: '要分享图标', // 分享图标success: function () {// 用户点击了分享后执行的回调函数// console.log("分享成功");},cancel: function () {// 用户取消分享后执行的回调函数// console.log("分享取消");}});// 朋友(旧)wx.onMenuShareAppMessage({title: '要分享的标题', // 分享标题desc: '要分享的简介',link: "要分享的地址", // 分享链接,imgUrl: '要分享图标', // 分享图标success: function () {// 用户点击了分享后执行的回调函数// console.log("分享成功2");},cancel: function () {// 用户取消分享后执行的回调函数// console.log("分享取消2");}});});//必须放wx.ready后面 否则无法执行wx.error(function(res){//config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。});} else {alert('请稍后后再试')}})
},
总结:

到这一步分享的操作基本就完成了,建议在测试时将debug打开,看看分享提示,从而判定是否分享成功。如果不成功,可以参考一下在开发时候遇到的坑。

出现 nvalid url domain 提示
1)检查当前页面所在域名与使用的appid没有绑定,请确认正确填写绑定的域名,仅支持80(http)和443(https)两个端口,因此不需要填写端口号。
出现invalid signature签名错误提示
1)检查生成signature是否正确,可以通过签名校验工具来判定后端传过来的nonceStr、timestamp与请求后端接口传的地址,与最后签名是否一致。
2) config时,nonceStr 记得驼峰写法。
3) 签名用的url必须是调用JS接口页面的完整URL,即当前页面的完整URL。
提示是成功的,但是分享出来图标不见或者desc不显示的情况
1) 分享的地址不要带端口号。
2)分享desc 不要带有敏感词汇。

新更新:(2021.12.20)

最近微信新修改了自定义分享规则,通过链接点进来的分享只能分享链接;通过分享和扫码进来的可以分享链接+标题+缩略图。(实测)

微信内 H5 页面自定义分享相关推荐

  1. 微信 H5页面自定义分享link不起作用

    微信 H5页面自定义分享link不起作用 最近在做这么一个功能: H5页面在微信内打开并通过设置微信自定义分享来分享出指定的标题.图片.link 但是却遇到了问题,分享指定的link没起作用,正常通过 ...

  2. uniapp实现微信公众号内h5页面自定义标题内容和图片

    和上次一样填坑,这次是使用uniapp做的项目,下载微信的 js-sdk(1.6.0版本) cnpm install jweixin-module -S wechatShare.js var wx = ...

  3. 微信端H5页面调用分享接口

    最近公司做了一个给学生投票的H5页面,主要是在微信端使用,需要添加微信分享功能: 本文章主要是记录调用微信分享接口需要注意的事项: 1.前端用的angular1框架,首先需要在index页面引入微信接 ...

  4. 微信内h5页面打开小程序【详细教程】

    相关配置 微信js文件版本大于等于1.6.0 https://res.wx.qq.com/open/js/jweixin-1.6.0.js 微信授权配置 window.wx.config({ -oth ...

  5. h5页面生成图片分享到微信js_微信端h5页面如何调用分享页面的接口

    这次给大家带来微信端h5页面如何调用分享页面的接口,微信端h5页面调用分享页面接口的注意事项有哪些,下面就是实战案例,一起来看一下. 最近公司做了一个给学生投票的H5页面,主要是在微信端使用,需要添加 ...

  6. 微信网页开发:微信内h5使用wx-open-launch-weapp打开小程序,微信内h5使用wx-open-launch-app打开App的方案

    需求场景: 当我们需要使用在微信客户端打开的h5页面,在页面上打开微信小程序或者唤起App时,我们需要使用微信js-sdk提供的开放标签能力.这其中:使用wx-open-launch-weapp标签打 ...

  7. Android微信浏览器标题,企业微信内H5网页分享微信好友ios正常安卓自定义标题、图标、未生效...

    企业微信内H5网页分享微信好友ios正常安卓自定义标题.图标.未生效 问题类型 API/组件名称 终端类型 微信版本 基础库版本 Bug 'onMenuShareWeibo', 'onMenuShar ...

  8. 内嵌在app里的h5页面实现分享

    今天在做项目的时候, 有一个功能是内嵌在app里的h5页上有一个按钮,点击按钮要呼起微信的通讯录,进行分享,分享完成之后调后端接口记录分享次数. 如下图,呼起微信通讯录的界面是这样子: 在app里h5 ...

  9. app端内h5页面使用微信h5支付

    app端内h5页面使用微信h5支付 app端内h5页面使用微信h5支付 一.起初使用的方法 二.解决方法 三.最后 app端内h5页面使用微信h5支付 一.起初使用的方法 在对接支付宝支付的时候,我是 ...

最新文章

  1. 谷歌把安全融入主机芯片
  2. Android 自定义控件开发入门(一)
  3. April Fools Contest 2017 题解源码(A,数学 B,数学 C,数学 D,字符串 E,数字逻辑 F,排序,卡时间,G,数学)...
  4. 【Python7】csv/excel/matplotlib,排序/树遍历,线/进程,文件/xml操作,百度人脸API,aiohttp/hal/restful/curl
  5. Erlang OTP学习(3) supervisor
  6. 校园宿舍管理系统课程设计报告
  7. C++ class实现完全二叉树的顺序存储结构
  8. 命令逐行显示_在LoadRunner中执行命令行程序之:popen()取代system()
  9. 饿了么4年+阿里2年:研发路上的一些总结与思考
  10. 车间调度建模系列1|复杂车间调度问题特点
  11. 基于阿里云SDK实现发送短信功能
  12. html有多少种居中方式,html常用的几种居中方法
  13. opencms mysql_[转]OpenCms for MySql 安装图解
  14. 奥克兰大学商学院计算机专业,奥克兰大学的商科专业 推荐三大专业
  15. 百度分享如何自定义分享url和内容?
  16. word转换为html为什么图片显示不了,word插入html 转换为docx图片不显示问题
  17. 20种硬件工程师必知必会基础元器件|最新更新至8.13
  18. 拓嘉启远电商:拼多多店铺访客少怎样解决
  19. 结绳4.0编程悬浮窗制作
  20. C语言实验题目[01]

热门文章

  1. Route [register] not defined. 的解决办法
  2. Vue轻量级富文本编辑器-Vue-Quill-Editor
  3. 欺诈检测的机器学习算法及企业级欺诈检测方案!
  4. Codeforces--424A--Squats
  5. ECL模型与评级简介 |国庆不容错过的内容⑦
  6. 【Android车载系列】第5章 AOSP开发环境配置
  7. python怎样控制继电器_【Linux】树莓派控制继电器(C、python手把手教学)
  8. 感谢星球日报、陀螺财经小伙伴的肯定,我们会继续努力哒
  9. Science揭露奠基研究最大骗局:被引2300多次,重量级造假论文误导学界16年
  10. 【科研试剂】16-Heptadecynoic acid,93813-16-2,16-庚二酸