前端微信公众号开发踩坑笔记

登录微信公众号后台

  • 一个邮箱只能注册一个公众号、服务号或小程序中的一种。
  • 进入微信公众平台后台的登陆方式是 公众号注册邮箱 + 密码 + 微信扫码验证
  • 微信账户必须有管理员权限才能进入微信公众平台后台管理系统。

微信公众号网页开发基本流程

  1. 下载微信开发者工具
  2. 打开微信开发者工具,选择公众号网页。
  3. 输入 URL 访问页面进行调试网页调试和开发。

获取用户信息操作流程

  1. 去微信公众号后台为开发者的微信号配置开发者权限
  2. 去微信公众号后台配置网页授权域名
  3. 按照微信网页授权文档流程调用接口获取用户信息。
  4. 在微信公众号或者微信开发者工具中进行调试。

这边说下我的配置方式,当某些页面需要获取授权,就在微信公众号菜单入口处配置微信授权的 URL:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

微信域名配置

如果需要完整的使用微信公众号的所有功能,需要进行域名配置。配置项在微信公众号后台,一共有三个域名配置:

  • 业务域名 —— 设置业务域名后,在微信内访问该域名下页面时,不会被重新排版。用户在该域名上进行输入时,不出现下图所示的安全提示。
  • JS 接口安全域名 —— 配置后可以调用微信公众号的 JS-SDK 相关接口。
  • 网页授权域名 —— 配置后可获取用户信息的授权。

而配置这些域名首先必须要将验证文件访问域名根目录下。我的做法是使用 CopyPlugin 来实现:

  // webpack.config
  new CopyPlugin([
    { from: path.resolve(__dirname, '../MP_verify_1111111111.txt'), to: path.resolve(__dirname, '../dist') }, // 开发环境公众号
    { from: path.resolve(__dirname, '../MP_verify_222222222.txt'), to: path.resolve(__dirname, '../dist') }, // 生产环境公众号
  ])

当然更好的方式应该是按照不同的环境拷贝不同的验证文件。

微信授权前后端交互方案

微信的两种获取用户信息授权方式:snsapi_basesnsapi_userinfo。前者只是获取用户 OpenID,而后者获取所有的用户信息(需要哦用户手动授权)。

由于项目暂时无需获取用户其他信息,所以用的是 snsapi_base

具体网页授权的步骤微信文档说的是一样的:

  1. 在微信公众号网页环境下访问拼接的微信授权 URL,如:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
  2. 由于选择的是 snsapi_base 所以微信公众号会进行静默获取用户信息,通过授权的话会重定向到一个带了参数的 redirect_uri 路径上,没有通过授权则会弹窗报错(具体可以看报错看文档)。
  3. redirect_uri 后会带有一个参数 code,将 code 值传给后端,后端调用微信的接口请求获取 access_token (同时也获取到了用户的 OpenID),此时就实现了获取用户信息。

在项目中,我们先后用了两种方案:

  1. 将用户 OpenID 存储在 cookie 中来进行前后端通信。
  2. 每次从微信公众号进入 H5 页面都进行微信网页授权。

由于需求里要求当用户换了手机登录微信也要保证能拿到用户信息,所以我们最终采用了第二种方案。

IOS 软键盘将页面顶上去的问题

开发中遇到了 IOS 上软键盘弹出后界面推上去的问题,参考 ios 最新系统bug与解决——微信公众号中弹出键盘再收起时,原虚拟键盘位点击事件无效

查了网上的资料后发现是 IOS 下微信公众号网页被虚拟键盘把界面顶上去了,当虚拟键盘消失时没有返回原样。

解决方案是在 input 和 textarea 失去焦点的时候主动将页面滑动到正确位置:

  // util.js
  function IOSKeyboardFixer () {
    if (appApi.isIos) {
      document.body && (document.body.scrollTop = document.body.scrollTop)
    }
  }
<InputItem {...this.props} onBlur={() => { util.IOSKeyboardFixer() }} />

