微信小程序开发总结(附源代码)

最近公司项目不是很忙,有时间研究研究微信小程序。参考了目前市场上各类答题类的app、小程序等等,做了一款自己的微信答题小程序,包括前端和后端,后端是用node做的。现在已经上线了,名字叫【你问我猜猜猜】,大家感兴趣的话可以去试玩一下。

会vue、react, 微信小程序,so easy

如果之前用过vue或者react,直接看看文档上手微信小程序完全没问题。整体开发思路很相似,包括其中的一些语法,基本上都是一样的。或者用美团的mpvue框架,那就根本不用学习小程序的语法了,写起来跟vue一样。但是我们开发的时候没有用框架,用的是原生的微信小程序语言,开发起来也很easy。而且微信小程序有很多自己的API,比如图片上传、下载、音频等等,项目中用到的时候再找文档就来得及。

这次开发的难点,也是微信小程序的难点,应该就是在登录了。如果把登录流程弄明白了,在开发其他的功能,基本上就是时间的问题了。

难点:微信小程序登录

看了好多文档关于登录相关的介绍,下图的介绍是比较详细的过程,开发过程中也是采用的这个逻辑。只不过我们没有获取用户的敏感信息,所以没有7、8步骤。直接通过wx.getUserInfo()获取到用户名、头像等信息即可满足我们的需求。

登录步骤

  1. 通过调用wx.login() API,成功后会拿到用户的code信息
  2. 将code信息通过接口,传给自己的后台(不是微信的后台),在服务端发起对微信后台的请求,成功后拿到用户登录态信息,包括openid、session_key等。也就是通常所说的拿code换openid,这个openid是用户的唯一标识。
  3. 自己的后台,拿到openid、session_key等信息后,通过第三方加密,生成自己的session信息,返回给前端。
  4. 前端拿到第三方加密后的session后,通过wx.setStorage()保存在本地,以后的请求都需要携带这个经过第三方加密的session信息。
  5. 之后如果需要用户重新登录,先去检查本地的session信息,如果存在,再用wx.checkSession()检查是否在微信的服务器端过期。如果本地不存在或者已过期,则重新从步骤1开始走登录流程。

登录的代码如下:

 wx.getStorage({
      key: "code",
      success: res => {
        wx.checkSession({
          success: res => {
            console.log("Session未过期,登陆状态未失效");
          },
          fail: err => {
            // 重新登录
            console.log("Session过期,重新登录");
            loginAction();
          }
        });
      },
      fail: res => {
        console.log("无code信息,调用登录接口获取code");
        loginAction();
      }
    });

登录的流程图如下:

微信小程序开发总结(附源代码)_第1张图片
signin.png

注意事项

1. npm这么容易,install个包用用?

微信小程序没有包管理这一说(但是最新版本的好像支持npm了),所以想要用到别的库里的组件,只能找到源码,copy过来。

2. 既然openid是唯一的,那我为什么不能用openid作为凭证,还要麻烦的用个第三方session

有可能造成数据越权。比如今天我通过我的手机登录了微信,打开了小程序。但是明天有个朋友想用我的手机登一下微信。如果用openid作为登录凭证,登录小程序的时候检测到openid已经存在,所以不会再走登录过程,这样我的数据就让我的朋友看到了。所以还是要按照官方推荐的步骤来。

3. 本地启服务,如何通过localhost访问服务端接口?

微信小程序默认都是https请求,如果本地开发联调,需要在开发者工具 -> 项目设置里,勾选上【不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书】,这样就可以愉快的使用localhost访问服务端了。

4. textarea组件如何清空

一个常用的使用场景,用户反馈里,用户巴拉巴拉吐槽完,点击确认发送成功后,为了防止用户再次重复提交,需要将textarea中的数据清空。

用过vue的大家都知道,绑定一个字段,当成功后将这个字段赋值为空就好了。but,微信小程序可不干。
微信小程序文档中这样说明:不建议在多行文本上对用户的输入进行修改,所以 textarea 的 bindinput 处理函数并不会将返回值反映到 textarea 上。

如何解决呢。可以给textarea绑定一个value值。用form表单去提交。成功后将value绑定的值清空就可以了。

具体代码如下: