uniapp 小程序码 scene参数 踩坑总结

uniapp 生成小程序遇到问题:

1、参数地址过长

2、接收scene参数解析

一、请求服务端:获取不限制小程序码图片地址并写入临时目录,将小程序码绘制到海报中分享转发

uniapp canvas 生成海报 小程序码 二维码_星星~笑笑的博客-CSDN博客

            //获取不限制小程序
			getUnlimitedQRCode() {
				uni.showLoading({
					title: '加载中...'
				})
				let that = this;
				var url_link = "lId=" + this.livingId + "&uid=" + this.userInfo.userId
				
				var env_version = "release"
				if (this.$config.dev == 1) {
					env_version = "trial"
				}
				let params = {
					appId: this.userInfo.appId,
					page: 'pages/index/liveDetail',
					scene: encodeURIComponent(url_link),//scene长度不能超过限制,且要encodeURIComponent
					env_version: env_version //'release' 正式版; 'trial'  体验版; 'develop'开发版
				};
                //服务端接口
				getUnlimitedQRCode(
						params
					).then((response) => {
						uni.hideLoading()
						var base64Img = 'data:image/PNG;base64,' + err;
						that.getToLocal(base64Img)
					})
					.catch(err => {
						var base64Img = 'data:image/PNG;base64,' + err;
                        //保存到本地临时目录
						that.getToLocal(base64Img)
					});
			},

             //保存到本地临时目录
			getToLocal(base64data) {
				var that = this
				// var base64data = ""; // base64
				const fsm = wx.getFileSystemManager();
				const FILE_BASE_NAME = 'tmp_base64src'; //自定义文件名
				const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || [];
				if (!format) {
					return (new Error('ERROR_BASE64SRC_PARSE'));
				}
				const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
				//要转化成 ArrayBuffer 对象的 Base64 字符串 
				const buffer = wx.base64ToArrayBuffer(bodyData);
                //写入文件到临时目录
				fsm.writeFile({
					filePath,//临时目录地址
					data: buffer,
					encoding: 'binary',
					success(r) {
						uni.hideLoading()
						that.qrCode = filePath
					},
					fail() {
						uni.hideLoading()
						return (new Error('ERROR_BASE64SRC_WRITE'));
					},
				});
			},

二、通过分享的海报扫描小程序码,进入小程序

接收小程序码传过来的参数

async onLoad(options) {
			await this.$onLaunched
			if (options.livingId) { //livingRoom
				this.livingId = options.livingId
			}

			//被邀请用户进入小程序*************start***********
            //接收到的scene要decodeURIComponent
			var decode_link = decodeURIComponent(options.scene)
            //将 lId=1&uid=2格式转化为对象
			let resObj = {}
			let regParam = /([^&=]+)=([\w\W]*?)(&|$|#)/g
			let strParam = decode_link;
			let result
			while ((result = regParam.exec(strParam)) != null) {
				resObj[result[1]] = result[2]
			}

			if (resObj.lId) {
				this.livingId = resObj.lId
			}
			if (resObj.uid) {
				this.inviteUserId = resObj.uid
			}
			//被邀请用户进入小程序*************end***********
},

通过以上操作,即可得到scene参数对象,欢迎留言评论,共同进步!

你可能感兴趣的:(小程序,uniapp,前端,uni-app,小程序,scene)