提纲:

滚动穿透

登陆,授权流程

手机号授权流程

保存图片

webview的使用

问题一二针对于,弹窗内容嵌套在蒙层内。

1. 点击弹窗外关闭,

你已经购买过该课程

您已经购买该课程了,请前往听课

去听课

// 已经支付的弹窗

togglePaidModal: function(e) {

this.setData({

hasPaid: !this.data.hasPaid,

})

},

handleTap2: function(e) {

},

复制代码

重点在于小程序事件中,catchtap 会阻止冒泡。详情可以浏览微信小程序事件机制。

2. 解决滚动穿透问题

preventTouchMove: function() {

}

复制代码

滚动穿透问题,最外层modal中,添加catchtouchmove="preventTouchMove"。阻止父级滚动。

3. 登陆, 授权流程

userInfo常见的维护于app.globalData中,或者storage中。本文维护于app.globalData中。

3.1 首先需要弄清楚下面几个东西。

(1)wx.login,调用接口获取登录凭证(code),通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等(前端只需把code传给后端,换取凭证后端来做)。

(2)code,登录凭证。这个直接通过wx.login就可以拿到,不用点击button授权。

(3)openid,用户唯一标识。把code传给后端,后端根据加密算法和微信接口服务换取来的。

(4)wx.checkSession。检查登录态是否过期。通过wx.login接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能失效。反之如果用户一直在使用小程序,则用户登录态一直保持有效。开发者只需要调用wx.checkSession接口检测当前用户登录态是否有效

(5)authSetting['scope.userInfo'],判断用户是否授权过,此授权和以上的code换取openid不同,此授权是指拿到用户头像,city,country,gender,nickName,province等等

(6)open-type="getUserInfo",对于button的设置,只有添加该条属性,才可以弹窗确认授权,获取到用户相关信息。

所以,所谓的登陆,授权其实是分为两部分。登陆:code换取oppenid,作为用户唯一标识,进行以后的业务(通常是放在header中)。授权:通过button获取授权,拿到用户信息,传给后端用来更新,记录用户信息。

3.2 登陆: code换取openid

附上一张小程序官方截图,红色标识,为我们需要注意的。

通过wx.login获取code,在通过code传给后端接口,换取openid等信息,存进app.globalData中。这样就算登陆完成了,下次请求别的业务接口,带上openid就可以了。(建议使用自定义登录态,不直接使用openid)

this.userLoginPromise = new Promise((resolve, reject) => {

let loginSuccess= false

wx.checkSession({

success: () => {

loginSuccess = true

},

complete: () => {

if (loginSuccess && this.globalData.userInfo.openid) {

resolve()

}else {

wx.login({

success: res => {

if (res.code) {

getOpenIdReq(encodeURIComponent(res.code)).then(response => {

this.globalData.userInfo = {

...this.globalData.userInfo,

...response,

}

resolve()

// }

}).catch(e => {

reject(e)

})

}

},

fail: e => {

wx.showToast({

title: "登录出错",

duration: 2000,

icon: 'none',

})

}

})

}

}

})

})

复制代码

3.3 授权:主要目的为了,获取用户头像,性别,城市,等信息,保存在后端或者是需要显示个人头像等情况。

流程:

判断用户是否授权过(wx.getSetting)

授权过可以直接通过wx.getUserInfo拿到信息。

如果没有授权过,需要配合button拿到用户信息。

// 查看用户是否授权过

wx.getSetting({

success: res => {

if (res.authSetting['scope.userInfo']) {

// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框

wx.getUserInfo({

success: res => {

this.setData({

maskModal: false, // 授权过,隐藏授权button

})

}

})

}

}

})

复制代码

如果没有授权,展示授权button,通过wx接口,获取用户信息,并发送请求给后端,更新用户信息成功后,将授权button隐藏。open-type="getUserInfo"

// wxml

// js

bindGetUserInfo: function(e) {

const { encryptedData } = e.detail

if(!encryptedData){

return

}

this.updateUserInfo(e.detail)

this.setData({

maskModal: false,

})

},

// 后端接口更新用户信息

updateUserInfo: function(options = {}) {

const { encryptedData, iv, userInfo } = options

const params = {

...userInfo,

iv,

encryptedData,

}

updateUserinfoReq(params).then(res => {

})

},

复制代码

4. 手机号授权流程

建议后端提供一个,判断用户是否绑定手机号的接口。之后处理起来就比较容易一些。也符合正常流程。

注意点:

把请求到的是否授权手机号表示,维护在app.globalData中,无论在任何组件内部,都可以直接拿到使用。

要在请求登陆接口返回openid以后调用是否授权手机号接口,因为后端需要根据header中的openid来辨识用户。

初始化:

// app.js

userPhonePromise: null,

