前言
微信分享次要是能够把咱们做的网页分享给好友或者分享到朋友圈,在发送给好友时,展现进去的音讯不是一段很丑的网址,而是带着图文形容的非凡模板音讯,很多流传性质比拟强的网页都会借助这个个性晋升流传性。要实现这个性能,须要咱们接入微信的JS-SDK,JS-SDK是什么呢?官网文档介绍如下:
微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包。
通过应用微信JS-SDK,网页开发者可借助微信高效地应用拍照、选图、语音、地位等手机零碎的能力,同时能够间接应用微信分享、扫一扫、卡券、领取等微信特有的能力,为微信用户提供更优质的网页体验。
能够看到,JS-SDK能做很多事件,那么明天,咱们先探讨对于微信分享的细节。如果你还须要实现微信受权登录相干的性能,那么能够查看笔者的这篇分享:
Vue微信开发中受权登录的优雅实现
筹备
第一步,不必多说,同样是先熟读一遍官网文档,文档地址如下:
微信开发JS-SDK应用阐明文档
这里须要非凡阐明的是,在开发之前,须要先登录微信公众平台进入“公众号设置”的“性能设置”里填写“JS接口平安域名”。
这个工作肯定不能忘,切记切记。
应用JS-SDK还有一个要害的环节,那就是通过config接口注入权限验证配置,而配置中有个signature参数是须要借助服务端获取的,所以咱们开发时仍然须要跪舔一波后端搭档给予反对(全栈的看官就当我没说)。
看完文档的看官们,应该都能梳理进去咱们接入微信分享的具体流程了,笔者梳理如下:
- 引入JS-SDK;
- 通过调用后端接口获取签名,签名算法见该页;
- 调用wx.config办法注入相干配置;
-
调用相干的分享的api,传入对应的分享信息;
实现
这里笔者以实现一个微信漂流瓶性能为例,分享一下编码过程;技术栈采纳的是Vue3+typescript,Vue2的开发者还请依据状况做适当调整。
引入JS-SDK
官网文档的形容是引入js-sdk文件,即通过script形式引入,但咱们当初是Vue利用,那么能不能通过npm仓库装置通过ESModule形式引入呢?当然是能够的,装置命令如下:
// js版本
yarn add weixin-js-sdk
// ts版本
yarn add weixin-js-sdk-ts
笔者这里装置的是ts版本, 装置完后,package.json中显示了装置的版本
封装模块
本着性能解耦准则和不便复用,笔者决定独自新建一个文件,专门封装js-sdk相干的性能。在vue3中,当然是封装成hook啦。所以,咱们在hooks目录下,新建了一个useWxSDK.ts
文件;
而后,开始封装第一个办法,即wx.config
/**
* 初始化设置
*/
function initConfig(configInfo) {
return new Promise((resolve) => {
wx.config({
debug: false,
appId: configInfo.appId,
timestamp: configInfo.timestamp,
nonceStr: configInfo.nonceStr,
signature: configInfo.signature,
jsApiList: configInfo.jsApiList ?? [
'chooseImage',
'uploadImage',
'previewImage',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'chooseWXPay',
],
openTagList: [],
})
wx.ready(() => {
resolve(true)
})
})
}
这里阐明一下wx.config办法,为啥要封装为Promise呢?其实能够看到JS-SDK的API设计是比拟原始的,咱们须要通过wx.ready去注册配置胜利后的回调函数,笔者在这里用Promise封装,在ready回调函数里调用Promise.resolve,那么咱们在用的时候,就能够通过优雅的then语法来实现配置胜利后的操作啦!
接下来封装分享好友和微信朋友圈的办法:
/** 设置微信分享 */
function setShareInfo(shareInfo,onSuccess, onCancel) {
wx.onMenuShareTimeline({
title: shareInfo.title, // 分享题目
link: shareInfo.link, // 分享链接,能够不是以后页面,该链接域名或门路必须与当前页面对应的公众号JS平安域名统一
imgUrl: shareInfo.imgUrl,
success: function () {
// 用户确认分享后执行的回调函数
onSuccess()
},
cancel: function () {
onCancel()
// 用户勾销分享后执行的回调函数
},
})
wx.onMenuShareAppMessage({
title: shareInfo.title, // 分享题目
desc: shareInfo.desc,
link: shareInfo.link, // 分享链接,能够不是以后页面,该链接域名或门路必须与当前页面对应的公众号JS平安域名统一
imgUrl: shareInfo.imgUrl,
type: 'link', // 分享类型,music、video或link,不填默认为link
success: function () {
// 用户确认分享后执行的回调函数
onSuccess()
},
cancel: function () {
// 用户勾销分享后执行的回调函数
onCancel()
},
})
}
接下来,开始搭积木。因为思考到分享这个操作,也是会在多个页面复用,那么有必要再形象一个分享的办法,这样在须要用到微信分享的中央间接调用该办法就行。因而,笔者又新建了一个useWxShare.ts
文件
import { getJsSDKConfigApi } from "@/api/wechat";
import { useWxSDK } from "@/hooks/useWxSDK";
export function useWxShare(shareConfig: {
title: string;
imgUrl: string;
desc: string;
}) {
const { initConfig, setShareInfo } = useWxSDK();
const shareUrl = window.location.href.split("#")[0];
getJsSDKConfigApi(shareUrl).then((config) => {
// 调用后端接口获取config相干信息
initConfig(config).then(() => {
// 注入wx.config胜利后,设置微信分享相干
setShareInfo({
...shareConfig,
link: shareUrl,
});
});
});
}
至此,封装结束,而后,咱们到页面组件到mounted函数里调用该办法,即可
<script>
import { useWxShare } from '@/hooks/useWxShare'
export default defineComponent({
setup() {
},
mounted() {
useWxShare({
title: '这是题目',
desc: '这是形容',
imgUrl: 'http://yourimg.com/share-pic.png',
})
},
})
</script>
补坑
这样就完结了吗?当然不是,这里边有个大坑,笔者在之前的博客中也分享过,就是如果咱们的页面是采纳的Vue Router的history模式的路由的话,在某些状况下,会呈现iOS设施上分享生效的问题。举个栗子。假如咱们都通过http://domain.com进入,而后跳转到路由为/share的页面须要用到jssdk,那么理论js-sdk进行签名校验时所获取的以后页面url在ios和andrioid是不同的,在安卓上没有任何问题,js-sdk校验的url就是以后页面的url,也就是http://domain.com/share。而在iOS上,js-sdk校验的url是咱们刚进入页面时候的url,也就是http://domain.com,然而咱们后端那边签名用的是以后页面的url,这就导致iOS上,签名校验不胜利。
那么该如何解决呢?笔者这边采取的方法是在入口文件或者根组件中记录以后页面URL,在页面组件创立实现后,ios获取记录的url进行签名,android获取以后路由。所以填坑如下:App.vue
import { defineComponent } from 'vue'
import { useWxSDK } from '@/common/hooks/useWxSDK'
import { commonStore } from '@/store/modules/common'
export default defineComponent({
name: 'App',
setup() {
const { isiOSWechat } = useWxSDK()
// 检测到是ios微信,则把入口页地址记录到store中
if (isiOSWechat()) {
const url = window.location.href.split('#')[0]
commonStore.saveVisitUrl(url)
}
},
})
</script>
@/hooks/useWxSDK.ts
/** 是否是ios微信 */
function isiOSWechat() {
return (window as any).__wxjs_is_wkwebview
}
@/hooks/useWxShare.ts
import { getJsSDKConfigApi } from '@/api/wechat'
import { useWxSDK } from '@/common/hooks/useWxSDK'
import { commonStore } from '@/store/modules/common'
export function useWxShare(shareConfig: { title: string; imgUrl: string; desc: string }) {
const { initConfig, setShareInfo, isiOSWechat } = useWxSDK()
const shareUrl = window.location.href.split('#')[0]
// 对签名url做非凡判断解决
const signatureUrl = isiOSWechat() ? commonStore.commonState.visitUrl : shareUrl
getJsSDKConfigApi(signatureUrl).then((config) => {
initConfig(config).then(() => {
setShareInfo({
...shareConfig,
link: shareUrl,
})
})
})
}
@/store/modules/common.ts
import { Module, VuexModule, Mutation, getModule } from 'vuex-module-decorators'
import store from '@/store'
import { initialUnencryptedStorage } from '../globals'
interface CommonState {
/** ios微信用,记录拜访时候页面url */
visitUrl: string
}
const NAME = 'common'
@Module({
namespaced: true,
name: NAME,
dynamic: true,
store,
preserveState: Boolean(initialUnencryptedStorage[NAME]),
})
export class Common extends VuexModule {
commonState: CommonState = {
visitUrl: '',
}
@Mutation
saveVisitUrl(url: string): void {
this.commonState.visitUrl = url
}
}
export const commonStore = getModule<Common>(Common)
看成果
首先咱们还是应用微信开发工具上看看成果
先,输出咱我的项目的地址
关上后,能够看到,获取config信息的申请已胜利发送和返回,再看控制台
控制台显示了wx.config的配置日志以及设置分享的日志,这个示意咱们的分享配置胜利了。点右上角分享,如果能显示咱们配置的分享题目,那就没问题啦。
最初,还是要在真机上试试看,真机上分享进去后,成果如下:
须要体验的小伙伴,能够在微信中扫下边二维码
同时,笔者曾经把我的项目的代码托管到了Github上,欢送有须要的小伙伴点击该链接自取
总结
其实微信分享相对来说,性能并不简单,难点在于如何得当的解决JS-SDK在单页利用上的一些坑。另外,也就是代码组织和封装的问题了,笔者看过很多我的项目,在代码复用和形象上没有多花心思,导致整个我的项目到处都是复制粘贴的反复代码,显得很臃肿。通过笔者这样解耦形象后,在调用层只须要简略的一个函数即可,是不是就显得分外的优雅呢?
写在最初
最近工作略微闲了些,笔者打算用Vue3+ts+vant从0开始实现一个公众号利用并将开发过程分享进去,也算是激励本人继续学习的一个形式吧。如果有想法和倡议,欢送找我探讨哦。
同时,为不便大家更好的探讨微信公众号开发相干技术,笔者也建了一个微信群,欢送退出和大家一起学习成长。
发表回复