• uniapp小程序之一键使用手机号登录


    目录

    前言

    前提

    postman 第一步

     效果图

    总结

    添加

    后续  补充  (


    前言

    因为要完成微信登录功能,这有两种选择,第一种就是使用微信号,昵称去登录;第二种就是使用手机号登录

    前提

    要使用手机号登录的前提就是首先,你的appid是企业注册的,其次就是,要让管理微信公众平台appid的管理员把你的微信号添加到项目成员

    由于业务的需求,我这边目前只能选择使用 手机号登录,查看官方文档 

    可知要使用 getPhoneNumber  

    但前提是要 获取 code

    我们现在postman里面发送请求,看看结果

    postman 第一步

    网址

    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
    

    获取接口调用凭证 getAccessToken

     appid: 跟  

    AppSecret(小程序密钥)   就不需要给大家介绍了吧

     下面这张图,相信大家看着也会 ,然后点击 send 获取到token


    上面既然能获取到token了,那下面我们就获取手机号 

    网址   

    https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN
    

     手机号  getPhoneNumber

     这里的code的获取就是

    1. <button class="login-btn" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber">一键登录</button>
    2. // 上面定义一个button事件,官网说,获取手机号只能通过定义button事件
    3. // 在methods中定义
    4. onGetPhoneNumber(e) {
    5. if (e.detail.errMsg == "getPhoneNumber:fail user deny") { //用户决绝授权
    6. //拒绝授权后弹出一些提示
    7. } else { //允许授权
    8. console.log(e);
    9. }
    10. }

     e打印出来的结果就是:

     效果图

    总结

    只要使用公司注册,认证好的 appid 以及把自己的微信加入 项目成员,加入成功后吗,还有让管理员开始获取手机的设置,就可以了,就这么简单

    添加

    代码     后续 看 后续补充代码

    1. <button class="login-btn" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber">
    2. 一键登录
    3. </button>
    4. export default {
    5. methods:{
    6. // 手机号
    7. async onGetPhoneNumber(e) {
    8. console.log(e, '打印手机号信息');
    9. if (e.detail.errMsg == "getPhoneNumber:ok") {
    10. this.errMsg = e.detail.errMsg
    11. const {
    12. data: {
    13. obj,
    14. resCode
    15. }
    16. } = await uni.$http.post('/uniapp/member/wechatLogin', {
    17. code: e.detail.code
    18. })
    19. console.log('手机号的token:', resCode, obj.memberToken, '手机号');
    20. // this.updateToken(obj.memberToken) 存token
    21. if ('00100000' !== resCode) return uni.$showMsg()
    22. }
    23. }
    24. }
    25. }

    后续  补充

    完整代码

    js文件   因为后续 支付 需要使用到 code 因此封装了一个方法

    1. function code() {
    2. let codePay = new Promise((resolve, reject) => {
    3. uni.login({
    4. provider: 'weixin',
    5. success: res => {
    6. resolve(res.code)
    7. },
    8. fail: (err) => {
    9. reject(err)
    10. }
    11. })
    12. })
    13. return codePay
    14. }
    15. module.exports = {
    16. code
    17. }
    1. <template>
    2. <view>
    3. <button class="login-btn" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber">
    4. 一键登录
    5. </button>
    6. </view>
    7. </template>
    8. <script>
    9. import {
    10. code
    11. } from '@/common/userInfo.js'
    12. export default {
    13. name: "my-login",
    14. data() {
    15. return {
    16. // code: '',
    17. errMsg: '',
    18. appid: '',
    19. };
    20. },
    21. // async mounted() {
    22. // this.code = await code().then(data => {
    23. // return data
    24. // })
    25. // console.log(this.code, '一进来就获取code');
    26. // },
    27. methods: {
    28. // 手机号
    29. async onGetPhoneNumber(e) {
    30. let accountInfo = uni.getAccountInfoSync();
    31. this.appid = accountInfo.miniProgram.appId; // 小程序 appId
    32. console.log(this.appid);
    33. if (e.detail.errMsg == "getPhoneNumber:ok") {
    34. let code = await code().then(data => {
    35. return data
    36. })
    37. this.errMsg = e.detail.errMsg
    38. const {
    39. data: {
    40. obj,
    41. resCode
    42. }
    43. } = await uni.$http.post('/uniapp/member/wechatLogin', {
    44. code: e.detail.code,
    45. appId: this.appid,
    46. // openIdCode: this.code
    47. openIdCode: code
    48. })
    49. console.log('wechatLogin 一键手机号登录 手机号的token:', resCode);
    50. // this.updateToken(obj.memberToken)
    51. if ('00100000' !== resCode) return uni.$showMsg('登录失败')
    52. }
    53. }
    54. }
    55. }
    56. </script>
    57. <style lang="scss" scoped>
    58. // background-color: #030917;
    59. .login-btn {
    60. position: fixed;
    61. bottom: 10%;
    62. width: 510rpx;
    63. margin: 0 118rpx 0 122rpx;
    64. background-color: #427cb2;
    65. color: #fff;
    66. }
    67. </style>

     注意

    在 mounted中获取 code 有 bug

    若当前用户在登录页 并未点击 登录

    则时间超过10分钟后 code会过期 此时 点击会报 微信授权失败

    因此 就在用户点击同意后 获取code

  • 相关阅读:
    最长连续不重复子序列 C++实现
    数据库数据恢复-SQL SERVER数据库文件损坏的故障表现&数据恢复方案
    看了 4K 经典中视频,我才知道 30 多年前的艺术家有多牛
    软件测试面试(三)
    【2016】【论文笔记】差频可调谐THz技术——
    精准同步时钟系统计时器在工业领域的运用
    如何实现产品外观设计?这些知识你要知道
    【Facade模式】C++设计模式——外观模式(门面模式)
    golang JWT原理介绍
    Web APIs 第02天
  • 原文地址:https://blog.csdn.net/LJM51200/article/details/127588423