uniapp的H5端之微信JsSdk的开放标签以及Api使用心得

前言:项目是uni写的微网页,前期功能还算正常,但是随着项目进程,发现某些地方不得不使用微信sdk了,比如跳转app导航和从微信浏览器跳转到微信小程序,于是开始研究微信sdk的使用方式,中间还是遇到不少坑,特此记录一下,以便后期回忆,也方便涉及该功能开发的小伙伴查阅,希望大家在此功能上少走弯路。

一、引入jsSdk包(util/jsSdk.js)

这里我是通过npm的方式

npm install weixin-js-sdk --sava

二、封装方法

该方法我借鉴了(说明一下)UNI-APP使用微信SDK(微信H5)_WeirdoPrincess的博客-CSDN博客_jweixin sdk

import jWeixin from 'weixin-js-sdk'
import $http from '@/common/http/requestConfig';

export default {
	/* 判断是否在微信中 */
	isWechat: function() {
		var ua = window.navigator.userAgent.toLowerCase();
		if (ua.match(/micromessenger/i) == 'micromessenger') {
			//console.log('是微信客户端')  
			return true;
		} else {
			//console.log('不是微信客户端')  
			//以下是我项目中所需要的操作其他,可以自定义
			uni.showModal({
				title: '提示',
				content: '请在微信浏览器中打开',
				showCancel: false,
				success: function(res) {
					if (res.confirm) {
						// console.log('用户点击确定');
					} else if (res.cancel) {
						// console.log('用户点击取消');
					}
				}
			});
			return false;
		}
	},
	/* 获取sdk初始化配置 */
	initJssdk(callback) {
		let that = this
		let url = window.location.href
		$http.request({
			url: `******/JSSDKSignature?url=${window.location.href.split('#')[0]}`,
			method: "GET"
		}).then((res) => {
			if (res.code != 200) {
				uni.showToast({
					title: res.msg,
					duration: 3000,
					icon: 'error'
				});
				return
			} else { //请求成功,开始登陆
				jWeixin.config({
					debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
					beta: true,
					appId: 'wxb1983************7b', // 必填,公众号的唯一标识
					timestamp: res.data.timestamp, // 必填,生成签名的时间戳
					nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
					signature: res.data.signature, // 必填,签名
					jsApiList: ['openLocation'], // 必填,需要使用的JS接口列表
					openTagList: ['wx-open-launch-weapp'] // 非必填,
				});
				/* wx.hideAllNonBaseMenuItem(); */
				jWeixin.checkJsApi({
					jsApiList: ['openLocation'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
					openTagList: ['wx-open-launch-weapp'] // 需要检测的微信公众号开放标签,
				});
				// 	jWeixin.ready(function(res2) {

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


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

				if (callback) {
					callback(res.data);
				}
			}
		}).catch((res) => {
			console.log(res.data)
		})
	},
	//在需要定位页面调用  
	getlocation: function(callback) {
		if (!this.isWechat()) {
			//console.log('不是微信客户端')  
			return;
		}
		this.initJssdk(function(res) {
			jWeixin.ready(function() {
				jWeixin.getLocation({
					type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'  
					success: function(res) {
						// console.log(res);  
						callback(res)
					},
					fail: function(res) {
						console.log(res)
					},
				});
			});
		});
	},
	//打开位置  
	openlocation: function(data) {
		if (!this.isWechat()) {
			//console.log('不是微信客户端')  
			return;
		}
		this.initJssdk(function(res) {
			jWeixin.ready(function() {
				jWeixin.openLocation({ //根据传入的坐标打开地图  
					latitude: data.latitude,
					longitude: data.longitude,
					name: data.name, // 位置名
					address: data.address, // 地址详情说明
					scale: data.scale // 地图缩放级别,整型值,范围从1~28。默认为最大
				});
			});
		});
	},
}

把方法挂到全局:

import wxJsSdk from '@/util/jsSdk.js'
Vue.prototype.$wxJsSdk = wxJsSdk;

三、微信开放标签的使用和微信SDK的api使用区分

1、微信开放标签

使用微信开放标签只需要调用封装方法上的initJssdk方法,也就是app.vue接入,然后全局可以使用:

	onLaunch: function() {
			this.$wxJsSdk.initJssdk()
		},

使用方式辨别(这里以<wx-open-launch-weapp>来说明,用以网页跳转小程序):

①、单个<wx-open-launch-weapp>的使用,很简单,只要app.vue里调用到initJssdk()方法,那么可以直接在页面使用该标签,该标签使用方式,微信开放文档有,可以自行查看,这里不赘述(还是贴一段把)

<wx-open-launch-weapp
  id="launch-btn"
  username="gh_xxxxxxxx"
  path="pages/home/index?user=123&action=abc"
>
  <script type="text/wxtag-template">
    <style>.btn { padding: 12px }</style>
    <button class="btn">打开小程序</button>
  </script>
</wx-open-launch-weapp>
<script>
  var btn = document.getElementById('launch-btn');
  btn.addEventListener('launch', function (e) {
    console.log('success');
  });
  btn.addEventListener('error', function (e) {
    console.log('fail', e.detail);
  });
</script>

②、动态生成多个能够跳转小程序的“button”

直接说答案:动态标签插入,使用v-html,类似于原生的innerHtml += ‘’ 的方式来动态插入节点的方式,以下是实现方式:

template:

<view class="" v-html="createMyNode(item)"></view>

script:

createMyNode(item) {
				let script = document.createElement('script')
				script.type = 'text/wxtag-template'
				let html = ''
				script.text = '<div style="width:80px;height:80px;"></div>'
				html =
					`<wx-open-launch-weapp style="width:100%;height:100%;" username="${item.isWechatApp}"path="${item.outUrl}">${script.outerHTML}</wx-open-launch-weapp>`
				return html
			},

2、微信jsSDK的jsApi

jsApi需要调用到封装方法里面的函数,我这里是打开某个坐标,用微信来唤醒app导航:

handleAppNav() {
				let data = {
					latitude: this.popUpMarket.latitude, // 纬度,浮点数,范围为90 ~ -90
					longitude: this.popUpMarket.longitude, // 经度,浮点数,范围为180 ~ -180。
					name: this.popUpMarket.title, // 位置名
					address: this.popUpMarket.pointInfo.loc, // 地址详情说明
					scale: 10, // 地图缩放级别,整型值,范围从1~28。默认为最大
				}
				this.$wxJsSdk.openlocation(data)
			},

注意api要在jWexin.ready里面调用:

	//打开位置  
	openlocation: function(data) {
		if (!this.isWechat()) {
			//console.log('不是微信客户端')  
			return;
		}
		this.initJssdk(function(res) {
			jWeixin.ready(function() {
				jWeixin.openLocation({ //根据传入的坐标打开地图  
					latitude: data.latitude,
					longitude: data.longitude,
					name: data.name, // 位置名
					address: data.address, // 地址详情说明
					scale: data.scale // 地图缩放级别,整型值,范围从1~28。默认为最大
				});
			});
		});
	},

3、总结(踩坑):该方式也是借鉴了他人的博客,但是具体忘记是哪一篇了,结合自己的业务需求做了一些更改,并且这个部分也踩了些坑:

1、在开放标签<wx-open-launch-weapp>体内不要放太多标签,切记不要把项目的ui组件扔里面,直接无效无法渲染,其次是不要给体内标签设置百分比的高度,直接不识别,必须要固定的也就是px的高才行。

2、我们跳转的唯一途径,是去点击<wx-open-launch-weapp>这一标签,所以将这个标签覆盖在之前位置即可,样式也是写在父级盒子上面就行,<wx-open-launch-weapp>体内建议不写样式(每次调试都需要部署代码到域名上才能调试,很麻烦,所以不要在体内设置样式,直接在外部写,写完覆盖,设置opacity为0 即可让外部样式充当此标签样式)

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微信jssdk是一种用于在网页中调用微信功能的开发工具包。其中,获取位置是其中的一个功能之一。当在调用微信jssdk获取位置接口时,如果出现获取位置失败,签名错误的情况,可能是以下几个原因所导致: 1. 签名错误:在调用获取位置接口前,需要对相关参数进行签名验证,以确保数据的完整性和安全性。签名错误可能是由于签名算法实现错误、调用接口时传入的参数错误或者服务器时间戳与微信服务器时间戳不一致等原因所导致。解决方法是检查签名算法是否正确,参数是否正确传递,并确保服务器时间戳与微信服务器时间戳一致。 2. 接口权限问题:在申请微信jssdk使用权限时,需要在公众号设置中配置相关权限。如果没有正确配置接口权限,则无法调用获取位置接口,会出现获取位置失败的情况。解决方法是检查公众号设置中的权限配置,确保获取位置接口的权限被正确开启。 3. 用户拒绝授权:在用户使用网页时,系统会通过微信弹出授权窗口,询问用户是否允许获取位置信息。如果用户选择拒绝授权,则无法获取位置信息,从而导致获取位置失败的情况。解决方法是在用户拒绝授权后,提示用户重新授权,或者提供其他方式获取位置信息。 总之,当微信jssdk获取位置失败,签名错误时,需要仔细检查签名算法、参数传递和接口权限配置等方面的问题,并根据具体情况进行相应的调整和处理。 ### 回答2: 微信jssdk是一个用于在网页中调用微信的接口的开发工具包。在使用jssdk时,通过wx.config方法来进行配置,并且在配置的过程中需要传入一个参数:签名(signature)。 签名是基于一定算法生成的,用于验证消息的真实性和完整性。当微信jssdk获取位置失败并且报错签名错误时,可能是由以下几个原因造成的: 1. 签名生成错误:签名的生成过程中可能出现错误,导致最终生成的签名不正确。这可能是由于服务生成签名的算法或参数配置有误,需要检查签名生成代码并修正错误。 2. 参数传递错误:在传递签名参数时,可能存在传递错误的情况。签名参数包括appId、timestamp、nonceStr、signature,这些参数需要按照规定的格式传递给wx.config方法。需要仔细检查参数传递的过程,确保参数的准确性和完整性。 3. SSL证书问题:微信要求在调用jssdk使用HTTPS协议,并且需要使用有效的SSL证书。如果网页没有配置有效的SSL证书,那么在获取位置时会报错签名错误。需要确保网页使用HTTPS协议,并且配置了有效的SSL证书。 解决以上问题的步骤为: 1. 检查签名生成代码,确认生成签名的算法和参数没有错误; 2. 检查参数传递过程,确保传递给wx.config方法的参数准确无误; 3. 确认网页使用了HTTPS协议,并配置了有效的SSL证书; 4. 在修改代码后,重新测试获取位置功能,如果问题仍然存在,可以参考微信官方文档或寻求微信开发者论坛的帮助。 ### 回答3: 微信 JSSDK 是一种用于开发微信公众号的前端开发工具包,它提供了丰富的接口和功能,方便开发者构建丰富的微信公众号应用。当使用 JSSDK 中的定位功能时,获取位置失败并出现签名错误的问题可能是由以下几个原因引起的。 1. 网络问题:在使用微信 JSSDK 时,要求设备能够连接到互联网,如果网络不稳定或者设备无法连接到互联网,就可能导致定位功能失败。请确保设备有稳定的网络连接。 2. 位置权限:微信 JSSDK 需要用户授权才能获取设备的位置信息。如果用户拒绝了位置权限请求,那么就无法获取到位置信息。在使用定位功能前,应该向用户请求位置权限,并在用户授权后才能使用。 3. 未配置有效的签名:微信 JSSDK 需要在后台进行配置并生成签名,用于验证请求的合法性。如果签名错误,就无法正确获取位置信息。在生成签名时,需要保证参数的正确性,包括参数的顺序、大小写等。请仔细检查签名生成的代码逻辑和参数配置是否正确。 4. 使用API 接口不支持:微信 JSSDK 提供了多个获取位置的接口,不同的接口可能有不同的要求和适用场景。如果使用的接口与当前场景不匹配或者不支持当前设备的操作系统版本,可能会导致获取位置失败。请确认使用的接口与当前场景的要求是匹配的。 综上所述,当微信 JSSDK 获取位置失败并出现签名错误时,可能是网络问题、位置权限、签名配置或使用的接口不正确导致的。在解决问题时,可以逐一排查以上原因,并根据具体情况进行相应的调试和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值