第三方配置就不说了,按着官方文档来就可以了

第一个坑

在进行接口鉴权时需要签名等参数,签名等参数需要调用后端接口返回。需要注意的是:调用接口需要一个参数就是页面路径地址(url参数,我这边页面路径用url作为入参,具体看后端拿什么字段作为入参字段)。
区分俩种情况:

  1. IOS端
    微信IOS版,每次切换路由,SPA的url是不会变的,发起签名请求的url参数必须是最初进入页面时的url
  2. Android端
    微信安卓版,每次切换路由,SPA的url是会变的,发起签名请求的url参数必须是当前页面的url(不是最初进入页面时的)
/** 这段代码写在App.vue的onLaunch生命周期中(在获取签名时_SYSTEM_AUTHURL会用到)* 定义全局第一次进入的页面地址,否则iOS端微信JSSDK授权会一直报invalid signature签名失效的错误* IOS:微信IOS版,微信安卓版,每次切换路由,SPA的url是不会变的,发起签名请求的url参数必须是最初进入页面时的url* Android:微信安卓版,每次切换路由,SPA的url是会变的,发起签名请求的url参数必须是当前页面的url(不是最初进入页面时的)* */
let authUrl = window.location.href.split('#')[0];
uni.setStorageSync('_SYSTEM_AUTHURL', authUrl);

第二个坑

updateAppMessageShareData的link参数,分享链接的地址上有带中文的参数(中文参数值会被干掉),安卓上分享是可以正常分享,但是在IOS上会出现报错,导致你分享标题、描述、图片等都失效了:

只要把分享链接先 encodeURIComponent转码就可以了。
例如:

// 分享的链接link
"https://www.xxx.com/test?&eid=1&name=名字"
// 改成
"https://www.xxx.com/test?&eid=1&name="+encodeURIComponent("名字")

updateAppMessageShareData示例:

// jweixin 是引入的微信sdk.js文件
jweixin.updateAppMessageShareData({title: '', // 分享标题desc: '的哈加快速度好看\r\n的时间里将埃里克', // 分享描述link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: '', // 分享图标(我这里是oss的图片全路径)success: res => {console.log('成功', res);},error: err => {console.log('失败', err);},cancel: can => {console.log('取消', can);}
})

小技巧

对于描述要实现多行显示的话:
只需要在updateAppMessageShareData的分享描述desc值,需要换行的地方拼接上一个’\r\n’。
title标题和desc描述文字过长时,会自动显示’…’

实现思路

  1. 先创建一个公共js文件wxsdk.js:
    a.引入官方文档的微信sdk文件
    b.引入获取签名的api接口文件
    c.引入store仓库index.js文件
    wesdk.js文件里大致执行顺序是:
    getWxConfig里面先调用isWechat 判断当前环境是否是微信内置浏览器
    后调用shareAppMessage分享的方法,并将分享的配置信息传过去(定制情况下),非定制情况下(这里传的是应用首页路径)
