创建 settle 分支

运行如下的命令,基于 master 分支在本地创建 settle 子分支,用来开发登录与支付相关的功能:

git checkout -b settle

点击结算按钮进行条件判断

说明:用户点击了结算按钮之后,需要先后判断是否勾选了要结算的商品是否选择了收货地址是否登录

  1. 在 my-settle 组件中,为结算按钮绑定点击事件处理函数:

说明:用户点击了结算按钮之后,需要先后判断是否勾选了要结算的商品是否选择了收货地址是否登录

在 my-settle 组件中,为结算按钮绑定点击事件处理函数:

// 点击了结算按钮
settlement() {// 1. 先判断是否勾选了要结算的商品if (!this.checkedCount) return uni.$showMsg('请选择要结算的商品!')// 2. 再判断用户是否选择了收货地址if (!this.addstr) return uni.$showMsg('请选择收货地址!')// 3. 最后判断用户是否登录了if (!this.token) return uni.$showMsg('请先登录!')
}

在 my-settle 组件中,使用 mapGetters 辅助函数,从 m_user 模块中将 addstr 映射到当前组件中使用:

export default {computed: {...mapGetters('m_cart', ['total', 'checkedCount', 'checkedGoodsAmount']),// addstr 是详细的收货地址...mapGetters('m_user', ['addstr']),isFullCheck() {return this.total === this.checkedCount},},
}

在 store/user.js 模块的 state 节点中,声明 token 字符串:

export default {// 开启命名空间namespaced: true,// state 数据state: () => ({// 收货地址address: JSON.parse(uni.getStorageSync('address') || '{}'),// 登录成功之后的 token 字符串token: '',}),// 省略其它代码
}

在 my-settle 组件中,使用 mapState 辅助函数,从 m_user 模块中将 token 映射到当前组件中使用:

// 按需从 vuex 中导入 mapState 辅助函数
import { mapGetters, mapMutations, mapState } from 'vuex'export default {computed: {...mapGetters('m_cart', ['total', 'checkedCount', 'checkedGoodsAmount']),...mapGetters('m_user', ['addstr']),// token 是用户登录成功之后的 token 字符串...mapState('m_user', ['token']),isFullCheck() {return this.total === this.checkedCount},},
}

登录

定义 my 页面的编译模式

点击 微信开发者工具 工具栏上的编译模式下拉菜单,选择 添加编译模式

勾选启动页面的路径之后,点击确定按钮:

实现登录和用户信息组件的按需展示

在 components 目录中新建登录组件

在 components 目录中新建用户信息组件

在 my.vue 页面中,通过 mapState 辅助函数,导入需要的 token 字符串:

import badgeMix from '@/mixins/tabbar-badge.js'
// 1. 从 vuex 中按需导入 mapState 辅助函数
import { mapState } from 'vuex'export default {mixins: [badgeMix],computed: {// 2. 从 m_user 模块中导入需要的 token 字符串...mapState('m_user', ['token']),},data() {return {}},
}

在 my.vue 页面中,实现登录组件用户信息组件的按需展示:

<template><view><!-- 用户未登录时,显示登录组件 --><my-login v-if="!token"></my-login><!-- 用户登录后,显示用户信息组件 --><my-userinfo v-else></my-userinfo></view>
</template>

 实现登录组件的基本布局

为 my-login 组件定义如下的 UI 结构:

<template><view class="login-container"><!-- 提示登录的图标 --><uni-icons type="contact-filled" size="100" color="#AFAFAF"></uni-icons><!-- 登录按钮 --><button type="primary" class="btn-login">一键登录</button><!-- 登录提示 --><view class="tips-text">登录后尽享更多权益</view></view>
</template>

美化登录组件的样式:

.login-container {// 登录盒子的样式height: 750rpx;display: flex;flex-direction: column;align-items: center;justify-content: center;background-color: #f8f8f8;position: relative;overflow: hidden;// 绘制登录盒子底部的半椭圆造型&::after {content: ' ';display: block;position: absolute;width: 100%;height: 40px;left: 0;bottom: 0;background-color: white;border-radius: 100%;transform: translateY(50%);}// 登录按钮的样式.btn-login {width: 90%;border-radius: 100px;margin: 15px 0;background-color: #c00000;}// 按钮下方提示消息的样式.tips-text {font-size: 12px;color: gray;}
}

 点击登录按钮获取微信用户的基本信息

需求描述:需要获取微信用户的头像昵称等基本信息。

  1. 为登录的 button 按钮绑定 open-type="getUserInfo" 属性,表示点击按钮时,希望获取用户的基本信息:

<!-- 登录按钮 -->
<!-- 可以从 @getuserinfo 事件处理函数的形参中,获取到用户的基本信息 -->
<button type="primary" class="btn-login" open-type="getUserInfo" @getuserinfo="getUserInfo">一键登录</button>

 

在 methods 节点中声明 getUserInfo 事件处理函数如下:

methods: {// 获取微信用户的基本信息getUserInfo(e) {// 判断是否获取用户信息成功if (e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')// 获取用户信息成功, e.detail.userInfo 就是用户的基本信息console.log(e.detail.userInfo)}
}

没有弹出授权信息解决方法

第一步:先在微信开发者工具把基础库调到2.27.0以下(我选的是2.26.2)

第二步:

<button type="primary" class="btn-login" @click="getUserProfile">一键登录</button>

由于微信授权接口调整wx.getUserInfo() 获取用户授权的方法在开发阶段获取的都是匿名队对象
官方文档:
修改的参考:小程序登录、用户信息相关接口调整说明 | 微信开放社区 (qq.com)
修改如下:[拆弹时刻]4月13日前更新wx.getUserInfo和getUserProfile授权获取问题的解决方案 | 微信开放社区 (qq.com)

第三步:

<button type="primary" class="btn-login" @click="getUserProfile">一键登录</button>

// 获取微信用户的基本信息

getUserProfile(){
        uni.getUserProfile({
          desc: '你的授权信息',
          success: (res) => {
          // 将信息存到 vuex 中
          this.updateUserInfo(res.userInfo)
          this.getToken(res)
          },
          fail: (res) => {
          return uni.$showMsg('您取消了登录授权')
          }
        })
      }

将用户的基本信息存储到 vuex 

在 store/user.js 模块的 state 节点中,声明 userinfo 的信息对象如下:

// state 数据
state: () => ({// 收货地址// address: {}address: JSON.parse(uni.getStorageSync('address') || '{}'),// 登录成功之后的 token 字符串token: '',// 用户的基本信息userinfo: JSON.parse(uni.getStorageSync('userinfo') || '{}')
}),

在 store/user.js 模块的 mutations 节点中,声明如下的两个方法:

// 方法
mutations: {// 省略其它代码...// 更新用户的基本信息updateUserInfo(state, userinfo) {state.userinfo = userinfo// 通过 this.commit() 方法,调用 m_user 模块下的 saveUserInfoToStorage 方法,将 userinfo 对象持久化存储到本地this.commit('m_user/saveUserInfoToStorage')},// 将 userinfo 持久化存储到本地saveUserInfoToStorage(state) {uni.setStorageSync('userinfo', JSON.stringify(state.userinfo))}
}

使用 mapMutations 辅助函数,将需要的方法映射到 my-login 组件中使用:

// 1. 按需导入 mapMutations 辅助函数
import { mapMutations } from 'vuex'export default {data() {return {}},methods: {// 2. 调用 mapMutations 辅助方法,把 m_user 模块中的 updateUserInfo 映射到当前组件中使用...mapMutations('m_user', ['updateUserInfo']),// 获取微信用户的基本信息getUserInfo(e) {// 判断是否获取用户信息成功if (e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')// 获取用户信息成功, e.detail.userInfo 就是用户的基本信息// console.log(e.detail.userInfo)// 3. 将用户的基本信息存储到 vuex 中this.updateUserInfo(e.detail.userInfo)},},
}

 登录获取 Token 字符串 

需求说明:当获取到了微信用户的基本信息之后,还需要进一步调用登录相关的接口,从而换取登录成功之后的 Token 字符串

  1. 在 getUserInfo 方法中,预调用 this.getToken() 方法,同时把获取到的用户信息传递进去:

// 获取微信用户的基本信息
getUserInfo(e) {// 判断是否获取用户信息成功if (e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')// 将用户的基本信息存储到 vuex 中this.updateUserInfo(e.detail.userInfo)// 获取登录成功后的 Token 字符串this.getToken(e.detail)
}

在 methods 中定义 getToken 方法,调用登录相关的 API,实现登录的功能:

// 调用登录接口,换取永久的 token
async getToken(info) {// 调用微信登录接口const [err, res] = await uni.login().catch(err => err)// 判断是否 uni.login() 调用失败if (err || res.errMsg !== 'login:ok') return uni.$showError('登录失败!')// 准备参数对象const query = {code: res.code,encryptedData: info.encryptedData,iv: info.iv,rawData: info.rawData,signature: info.signature}// 换取 tokenconst { data: loginResult } = await uni.$http.post('/api/public/v1/users/wxlogin', query)if (loginResult.meta.status !== 200) return uni.$showMsg('登录失败!')uni.$showMsg('登录成功')
}

将 Token 存储到 vuex

在 store/user.js 模块的 mutations 节点中,声明如下的两个方法:

mutations: {// 省略其它代码...// 更新 token 字符串updateToken(state, token) {state.token = token// 通过 this.commit() 方法,调用 m_user 模块下的 saveTokenToStorage 方法,将 token 字符串持久化存储到本地this.commit('m_user/saveTokenToStorage')},// 将 token 字符串持久化存储到本地saveTokenToStorage(state) {uni.setStorageSync('token', state.token)}
}

这里需要直接把token值写死 

修改 store/user.js 模块的 state 节点如下:

// state 数据
state: () => ({// 收货地址address: JSON.parse(uni.getStorageSync('address') || '{}'),// 登录成功之后的 token 字符串token: uni.getStorageSync('token') || '',// 用户的基本信息userinfo: JSON.parse(uni.getStorageSync('userinfo') || '{}')
}),

在 my-login 组件中,把 vuex 中的 updateToken 方法映射到当前组件中使用:

methods: {// 1. 使用 mapMutations 辅助方法,把 m_user 模块中的 updateToken 方法映射到当前组件中使用...mapMutations('m_user', ['updateUserInfo', 'updateToken'])// 省略其它代码...// 调用登录接口,换取永久的 tokenasync getToken(info) {// 调用微信登录接口const [err, res] = await uni.login().catch(err => err)// 判断是否 uni.login() 调用失败if (err || res.errMsg !== 'login:ok') return uni.$showError('登录失败!')// 准备参数对象const query = {code: res.code,encryptedData: info.encryptedData,iv: info.iv,rawData: info.rawData,signature: info.signature}// 换取 tokenconst { data: loginResult } = await uni.$http.post('/api/public/v1/users/wxlogin', query)if (loginResult.meta.status !== 200) return uni.$showMsg('登录失败!')// 2. 更新 vuex 中的 tokenthis.updateToken(loginResult.message.token)}
}

这个黑马login接口不能用了,我直接写死token,跳转到登录界面

uni-app:登录与支付--登录相关推荐

  1. Android绕过微信包名限制对接微信登录和支付

    Android绕过微信包名限制对接微信登录和支付 前言 最终效果 原理 代码 通过 APT 生成 WXEntryActivity 文件 对接微信SDK End 前言 Android对接微信登录和支付几 ...

  2. 面试题——登录、支付功能测试点总结

    登录界面功能测试点 1)空白 用户名和密码均为空/用户名填写,密码为空/用户名为空,密码填写 2)错误校验 输入错误的用户名和密码/用户名错误密码正确/用户名正确密码错误 3)大小写区分(如:用户名和 ...

  3. springboot+uniapp授权登录+jsapi支付

    SpringBoot+uniapp+jsapi微信支付,找了了好久资料,自己记录一下 1. 申请小程序并认证 1) 获取AppID和AppSecret 2) 配置服务器域名 3) 关联商户号 2.申请 ...

  4. APP的注册和登录功能设计

    一.为什么需要注册和登录? 是否需要注册和登录的关键取决于产品形态. 如果用户注册登录对于用户需求.产品功能.商业模式本身带不来任何价值的话,就没必要设计这样的功能.比如一些实用工具类的产品:计算器. ...

  5. OC 技术 (不需要UniversalLink)第三方微信(登录,分享,支付)详解(手动集成)(视频教学)

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  6. Android项目中集成华为账号登录、支付

    最近项目中集成了华为账号登录与支付的功能,把踩过的坑和过程记录下来. 先看下支付效果图: 支付价格0.01请忽略,因为这是为了测试用的. 刚开始接到这个项目的时候我很奇怪,为什么要集成华为支付呢,原有 ...

  7. uni-app:登录与支付-- 微信支付

    微信支付 在请求头中添加 Token 身份认证的字段 原因说明:只有在登录之后才允许调用支付相关的接口,所以必须为有权限的接口添加身份认证的请求头字段 打开项目根目录下的 main.js,改造 $ht ...

  8. 在Android App中集成Google登录

    技术文章 来源:码农网 发布:2016-09-19 浏览:194 摘要:今天,几乎所有的web和移动app都自带谷歌和Facebook登录,这对app开发者和用户来说是一个非常有用的功能,因为几乎每个 ...

  9. node 微信红包 证书出错,请登录微信支付商户平台下载证书

    按照官方文档写的代码,测试给自己发红包时,提示证书出错,请登录微信支付商户平台下载证书. 我是用的superagent库,错误前的核心代码是: const url = 'https://api.mch ...

