vue 开发微信公众号小问题

本文探讨了使用Vue进行微信公众号开发的常见问题解决方案,包括iframe滑动、浏览器类型判断、限制页面缩放、微信jssdk集成等,为开发者提供实用的代码示例和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue 开发微信公众号小问题

iframe 标签无法滑动

  • 参考功能:阅读协议,读取静态html页面

  • 源码

    <div class="demo-iframe-holder">
        <iframe src="../../static/html/htmlname.htm" frameborder="0" scrolling="yes"></iframe>
    </div>
    
    /* iframe 滑动样式 */
    .demo-iframe-holder {
      position: fixed;
      right: 0;
      bottom: 0;
      left: 0;
      top: 0;
      -webkit-overflow-scrolling: touch;
      overflow-y: scroll;
    }
    .demo-iframe-holder iframe {
      height: 100%;
      width: 100%;
    }
    

选择图片时,不同系统的手机可能不能拍照或选择图片,判断浏览器类型

  • 区分浏览器类型

  • 源码

    <input v-if="showwx" type="file" accept="image/*" capture='camera' multiple='multiple' @change="selectImgs" ref="file">
    <input v-if="shownotwx" type="file" accept="image/*" multiple='multiple' @change="selectImgs" ref="file">
    
    // 判断浏览器是否是微信浏览器(处理图片上传的时候选择相机和相册)
    init () {
        let agent = navigator.userAgent.toLowerCase()
        let iswx = agent.indexOf('qqbrowser') >= 0
        if (iswx) {
            this.showwx = true
        } else {
            this.shownotwx = true
        }
    },
    

限制浏览器自动缩放页面

  • 在index.html修改元信息

  • 源码

    <!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> -->
    <meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,initial-scale=1,user-scalable=no" />
    

微信浏览器返回事件集成微信jssdk

  • 前端源码

    import wx from 'weixin-js-sdk'
    import axios from 'axios'
    
    export const wxInit = () => {
      axios
        .get('/stars/wechatjssdk/config')
        .then(result => {
          if (result && result.status === 200) {
            let data = result.data
            if (data !== null) {
              let param = {
                debug: false,
                appId: data.appid, // 必填,公众号的唯一标识
                timestamp: data.timestamp, // 必填,生成签名的时间戳
                nonceStr: data.nonceStr, // 必填,生成签名的随机串
                signature: data.signature, // 必填,签名
                jsApiList: ['closeWindow'] // 必填,需要使用的JS接口列表
              }
              wx.config(param)
              wx.ready(() => {
                console.log('通过ready接口处理成功验证')
              })
              wx.error(res => {
                console.error('通过error接口处理失败验证')
              })
            }
            console.log(data)
          }
        })
        .catch(err => {
          console.error(err)
        })
    }
    
    // 将本页路由添加到history记录中
    const pushHistory = () => {
      var state = {
        title: 'title',
        url: '__SELF__'
      }
      window.history.pushState(state, state.title, state.url)
    }
    // 返回公众号首页
    export const wechatBackHome = () => {
      pushHistory()
      window.addEventListener(
        'popstate',
        function (e) {
          wx.closeWindow()
        },
        false
      )
    }
    
  • 后端源码

    import xxx.WechatData;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.*;
    
    /**
     * @author xxx
     * @create 2018/07/07 14:22
     * @description 微信jssdk接口控制器
     */
    @RestController
    @RequestMapping("/wechatjssdk")
    public class WechatJssdkController {
    
        protected final Logger logger = LoggerFactory.getLogger(this.getClass());
        @Autowired
        private WechatData wechatData;
    
        @GetMapping("/config")
        public Map<String, String> getWxConfig(@RequestParam("url") String url) {
            logger.info("获取wechat-jssdk-config");
            System.out.println(url);
            String appId = wechatData.getAppID();
    
            Map<String, String> map = new HashMap<>();
            String nonce_str = create_nonce_str();
            String timestamp = create_timestamp();
            String string1;
            String signature = "";
    
            //注意这里参数名必须全部小写,且必须有序
            string1 = "appid=" + appId +
                "&noncestr=" + nonce_str +
                "&timestamp=" + timestamp +
                "&url=" + url;
    
            try {
                MessageDigest crypt = MessageDigest.getInstance("SHA-1");
                crypt.reset();
                crypt.update(string1.getBytes("UTF-8"));
                signature = byteToHex(crypt.digest());
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            map.put("url", url);
            map.put("appid", appId);
            map.put("nonceStr", nonce_str);
            map.put("timestamp", timestamp);
            map.put("signature", signature);
            return map;
        }
    
        private static String byteToHex(final byte[] hash) {
            Formatter formatter = new Formatter();
            for (byte b : hash) {
                formatter.format("%02x", b);
            }
            String result = formatter.toString();
            formatter.close();
            return result;
        }
    
        private static String create_nonce_str() {
            return UUID.randomUUID().toString();
        }
    
        private static String create_timestamp() {
            return Long.toString(System.currentTimeMillis() / 1000);
        }
    }
    
### 使用 Vue 开发微信公众号的最佳实践 #### 选择合适的框架和技术栈 为了更高效地开发微信公众号,建议采用基于 Vue.js 的框架,如 WeVue 或 Vant Weapp。这些框架专门为构建微信小程序和 H5 应用而设计,集成了最新的前端技术和最佳实践,能够显著简化开发流程并提升效率[^1]。 #### 初始化项目结构 创建一个合理的项目目录结构对于维护代码至关重要。通常情况下,推荐按照以下方式进行组织: - `src/`:源码根目录 - `assets/`: 存放静态资源文件 - `components/`: 组件库所在位置 - `pages/`: 各个页面对应的模块 - `router/`: 路由配置 - `store/`: Vuex状态管理仓库 - `utils/`: 工具函数集合 - `App.vue`: 主应用程序入口组件 - `main.js`: Webpack打包入口文件 ```javascript // main.js 示例 import Vue from 'vue'; import App from './App.vue'; new Vue({ render: h => h(App), }).$mount('#app'); ``` #### 集成必要的插件和服务 针对微信特有的功能需求,需引入相应的 SDK 和服务接口。例如,在集成微信支付时,应严格遵循官方文档指导完成相应操作,并注意解决可能出现的技术难题,比如 JSSDK 签名验证失败等问题[^2][^3]。 #### 处理常见问题与优化体验 在实际开发过程中可能会遇到各种挑战,如 iOS 平台上的分享链接异常、URL 中特殊字符被截断等情况。面对这些问题开发者应当仔细排查原因,并采取适当措施加以修正。此外,还应注意用户体验方面的细节调整,确保应用流畅运行于不同设备之上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值