import jweixin from '@/js_sdk/jweixin-module/index.js';
import { getWxOptions } from '@/util/api/weixin.js'
import store from "@/store"
//判断是否在微信中
const isWechat = function() {var ua = window.navigator.userAgent.toLowerCase();if (ua.match(/micromessenger/i) == 'micromessenger') {return true;} else {return false;}
};
//获取微信JSSDK授权
const getWxConfig = function(shareLink) {let share = shareLink ? shareLink : '/pages/home/index?status=phi&hospitalId=' + store.getters.domainInfo.hospitalIdvar that = this;if (!that.isWechat()) {// '/pages/error/wechat'这个是警告页面提示请在微信内打开(防止将页面地址复制在手机浏览器打开)return uni.reLaunch({url: '/pages/error/wechat'})}let u = navigator.userAgent;let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端// 判断是否拿微信开发者工具打开,是的话不能走 window.entryUrl,否则sdk授权不成功if (u.indexOf('wechatdevtools') > -1) {isiOS = false}let pageUrl = '';if (isiOS) {pageUrl = uni.getStorageSync('_SYSTEM_AUTHURL');}else {pageUrl = window.location.href.split('#')[0];}let hospitalId = uni.getStorageSync('_SYSTEM_HOSPITALID');// 判断是否合作机构  请求不同授权接口getWxOptions({partnersCode: uni.getStorageSync('_PARTNER_CODE'),url: pageUrl,hospitalId}).then(res => {jweixin.config({debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: res.data.appid, // 必填,公众号的唯一标识timestamp: res.data.timestamp, // 必填,生成签名的时间戳,由开发者生成的当前时间戳nonceStr: res.data.nonceStr, // 必填,生成签名的随机串,由开发者随机生成signature: res.data.signature, // 必填,签名// 必填,需要使用的JS接口列表jsApiList: ['checkJsApi','openLocation','chooseImage','openAddress','chooseWXPay','updateAppMessageShareData','updateTimelineShareData','getLocalImgData','uploadImage','hideMenuItems']})jweixin.ready(() => {/*** config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,* 则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。*///分享给朋友接口--如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行// jweixin.updateAppMessageShareData('相关参数');setTimeout(function() {that.shareAppMessage(share);}, 100);//分享到朋友圈接口--如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行// jweixin.updateTimelineShareData('相关参数');// [生产环境] 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有 menu 项见附录3// https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.htmlif (process.uniEnv.ENV == 'prod') {jweixin.hideMenuItems({menuList: ['menuItem:copyUrl']});}});jweixin.error(err => {console.log(err, '接口验证失败');});})
};
// 分享页面
const shareAppMessage = function(shareParams) {let customizationShare = typeof shareParams == 'object' ? true : false;let shareContent = {title: '',desc: '',link: '',imgUrl: ''};if(customizationShare) {// 定制分享内容shareContent.title = shareParams.title;shareContent.desc = shareParams.desc;shareContent.link = store.getters.domainInfo.host + process.uniEnv.BASE_DIST + shareParams.link;shareContent.imgUrl = process.uniEnv.BASE_FILEURL + '/' + shareParams.imgUrl;}else {// 这里拿的是store仓库中默认的分享内容shareContent.title = store.getters.domainInfo.htmlAbbreviation + sTitle;shareContent.desc = store.getters.domainInfo.shareText;shareContent.link = store.getters.domainInfo.host + process.uniEnv.BASE_DIST + '/pages/home/index?status=phi&hospitalId=' + store.getters.domainInfo.hospitalId;shareContent.imgUrl = process.uniEnv.BASE_FILEURL + '/' + store.getters.domainInfo.logo;};jweixin.updateAppMessageShareData({title: shareContent.title, // 分享标题desc: shareContent.desc, // 分享描述link: shareContent.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: shareContent.imgUrl, // 分享图标success: res => {console.log('成功', res);},error: err => {console.log('失败', err);},cancel: can => {console.log('取消', can);}})
}
  1. 在store仓库中initsdk.js文件中写初始化sdk方法:
import getters from '../getters.js';
import wxopt from '@/util/plugins/wxsdk.js'
const payment = {state: {// 微信sdk 页面中通过Getter获取wxsdk: null,},actions: {// 初始化微信SDKinit_wxsdk({ commit, state, getters }, shareParams ) {let link;if(shareParams) {shareParams.link = shareParams.link + '&hospitalId=' + getters.domainInfo.hospitalId;link = shareParams;}else {link = '/pages/home/index?status=phi&hospitalId=' + getters.domainInfo.hospitalId;};// 通过config接口注入权限验证配置state.wxsdk = wxopt;state.wxsdk.getWxConfig(link); // 配置授权}}
}
export default payment
  1. 在App.vue的onLaunch生命周期中接着第一个坑示例代码后面写上初始化微信sdk方法,走默认分享内容
import { mapActions, mapGetters } from 'vuex';
onLaunch: function(options) {let authUrl = window.location.href.split('#')[0];uni.setStorageSync('_SYSTEM_AUTHURL', authUrl);// 写上初始化sdk方法this.init_wxsdk();
}
// 还需要在methods生命周期中写上
methods: {...mapActions(["init_wxsdk"])
}
  1. 在需要实现定制分享的页面中:
import { mapActions, mapGetters } from 'vuex';
onLoad(options) {// 走定制分享内容let shareParam = {title: this.details.fullName + ' ' + this.details.titleValue || this.details.role,desc: hospitalName + ' ' + this.deptName + '\r\n' + beGoodAt,link: nowPagesPath,imgUrl: img};this.init_wxsdk(shareParam);// 走默认分享内容this.init_wxsdk();
}
// 还需要在methods生命周期中写上
methods: {...mapActions(["init_wxsdk"])
}

微信公众号H5端网页分享微信好友-实现思路(踩坑记录总结)相关推荐

  1. 微信公众号H5开发,在微信浏览器打开H5,无法一键下载图片

    微信公众号H5开发,在微信浏览器打开H5,无法一键下载图片 背景 解决方案 文章参考 背景 微信公众号H5开发,在普通浏览器,可以直接通过以下代码下载图片: let a = document.crea ...

  2. 微信公众号h5界面获取展示微信内置地图与地图坐标间的转换 — 微信地图(gcj02)转为百度地图

    此文章中实例用测试号进行演示 .getLocation openLocation 主要运用微信JS-SDK,微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信 ...

  3. 微信公众号(移动端网页)必备的调试神器

    1.移动端调试神器vConsole 由于在移动端无法打开控制台,所以想办法打印调试console的数据一直苦恼.之前用的是chrome的inspect调试,但是只能使用移动版的chrome查看数据,兼 ...

  4. php h5微信公众号支付接口,微信公众号H5支付接口调用方法

    本文实例为大家分享了 微信内h5调用支付接口的具体代码,供大家参考,具体内容如下 官方文档 微信公众号h5接口调用 // 判断微信版本是否在5.0以上 // window.navigator.user ...

  5. 微信公众号h5的分享功能

    微信公众号h5的分享功能配置如下: 微信配置 wx.config({debug,appId,timestamp,nonceStr,signature,jsApiList: ['onMenuShareA ...

  6. Java开源项目—通用CRM管理系统(微信小程序+微信公众号+H5网页+PC管理后台)

    前言 CRM(客户关系管理)管理系统是一种用于管理客户关系的软件系统,通过收集.组织和分析客户关系数据,帮助企业更好地了解客户,提高客户满意度,提升客户服务水平,建立长期客户关系,提升企业的销售和服务 ...

  7. 微信html5开发常见bug,微信公众号H5之微信分享常见错误和问题

    url转码 确认 url是页面完整的 url(请在当前页面 alert(location.href.split('#')[0])确认),包括 'http(s)/'部分,以及'?'后面的 GET参数部分 ...

  8. 微信小程序webview清除缓存、微信公众号h5清除缓存、页面白屏、空白、不刷新问题

    一.缓存带来的问题和原因 我们在发布新版本的时候,在打开微信小程序webview嵌套的h5页面或微信公众号h5页面时,常常会发现页面还是上个版本的旧页面或者打开直接空白 白屏了,那么为什么会存在这个问 ...

  9. 微信公众号H5页面开发--微信JS-SDK引用

    微信公众号H5页面开发–微信JS-SDK引用 微信提供了微信公众号开发者手册,官方地址:https://mp.weixin.qq.com/ 公众号内许多复杂的业务场景,都是通过网页形式来提供服务,这时 ...

最新文章

  1. git 拉去merged 仓库的代码步骤
  2. 通过XML设置屏幕方向(android:screenOrientation)详解
  3. 删除一个程序Linux,一天一个Linux基础命令删除文件或目录命令rm
  4. centos7安装oracle12c 一
  5. matlab特征值分解法求多自由度系统的固有频率和主振型
  6. java native 开发环境搭建_Java3D 集成开发环境部署与配置(含实例)
  7. java中md5校验工具,java实现MD5文件校验
  8. java计算机毕业设计美发门店管理系统源码+系统+数据库+lw文档
  9. arcgis离线地图Java_ArcGIS API For Android离线地图的实现
  10. 恋与抽卡模拟器网页_恋与制作人抽卡模拟器-恋与制作人抽卡模拟器软件下载v1.14.1202-k73游戏之家...
  11. (10.13更新--完结)我不是大神(腾讯+京东+网易+阿里+去哪儿网面筋)
  12. 探秘金山隐私保险箱 (解密出加密的数据)
  13. 你是天蝎座(10.24-11.22)的吗?
  14. 全新UI众人帮任务帮PHP源码 悬赏任务抖音快手头条点赞源码 带三级分销可封装小程序
  15. linux 命令行 迅雷替代,Mac/Linux下迅雷替代方案
  16. 如何在网页里插入3D模型并进行互动展示?
  17. 行测-常识积累(2)
  18. MobileNetv2-SSDLite训练自己的数据集
  19. 软件定义存储(SDS)之入门
  20. pgr_createTopology正运行时卡死的解决

热门文章

  1. Linux系统安装与删除软件的方法
  2. CSS中RGBA和渐变色
  3. 青春有你,成长同行——2022《大数据实践课》成果展示
  4. C/C++代码获取今天凌晨零点零时零分的时间戳
  5. wordpress自定义主题
  6. 了解大数据,才能更好地学习大数据
  7. 请求转发和重定向的区别
  8. 次世代游戏建模该如何学习?
  9. Seq2Seq(Attention)的PyTorch实现(超级详细)
  10. CMOS sensor信噪比/动态范围与ISO