微信小程序(二)

正文

这次写一些小程序使用的比较多的JS公共库内容

app.js
获取授权,后台使用的Senparc.Weixin.dll与微信交互,wx.login({})就不讲了,官方Demo已经提供了
// 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo
              typeof cb == "function" && cb(that.globalData.userInfo)
              //校验
              util.NetRequest({
                url: '/CheckSignature',
                method: 'POST',
                data: {
                  sessionId: wx.getStorageSync('sessionId'),
                  rawData: res.rawData,
                  signature: res.signature
                },
                success: function (json) {
                  var cwos = json.data
                  var checkSuccess = cwos.success;
                  console.log("签名校验" + checkSuccess);
                  if (checkSuccess)
                    util.NetRequest({
                      url: '/DecodeEncryptedData',
                      method: 'POST',
                      data: {
                        'type': "userInfo",
                        sessionId: wx.getStorageSync('sessionId'),
                        encryptedData: res.encryptedData,
                        iv: res.iv
                      },
                      success: function (json) {
                        var deData = json.data;
                        console.log("水印校验" + deData.success);
                        wx.hideLoading();
                      },
                      fail: function (res) {
                        //console.log(res);
                        wx.hideLoading();
                      }, complete: function (res) {
                        // console.log(res);
                      }
                    }, false);
                }
              }, false);
              // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    });
Utils.js
封装wx.request
const apiUrl = 'https://xxxx.com';
function NetRequest({ url, data, success, fail, complete, method = "POST" }) {
  return new Promise(function (resolve, reject){
    var session_id = wx.getStorageSync('sessionId');//本地取存储的sessionID
    if (session_id != "" && session_id != null) {
      var header = { 'content-type': 'application/x-www-form-urlencoded', 'Cookie': 'sessionId=' + session_id }
    } else {
      var header = { 'content-type': 'application/x-www-form-urlencoded' }
    }  
    wx.request({
      url: apiUrl + '/Wx' + url,
      method: method,
      data: data,
      header: header,
      success: res => {
        if (session_id == "" || session_id == null) {
          wx.setStorageSync('sessionId', res.data.session_id) //如果本地没有就说明第一次请求 把返回的session id 存入本地
        } 
        if (res['statusCode'] === 200)
        //微信授权过期,需要重新授权,由服务器返回这个错误
          if (res.data.msg === '请重新授权' && url.indexOf('Login') == -1) { 
            // 重新登录
            wx.login({
              success: wxres => {
                // 发送 res.code 到后台换取 openId, sessionKey, unionId
                if (wxres.code) { 
                  // 登录
                  wx.login({
                    success: res => {
                      // 发送 res.code 到后台换取 openId, sessionKey, unionId
                      if (res.code) {
                        //发起网络请求  
                        wx.request({
                          url: apiUrl + '/Wx/Login',
                          method: 'POST',
                          data: {
                            code: res.code
                          },
                          success: function (res) {
                            var result = res.data;
                            if (result.success) {
                              wx.setStorageSync('openid', res.data.openid);
                              wx.setStorageSync('sessionId', result.sessionId); 
                              data.sessionId = result.sessionId;
                              //登陆成功后重新发起之前的请求
                              NetRequest({
                                url,
                                data,
                                method: 'POST',
                                success,
                                fail,
                                complete
                              })
                            } else {
                              console.log('储存session失败!', result);
                            }
                          },
                          fail: function (err) {
                            console.log(err)
                          }
                        })
                      } else {
                        console.log('获取用户登录态失败!' + res.errMsg)
                      }
                    }
                  })
                } else {
                  console.log('获取用户登录态失败!' + res.errMsg)
                }
              }
            })
          } else {
            resolve(success(res));
          }

        else reject(fail(res));
      },
      fail: function (fail){
        reject(fail)
      },
      complete: complete
    })
  })

}
Index.js
如何调用NetRequest
//发起网络请求
    util.NetRequest({
      url: '/Get',
      method: 'POST',
      data: {
        sessionId: wx.getStorageSync('sessionId')
      },
      success: function (res) {
        var result = res.data;
        if (result.success) {  
          that.setData({ 
            array: result
          })
        } else {
          //xxx
        } 
      },
      fail: function (err) {
        console.log(err) 
      }, complete: function (res) {
        //console.log(res);
      }
    });
js计算金额这块需要乘100,否则金额最终结果会不对
支付金额计算,输入的金额保留两位小数,以分为单位, 如果需要在界面显示需要自行计算出来的值除以100,如(Moeny/ 100).toFixed(2)
//计算含有服务费的金额
function CalculateMoneyByRate(value, rate) {
  var dot = value.indexOf('.')
  if (dot > -1) {
    if (value.length > (dot + 3)) {
      value = value.substring(0, dot + 3) * 100;
      var intRate = (value * rate);
      var total_fee = value + intRate;
      return parseInt(total_fee);
    } else if (value.substring(dot + 1, value.length).indexOf('.') > -1) {
      var bdot = value.substring(dot + 1, value.length).indexOf('.');
      value = value.substring(0, dot + 1 + bdot) * 100;
      var intRate = (value * rate);
      var total_fee = value + intRate;
      return parseInt(total_fee);
    } else {
      value = value * 100;
      if (dot == (value.length - 1) && value.substring(dot + 1, value.length).indexOf('.') > -1) {
        value = value.substring(0, dot)
      }
      var intRate = value * rate;
      var total_fee = value + intRate;
      return parseInt(total_fee);
    }
  } else {
    value = value * 100;
    if (dot == (value.length - 1)) {
      value = value.substring(0, dot)
    }
    var intRate = value * rate;
    var total_fee = value + intRate;
    return parseInt(total_fee);
  }
}
// 计算未包含服务费金额
function CalculateMoney(value) {
  var dot = value.indexOf('.')
  if (dot > -1) {
    if (value.length > (dot + 3)) {
      value = value.substring(0, dot + 3);
      return value;
    } else if (value.substring(dot + 1, value.length).indexOf('.') > -1) {
      var bdot = value.substring(dot + 1, value.length).indexOf('.');
      value = value.substring(0, dot + 1 + bdot);
      return value;
    } else {
      if (dot == (value.length - 1) && value.substring(dot + 1, value.length).indexOf('.') > -1) {
        value = value.substring(0, dot)
      }
      return value;
    }
  } else {
    return value;
  }
}
计时器
/**
   * 秒级倒计时
   */
var timer;
//清除计时器
function clearTimr() {
  clearTimeout(timer);
}
function countdown(that, second) {
  clearTimr(); //防止多个计时器运行
  if (second == 0) { 
    that.setData({ 
        second: 30
      }); 
      countdown(that, 30);
  }
  timer = setTimeout(function () {
    if (second > 0) { 
      that.setData({
        second: second - 1
      });
      second = second - 1; 
      countdown(that, second);
    }
  }, 1000)
}
使用官方导航栏
app.js
  "tabBar": {
    "backgroundColor": "#fff",
    "selectedColor": "#fe2f5b",
    "list": [
      { 
        "pagePath": "pages/index/index",
        "text": "主页"
      }
     // ,{ 
     //  "pagePath": "pages/log/log",
     //  "text": "记录"
     // }
    ]
  }
跳转页面
log.wxml
//如果Index页面时在官方的导航栏tabBar中,需要跳转首页
错误写法:
 <navigator url='Pages/index/index'>首页</navigator>
正确写法:
<navigator open-type='switchTab' url='Pages/index/index'>首页</navigator>
解释:tabBar中的页面无法直接使用navigator标签进行跳转,需要设置open-type类型
页面设置标题
app.js
App({
  globalData: { 
    NavigationBarTitle: '标题'
  }
})
log.js
var app = getApp();
//写在onLoad中
onLoad: function (options) {
    wx.setNavigationBarTitle({
      title: "xxx-" + app.globalData.NavigationBarTitle//页面标题为路由参数
    });
}
阻止下拉加载事件
   /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
    // wx.showNavigationBarLoading() //在标题栏中显示加载
    wx.hideNavigationBarLoading() //完成停止加载
    wx.stopPullDownRefresh();//停止下拉刷新
  }

结语

总体来说,小程序的开发强度对于js有一定的基础还算简单,更多的还是要学会找问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值