最新文章

  1. 电容触摸屏GT911、GT928、GT9147的使用
  2. 算法学习之路|完美数列
  3. python post提交数据
  4. JS 关闭window.open的窗体,并刷新父页面
  5. Spring容器装饰者模式应用之实现业务类与服务类自由组合的解决方式
  6. mybatis教程--实现增删改查的入门教程
  7. 【我的物联网成长记13】物联网卡能否携号转网?
  8. Java高级编程之URL处理
  9. 微信群裂变不起来怎么办?
  10. 【_ 記 】SQL语句实现三目表达式
  11. FilterSecurityInterceptor详解
  12. linux考试不及格反思100字,考试没考好的反思总结(精选10篇)
  13. Lucene.Net的简单练习
  14. 如何深入学习 Android Framework
  15. uniapp (H5、小程序、app)地图导航
  16. 设计一个猜拳游戏,完成人机猜拳互动游戏的开发。
  17. 读书笔记 | 牧羊少年奇幻之旅
  18. 海思 Hi3559V200 WIFI STA Mode 开发配置
  19. 【秒懂音视频开发】07_重识音频
  20. 1、HTML超文本标记语言

热门文章

  1. 【CMD】删除文件或文件夹
  2. JAVA关键字 transient 学习总结
  3. firefox界面英文換中文
  4. 数据中心小母线系统的优势
  5. 架构师进阶之八一些问题
  6. detour寻路过程解析
  7. Hive 临时修改非严格模式
  8. 存量混战 一加如何打天下?
  9. vue3项目实战之在线客服-① 创建项目
  10. 【产品细节一】指纹解锁