微信缓存解决方法

先是试着添加了缓存 mata 标签,但是在 IOS 中还是有缓存。

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>

最终是通过为所有文件加上 hash 值的方式解决了缓存问题。
注意,加了 hash 的时候别忘了入口文件 index.js。一开始我忘了给 index.js 加上 hash,结果导致 index.js 文件报找不到如 1.[hash].js 文件的错误(因为重新打包部署 hash 变了)。

  // webpack.config.js
  output: {
    filename: 'js/[name].[hash:8].js',
    chunkFilename: 'js/[name].[chunkhash:8].js',
    libraryTarget: 'umd'
  },

微信 JS-SDK 的使用方法

在使用 JS-SDK 前需要调用 wx.config 方法进行配置,对于 SPA 单页应用而言我们需要在页面路由跳转后都执行一次 config 方法。

使用 config 方法接入微信 JS-SDK 的详情看见文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

简单说下步骤:

  1. 在微信公众号后台配置 JS 接口安全域名
  2. 引入 JS 文件,可以使用 npm 安装 npm i weixin-js-sdk --save
  3. 通过 config 接口注入权限验证配置(难点)
  4. 通过 ready 接口处理成功验证。
  5. 通过 error 接口处理失败验证。

最麻烦的在于第 3 步,看下 config 接口的配置内容:

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳(填写当前时间毫秒字符串)
    nonceStr: '', // 必填,生成签名的随机串(使用 Math.random() 随机生成字符串)
    signature: '',// 必填,签名(使用 sha1 算法生成的签名字符串)(sha1 算法可以使用 jsSHA 来生成)
    jsApiList: [] // 必填,需要使用的JS接口列表(需要什么接口就写什么接口)
});

debug 是判断是否要开始调试模式;
appId 就是微信公众号的 AppID 了;
timestamp 就是时间戳,填入当前毫秒就好;
noncestr 是一个随机字符串,可以使用 random 函数来实现;
signature 则是根据 timestamp 和 noncestr 通过 SHA1 算法生成的哈希签名字符串;
jsApiList 用于限定开发者要用到的 JS API。

这里 sha1 算法可以用 jsSHA 来实现。

配置完成后,就可以调用微信接口实现业务需求了:

wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
    wx.updateAppMessageShareData({ 
        title: '', // 分享标题
        desc: '', // 分享描述
        link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
        imgUrl: '', // 分享图标
        success: function () {
          // 设置成功
        }
    })
});

具体的 JS-SDK 接入实践可以看下 https://www.jianshu.com/p/740dc1e387cd 一文,是用 JS 来实现的。

其他

  • 一开始接触微信开发,最好能够拿到微信公众平台的后台管理系统权限。进去看看配置内容对于理解微信公众号开发很重要。
  • 腾讯的文档真的是坑,需要反复阅读和理解。
  • 微信公众号的配置并不是像开发文档上那样都是用 python 后端写的,其实是可以直接用微信公众号后台来管理。不要被迷惑了~
  • 微信公众平台可以为开发者配置开发权限,用于在微信网页开发工具上开发调试。也可以配置运维权限,用于登陆到后台管理系统去维护公众号相关配置。
  • 的方式来登陆到微信公众平台后台管理系统。(如果没有配管理员权限是无法进入后台管理系统的)
  • 微信公众平台的文档一大堆,前端同学需要认真了解的就是 微信网页开发 部分的内容。

微信公众号 H5 开发会遇到坑的地方

  • 微信浏览器的兼容性
  • 微信获取用户信息授权
  • 微信 JS-SDK 的配置和使用
  • 微信公众号后台配置和安全验证
  • 微信缓存问题
  • 在微信分享和微信支付

总结

对于从来没有开发过公众号的同学而言,摸索开发公众号前端部分还是要费一些心思踩微信的坑的。这里记录下我的踩坑历程,希望能对他人有所帮助吧~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343