onLaunch: function() {

this.userPhonePromise = new Promise((resolve, reject) => {

// 放在用户登陆接口之后

this.userLoginPromise.then(_ =>

validateMobileReq()

).then(response => {

this.globalData.phoneAuthorized = !!response

resolve();

if (this.globalData.phoneAuthorized){

console.log('手机已授权')

}else{

console.log('手机未授权')

}

}).catch(e =>{

reject()

})

})

},

// 页面内的使用 class.js

onShow: function (options) {

app.userPhonePromise.then(_ => {

// 本页面用到的变量标识

this.setData({ phoneAuthorized: app.globalData.phoneAuthorized })

})

},

复制代码

当页面中存在,手机授权按钮时,授权后需要更新app.globalData的数据以及当前页面的状态

// button 授权弹窗事件回调

getPhoneNumber: function (e) {

// 是否授权

if (!e.detail.encryptedData) {

return

}

this.updateUserPhone(e.detail)

},

updateUserPhone: function (options = {}) {

const {

encryptedData,

iv

} = options

const params = {

...app.globalData.userInfo,

iv,

encryptedData,

}

// 后端更新用户信息请求

updateUserinfoReq(params).then(res => {

const {

phone,

...others = {}

} = res

app.globalData.userInfo = {

...app.globalData.userInfo,

...others,

phone,

}

if (phone) {

// 全局维护的授权,方便其他页面进入调用

app.globalData.phoneAuthorized = true

// 本页面维护的授权状态标识

this.setData({

phoneAuthorized: true,

})

}

})

},

复制代码

5. 保存图片流程

注意事项:

先查看是否有权限保存图片。(1. 如果没有授权过,会拉起小程序授权弹窗(图一);2. 如果之前拉起过授权弹窗, 给了保存权限,会保存到手机;3. 如果之前拉起过授权弹窗,但是拒绝了权限访问,这次不会拉起系统弹窗,只会返回false值。需要手动拉起微信设置权限(图二))

保存图片入参filePath,图片文件路径,可以是临时文件路径或永久文件路径 (本地路径) ,不支持网络路径。所以后端返回的图片,需要先调用wx.getImageInfo转为临时文件路径

saveWxImg: function (e) {

wx.showLoading({

title: '加载中...',

})

wx.getSetting({

success: (res) => {

if (res.authSetting['scope.writePhotosAlbum']) {

this.saveImg()

} else {

wx.authorize({

scope: 'scope.writePhotosAlbum',

success: () => {

this.saveImg()

},

fail: (err) => {

wx.hideLoading()

this.toggleModal()

}

})

}

}

})

},

saveImg: function () {

wx.getImageInfo({

src: this.data.classTeacherWxUrl,

success(res) {

const {

path,

} = res

wx.saveImageToPhotosAlbum({

filePath: path,

success(res) {

wx.hideLoading()

wx.showToast({

title: '已保存,扫一扫图片添加班主任吧',

duration: 2000,

icon: 'none'

})

},

fail() {

wx.hideLoading()

}

})

},

fail() {

wx.hideLoading()

}

})

},

复制代码

6. 小程序中webview的使用(个人类型的小程序暂不支持使用。)

正常小程序page中,跳转到webview页面,带上将要访问的url即可。

const webviewUrl = `/pages/classWeb/classWeb?path=${url}&originPage=${originPage}&unitId=${trialTeachUnitId}`

wx.navigateTo({

url: webviewUrl,

})

复制代码

webview页面中,显示url

onLoad: function (options) {

const {

path,

} = options

if (path.indexOf('http') < 0) {

options.path = 'https://' + options.path

}

this.setData({

url: decodeURIComponent(options.path)

}

},

复制代码

7. component的使用需要在${page}.json中引入,其他没什么特殊的地方。

// home.json

{

"usingComponents": {

"class-list": "/components/class-list/class-list",

"tab-bar": "/components/tab-bar/tab-bar"

}

}

复制代码

8. 微信提供了wx.getSystemInfo和wx.getSystemInfoSync访问设备信息,区分ios,android。

9. 特殊字体family的使用,

UI给到TTF,WOFF等字体文件后,访问transfonter.org/转换成base64。导出改为font.wxss。

在app.wxss中引入,之后就可以直接使用了。

// app.wxss

@import "./font.wxss"

// font.wxss

@font-face {

font-family: 'DIN Alternate';

src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAEAAAAAAAAAAAkJwgAAAAA1fCHZQAAAADWQ16c) format('woff'),

url('DINAlternate-Bold.ttf') format('truetype');

font-weight: bold;

font-style: normal;

}

复制代码

10. 动态设置当前页面的标题

wx.setNavigationBarTitle({

title: '当前页面'

})

复制代码

未完待续

小程序中使用锚点注意事项

