详解微信小程序的 request 封装示例


Posted in Javascript onAugust 21, 2018

背景

之前小程序代码混乱,所以新项目一开始就准备弄个微信小程序的 request 的封装

httpUtils.js

const request = function (path, method, data, header) {
 let user_id = "";
 let token = "";
 try {
  user_id = wx.getStorageSync(USER_ID_KEY);
  token = wx.getStorageSync(TOKEN_KEY);
 } catch (e) {}
 header = header || {};
 let cookie = [];
 cookie.push("USERID=" + user_id);
 cookie.push("TOKEN=" + token);
 cookie.push("device=" + 1);
 cookie.push("app_name=" + 1);
 cookie.push("app_version=" + ENV_VERSION);
 cookie.push("channel=" + 1);
 header.cookie = cookie.join("; ");
 return new Promise((resolve, reject) => {
  wx.request({//后台请求
   url: API_BASE_URL + path,
   header: header,
   method: method,
   data: data,
   success: function (res) {
    if (res.code) {
     reject(res.data)
    } else {
     resolve(res.data)
    }
   },
   fail: function (res) {
    reject("not data");
   }
  });
 });
};

userLogin.js

const login = function () {
 try {
  wx.removeStorageSync(USER_ID_KEY);
  wx.removeStorageSync(TOKEN_KEY)
 } catch (e) {}
 return new Promise((resolve, reject) => {
  wx.login({
   success: res => {
    let code = res.code;
    // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
    wx.getUserInfo({
     withCredentials: true,
     success: res => {
      let userInfo = res.userInfo;
      let name = userInfo.nickName;
      let avatar = userInfo.avatarUrl;
      let sex = userInfo.gender;
      let data = {
       code: code,
       encryptedData: res.encryptedData,
       iv: res.iv,
       name: name,
       avatar: avatar,
       sex: sex,
       from: FROM,
      };
      request("/api/user_login/byWeChatApplet", "POST", data).then( (res)=>{
       if (!res.code) {
        try {
         wx.setStorageSync(USER_ID_KEY, res.user_id);
         wx.setStorageSync(TOKEN_KEY, res.token)
        } catch (e) {
         reject(JSON.stringify(e));
        }
       }
       resolve(res)
      }).catch( (errMsg)=>{
       reject(errMsg)
      });
     },
     fail: function (res) {
      if (res.errMsg && res.errMsg.startsWith("getUserInfo:fail") && res.errMsg.search("unauthorized") !== -1) {
       reject("getUserInfo:fail");
       return;
      }
      wx.getSetting({
       success: (res) => {
        if (!res.authSetting["scope.userInfo"]) {//没授权
         showModal('提示', '需要获取用户的权限,点击确定前往设置,打开用户信息', true, function (res) {
          wx.openSetting({
           success: (res) => {
            // 用户返回 不管是否开启 接着去重新登录
            login().then( (res)=>{
             if (res.code) {
              reject(res.message);
              return
             }
             try {
              wx.setStorageSync(USER_ID_KEY, res.user_id);
              wx.setStorageSync(TOKEN_KEY, res.token)
             } catch (e) {
              reject(JSON.stringify(e));
             }
             resolve(res)
            }).catch( (errMsg)=>{
             reject(errMsg)
            });
           }
          })
         }, function () {})
        }
       }
      });
     }
    })
   }
  })
 });
};

项目地址:https://github.com/lmxdawn/wxa-demo

一个 vue + thinkphp5.1 搭建的后台管理:https://github.com/lmxdawn/vue-admin-html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery.addClass始终无效原因分析
Sep 08 Javascript
js解决弹窗问题实现班级跳转DIV示例
Jan 06 Javascript
你可能不知道的JavaScript的new Function()方法
Apr 17 Javascript
javasctipt如何显示几分钟前、几天前等
Apr 30 Javascript
node中socket.io的事件使用详解
Dec 15 Javascript
jQuery原生的动画效果
Jul 10 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
Aug 28 Javascript
JS实现三个层重叠点击互相切换的方法
Oct 06 Javascript
jquery判断复选框是否被选中的方法
Oct 16 Javascript
使用vue-router为每个路由配置各自的title
Jul 30 Javascript
vue中各种通信传值方式总结
Feb 14 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 #Javascript
vue监听对象及对象属性问题
Aug 20 #Javascript
微信小程序中使用自定义图标(阿里icon)的方法
Aug 20 #Javascript
Vue插件打包与发布的方法示例
Aug 20 #Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
Aug 20 #Javascript
解决jquery有正确返回值但不执行success函数的问题
Aug 20 #jQuery
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
Aug 20 #Javascript
You might like
在PHP中使用XML
2006/10/09 PHP
php入门小知识
2008/03/24 PHP
php 生成文字png图片的代码
2011/04/17 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
jquery改变tr背景色的示例代码
2013/12/28 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
大专学生推荐信范文
2013/11/19 职场文书
化工专业推荐信范文
2013/11/28 职场文书
新学期班主任寄语
2014/01/18 职场文书
运动会四百米广播稿
2014/01/19 职场文书
西式结婚主持词
2014/03/14 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS