微信小程序扫码进入并携带参数

发布于 2024-07-18  269 次阅读


1、判断小程序是用户扫码进入的(携带参数),还剩用户直接进入的(没有参数)

    // 获取当前页面栈
    const pages = getCurrentPages();
    const currentPage = pages[pages.length - 1];
    // 解码获取到的scene参数值,如:teamId=1&secret=SMhbE
    const scene = decodeURIComponent(currentPage?.options?.scene) ||"";
        // 进一步解析参数
        let params = {};
        // 将参数字符串按'&'分割成数组,然后对每一项进行处理
        scene.split('&').forEach(item => {
            // 对每一项按'='分割成key和value,并存入params对象中
            // 解析后的 params:{
            //   secret: "SMhbE"
            //   teamId: "1"
            // }
            console.log(item);
            let [key, value] = item.split('=');
            params[key] = value;
        });
        //判断有无参数,来确定用户进入的方式
                if (params?.seq) {
            // uni.showToast({
            //  title: "是扫码进来的"
            // });
            console.log("是扫码进来的");
            enterFunction.value = "scan";
            seqCode.value = currentPage?.options?.scene; //seq%3D16
        } else {
            // uni.showToast({
            //  title: "是直接点进来的"
            // });
            console.log("是直接点进来的");
            enterFunction.value = "search"
        };
        return params?.seq

app内部扫码获取参数

注意,这里遇到了一个电脑端扫码和手机端扫码的坑

电脑端扫码出来的参数是未解码地址,手机小程序端扫码出来的参数是已解码重新,所以新增一个判断参数是否解码

        // 只允许通过相机扫码
        uni.scanCode({
            // onlyFromCamera: true,
            success: function(res) {
                console.log('条码类型:' + res.scanType);
                console.log('条码内容:' + res.result);
                console.log('地址' + res.path)
                console.log(decodeURIComponent(res.path));
                console.log("加密" + encodeURIComponent("seq=019"));
                if (res.path.includes("%")) {
                    console.log("未解密");

                    // console.log(res.path.split("scene=")[1]);
                    console.log(decodeURIComponent(res.path.split("scene=")[1]));
                    let code = decodeURIComponent(res.path.split("scene=")[1]);
                    formData.value.shipCode = code.split("=")[1];
                    console.log(formData);
                } else {
                    console.log("已解密");
                    // console.log(encodeURIComponent(res.path.split("scene=")[1]));
                    console.log(res.path.split("scene=")[1]);
                    let code = res.path.split("scene=")[1]
                    formData.value.shipCode = code.split("=")[1];

                }

                // uni.switchTab({
                //  url: '/'+decodeURIComponent(res.path)
                // });
                //      if (res.path.includes("%")) {
                //          uni.redirectTo({
                //              // url: '/'+decodeURIComponent(res.path)
                //              url: '/pages/pay/index?' + "scene=" + res.path.split("scene=")[1]

                //          })
                //      } else {
                //          uni.redirectTo({
                //              // url: '/'+decodeURIComponent(res.path)
                //              // + res.path.split("scene=")[0]
                //              url: '/pages/pay/index?' + "scene=" + encodeURIComponent(res.path.split("scene=")[1])

                //          })

                //      }

            },
            fail: function(res) {
                uni.showToast({
                    icon: "error",
                    title: "获取信息失败"
                })
            }
        });

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。