小程序授权信息是保存在微信服务器,微信小程序登陆,授权,手机号授权流程及滚动穿透,保存图片等问题...相关推荐

  1. 微信服务器接口配置程序

    要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后,等待官方审核,审核通过之后,会在后台顶部出现"高级功能"菜单. 使用"高 ...

  2. 视频上传到微信像素渣 微信服务器,微信视频不清晰怎么处理?怎么把视频发到微信朋友圈?...

    Hi商学院最新消息,大家有没有出现微信发小视频或QQ空间短视频,画质模糊问题?微信视频不清晰怎么处理?怎么把视频发到微信朋友圈?我们有的时候会发一些微信视频给微信好友或者是发到微信朋友圈中去,有微信用 ...

  3. 微信小程序获取头像昵称 保存头像到服务器

    微信官方推荐的替代做法: 头像昵称填写 | 微信开放文档 (qq.com) wxml <button class="avatar" open-type="choos ...

  4. 微信的信息会保存在苹果服务器上吗,【每日一技】如何将微信文件保存到 iPhone 里?...

    由于 iOS 系统的封闭性,在 iPhone 本地储存文件一直是一件麻烦事.特别是在微信内收到很多文件之后,分类管理更加不便,如果长时间未操作,文件还可能永久失效. 今天小编图文详解:如何解决 iOS ...

  5. 微信不能存钱美国微信服务器,微信、支付宝为什么突然不能存款了?

    原标题:微信.支付宝为什么突然不能存款了? 话说这几天, 互联网存款产品几近"全军覆没". 蚂蚁集团.百度度小满.京东金融.腾讯理财通.滴滴金融.中国平安旗下陆金所等平台相继齐刷刷 ...

  6. 小升初报名修改密码出现内部服务器错误,小升初报名表填写错了怎么办

    小升初报名表填写错了怎么办 初级中学简称初中.初中是中学阶段的初级阶段,初级中学一般是指九年义务教育的中学,是向高级中学过渡的一个阶段,属于中等教育的范畴.接下来有小编为大家整理出小升初报名表填写错了 ...

  7. 小程序微信头像授权、手机号授权、地理位置授权

    小程序授权 常用的小程序授权有手机号授权.微信头像及昵称授权.地理位置授权.下面就分别说一下具体的实现操作 1.手机号授权. 手机号授权需要用户主动的触发,程序驱动触发是实现不了的.通过button实 ...

  8. 微信第三方平台小程序平台设计

    今天是2023年1月15日,距离2023春节倒计时7天.在此,我分享一下个人对于微信第三方平台小程序的理解以及搭建一个微信小程序及云端服务的一些个人经验,作为交流. 首先,一个第三方平台小程序要定位是 ...

  9. 微信小程序之用canvas给微信头像加小红旗(canvas无法使用网络资源绘画)

    微信小程序之使用canvas给微信头像加小红旗 情境:新中国成立70周年,普天同庆.昨天看到朋友圈中被刷屏的@官方微信 给自己的头像加小红旗.服务器被卡爆,很多朋友说换头像不成功. 任务:打算自己写一 ...

最新文章

  1. linux tree命令 树结构显示目录文件
  2. python能做软件吗-python能够做软件的自动化测试吗?
  3. linux中vim常用命令总结
  4. 2018-2019-1 20165202 《信息安全系统设计基础》第四周学习总结
  5. pythoncharm安装时出错误_python01:pycharm中安装包时所遇到的问题
  6. 关于单元测试的思考--Asp.Net Core单元测试最佳实践
  7. 织梦手机站搜索结果显示为电脑站的搜索结果模板的解决方法
  8. AD16自定义板子大小
  9. 通过IP获取相应所在地的地址
  10. 解决出现“未能加载文件或程序集“System.Net.Http.Formatting, Version=5.2.3.0”的问题
  11. 金税盘显示frm000013_开票软件(金税盘版)2020年4月征期抄报方法/季报方法!
  12. 常用命令之svn命令
  13. 自底向上与自顶向下(递归与动态规划)
  14. 网络工程师面试题总结
  15. Flutter - 循序渐进 Sliver
  16. 当 JS 大猪蹄子遇到 HTML 小姐姐
  17. 技术博客一件发布系统的实验性技术方案Butterfly
  18. sqlite数据库下载安装和初步操作和所遇到的问题near sqlite3:syntax error
  19. 数据结构:若借助栈由输入序列1,2…n得到的输出序列为p1p2…pn(它是输入序列的一个排列),证明在输出序列中不可能出现这样的情形:存在着i<j<k,使pj<pk<pi
  20. 单片机如何控制继电器呢?

热门文章

  1. 关于代码审查的一些探讨和总结
  2. Google的不作恶文化和10大信条
  3. GitHub上最火的Android开源项目
  4. 适合一个人创业比较挣钱的项目
  5. mysql slow query_Mysql 开启 Slow 慢查询
  6. 产品分析——外研随身学
  7. mysql 递减查询_php – MySQL – 自动递减值
  8. 三星存储新品首销情况揭秘
  9. 深度学习样本规则裁剪(图片规则裁剪)
  10. 苹果内购噩梦条款3.1.1,知道这些小细节才不会被拒审