微信小程序授权登录获取用户的openid

news2024/11/28 16:48:32

  • 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系
  • 然而因为小程序中的openid不可以直接使用需要用code(登录凭证)去换取openid
获取openid的思路
  • 获取openid首先需要调用小程序的login方法获取小程序的登录凭证code,然后使用code向微信换取登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)
    我这里是用一个点击事件来触发一个函数

  1. wx.getUserProfile 会获取到你的一些信息 比如昵称,头像,性别

info(){
    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
    wx.getUserProfile({
      desc: '获取用户的信息',//获取用户的信息
      success:(res)=> {//用户成功授权
      console.log("成功",res)

      this.setData({
        userInfo: res.userInfo,
        hasUserInfo: true,
        nickName:res.userInfo.nickName, //获取昵称
        touxian:res.userInfo.avatarUrl,  获取头像url
        sex:res.userInfo.gender  //获取性别
          })
      },
     fail:res=>{
       console.log("失败",res)
     }
  })

},

下图看打印

  1. wx.login 可以获取到你的code值
        wx.login({
          //成功放回
          success:(res)=>{
            console.log(res);
            let code=res.code
          }
        })

下图看打印

通过wx.request 来让code换取openid

这里面需要一段很长的url地址

  https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
  • 这个地址可以在开发文档=>服务器=>登录中 找到
    不要以为你把这个路径cv上就好了 这段连接中有三处地方需要改动
    (每个人的id都不一样所以你要自己去作修改 下面有修改处的位置)

        wx.request({
      /*
          url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + APPID + '&secret=' + SECRET + '&js_code=' 
          + res.code + '&grant_type=authorization_code',
*/
          url: 'https://api.weixin.qq.com/sns/jscode2session?appid=wx8099f643beb716ff&secret=4e6df35403708737c78ef7cffd525c2e&js_code=' + res.code + '&grant_type=authorization_code',
          success:(res)=>{
            console.log(res);
            var obj = {};
              obj.openid = res.data.openid;
              obj.expires_in = Date.now() + res.data.expires_in;
            //存储openid
              wx.setStorageSync('user', obj);
            //获取到你的openid
            console.log(obj.openid);
          }
        })

需要修改的地方

注意是没处地方都是等号之后&符号之前的 (这里一定不能出错)

打印你就会看到你的openid的值 如下

  info(){
    wx.getUserInfo({
      //成功后会返回
      success:(res)=>{
        console.log(res);
        // 把你的用户信息存到一个变量中方便下面使用
        let userInfo= res.userInfo
        //获取openId(需要code来换取)这是用户的唯一标识符
        // 获取code值
        wx.login({
          //成功放回
          success:(res)=>{
            console.log(res);
            let code=res.code
            // 通过code换取openId
            wx.request({
              url: `https://api.weixin.qq.com/sns/jscode2session?appid=wx16ccbe7d04209a11&secret=1f9465bdebe244b5ad15635e8a655832&js_code=${code}&grant_type=authorization_code`,
              success:(res)=>{
                console.log(res);
                userInfo.openid=res.data.openid
                console.log(userInfo.openid);
              }
            })
          }
        })

      }
    })
  },

总结:

  • openid是用户的唯一标识,它可以快速的建立小程序内的用户体系
  • 因为openid是一个敏感信息所有他不会直接给你,需要你用登录凭证(code)去换取openid

// 登录
    wx.login({
      success: function (r) {
        var code = r.code;//登录凭证
        if (code) {

          //2、调用获取用户信息接口
          wx.getUserInfo({
            success: function (res) {
              console.log({ encryptedData: res.encryptedData, iv: res.iv, code: code })
              

             //3.解密用户信息 获取unionId
              //...


              //3.请求自己的服务器,解密用户信息 获取unionId等加密信息
              wx.request({
                url: '',//自己的服务接口地址
                method: 'post',
                header: {
                  'content-type': 'application/x-www-form-urlencoded'
                },
                data: { encryptedData: res.encryptedData, iv: res.iv, code: code },
                success: function (data) {
 
  //4.解密成功后 获取自己服务器返回的结果
                  if (data.data.status == 1) {
                    var userInfo_ = data.data.userInfo;
                    console.log(userInfo_)
                  } else {
                    console.log('解密失败')
                  }
 
                },
                fail: function () {
                  console.log('系统错误')
                }
              })

            },
            fail: function () {
              console.log('获取用户信息失败')
            }
          })

        } else {
          console.log('获取用户登录态失败!' + r.errMsg)
        }
      },
      fail: function () {
        callback(false)
      }
    })

PHP实现微信小程序授权登录(示例)

    public function login()
    {
        //接收参数
        $code = input('code'); //code码
        $nickName = input('nickname'); //微信昵称
        $avatarUrl = input('avatar'); //微信头像
        //验证参数
        if (empty($code) || empty($nickName) || empty($avatarUrl)){
            return json(['status'=>500,'msg'=>'参数不能为空']);
        }
        //自己到微信公众平台获取
        $appid = ' ';
        $secret = ' ';
        //获取openid
        $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";
        $userInfo = json_decode(file_get_contents($url),true);
        if (empty($userInfo['openid'])) $this->error('登陆失败,'.$userInfo['errmsg'],'',$userInfo['errcode']); 
        //存储数据
        $userInfo['nickname'] = $nickName;
        $userInfo['avatar'] = $avatarUrl;
        $userInfo['createtime'] = time();
        $userInfo['updatetime'] = time();
        //根据获取的openid 来查看数据库 有的话更新 session_key 没有的话添加
        $model = new Member();
        $data = $model->where('openid',$userInfo['openid'])->find();
        if ($data){
            //存在数据 更新
            $model->where('openid',$userInfo['openid'])->update(['session_key'=>$userInfo['session_key']]);
            //获取用户id
            $userInfo['user_id'] = $data['id'];
            $token =  signToken($userInfo['user_id']);
        }else{
            //不存在将用户信息添加入库 获取自增的id
            $token =  signToken($userInfo['user_id']);
            $userInfo['user_id'] = $model->insertGetId($userInfo);
        }
        $this->success('登陆成功',['token'=>$token],'200');
    }

关于小程序中如何获取openid_小程序 本地开发获取openid 10007_Bruk.Liu的博客-CSDN博客

globalData:{
    appid:'wxa1111111111111',
    secret:'3acbe5r8s4s5d7s895'
  },
  login(){
    var that = this;
    wx.login({
      success: function (res) {
        if (res.code) {
          wx.getUserInfo({
            success: function (res) {
              var objz = {};
              objz.avatarUrl = res.userInfo.avatarUrl;
              objz.nickName = res.userInfo.nickName;
              //console.log(objz);
              wx.setStorageSync('userInfo', objz);//存储userInfo
            }
          });
          var d = that.globalData;//这里存储了appid、secret、token串  
          var l = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + d.appid + '&secret=' + d.secret + '&js_code=' + res.code + '&grant_type=authorization_code';
          wx.request({
            url: l,
            data: {},
            method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT  
            // header: {}, // 设置请求的 header  
            success: function (res) {
              console.log(res)
              var obj = {};
              obj.openid = res.data.openid;
              obj.expires_in = Date.now() + res.data.expires_in;
            //存储openid
              wx.setStorageSync('user', obj); 
            }
          });
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    });
  },

【精选】获取微信小程序授权信息并保存到数据库中(包含openId和session_key,java后台)_微信小程序 sesison_key 如何存储-CSDN博客

wx.login({
      success: function(res) {
        if (res.code) {  //wx.login获取code。
          console.log(res.code);
          //发起网络请求
          wx.getUserInfo({
            success:function(res_user){
              console.log(res_user.userInfo)
              wx.request({
                url: 'http://xxx.xxx.xxx.xxx:服务器端口/自定义名字',//填写自己的url
                method:'POST',
                //向后端发送的数据
                data: {
                  code: res.code ,   //将code发送到后台服务器。
                  imgurl: res_user.userInfo.avatarUrl,//获取头像url
                  nickname:res_user.userInfo.nickName,//获取昵称
                  sex:res_user.userInfo.gender,//获取性别
                },
                header: { 
                       "Content-Type": "application/x-www-form-urlencoded" //POST方式是这个
              },
              })
            }
          })
          
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1172437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

佳易王配件进出库开单打印进销存管理系统软件下载

用版配件进出库开单打印系统,可以有效的管理:供货商信息,客户信息,进货入库打印,销售出库打印,进货明细或汇总统计查询,销售出库明细或汇总统计查询,库存查询,客户往来账…

web:[CISCN2019 华北赛区 Day2 Web1]Hack World

题目 打开页面,页面提示为,想要的都在‘flag’表和‘flag’列里 随便输入一个数字看回显(1 2 3),发现回显不一样 输入1 输入2 输入3 输入4 输入单引号,显示bool(false) 尝试一下万能…

Leetcode 73 矩阵置0

class Solution {//1.用矩阵的第一行和第一列来标记该行或该列是否应该为0,但是这样的话忽视了第一行或第一列为0的情况//2.用标记row0和column0来标记第一行或第一列是否该为0public void setZeroes(int[][] matrix) {int n matrix.length;int m matrix[0].length;boolean r…

华为升腾C92安装windows NAS

华为升腾C92安装windows NAS NAS(Network Attached Storage:网络附属存储),我们之前所了解的群晖,也仅仅是NAS当中的一个品牌运营而已。 这次,我决定在C92上面试着安装Windows NAS。虽然群晖NAS是基于Linu…

Tomcat10 简单地enable Https

通常来讲, 建站后要启用https 有下面3个步骤 1.购买域名 2.绑定域名和 服务器的外部IP地址 3.为这域名购买SSL 证书 (还有其密码) 4.在Tomcat上启用https 和安装这个证书 但是其实没有域名也可以在tomcat 中enable https的, 至于…

【Linux】多路IO复用技术③——epoll详解如何使用epoll模型实现简易的一对多服务器(附图解与代码实现)

在正式阅读本篇博客之前,建议大家先按顺序把下面这两篇博客看一下,否则直接来看这篇博客的话估计很难搞懂 多路IO复用技术①——select详解&如何使用select模型在本地主机实现简易的一对多服务器http://t.csdnimg.cn/BiBib多路IO复用技术②——poll…

2.10 CSS BFC

1.简介 BFC是Block Formatting Context(块级格式上下文),可以理解成元素的一个“特异功能”。该“特异功能”,在默认的情况下处于关闭状态;当元素满足了某些条件后,该"特异功能被激活。所谓激活"特异功能”,专业点说就…

Java线程的基本概念和五种状态

1. 线程 1.1 创建线程 创建线程通常有以下三种方式: 实现 Runnable 接口,并重写其 run 方法: public class J1_Method01 {public static void main(String[] args) {System.out.println("Main线程的ID为:" Thread.curr…

shell综合项目

主菜单 http和Nginx分别的install的菜单&#xff0c;安装过程通过重定向到/dev/null达到看不见的效果 输入非整数或者大于4的数字都会提示错误 代码如下: [rootserver ~]# vim install_menu.sh #!/bin/bash function menu() { cat << EOF …

GraphQL入门与开源的GraphQL引擎Hasura体验

背景 Hasura 是一个开源的 GraphQL 引擎&#xff0c;它可以帮助开发人员快速构建和部署现代应用程序的后端。它提供了一个自动化的 GraphQL API &#xff0c;可以直接连接到现有的数据库&#xff0c;并提供实时数据推送和订阅功能。 Hasura 团队总部位于印度。 下载安装 脚本…

产品经理入门学习(三):产品解决方案

参考引用 黑马-产品经理入门基础课程 1. 需求分析 1.1 需求分析的目的 1.2 需求分析的方法 案例分析 福特公司的创始人亨利福特说&#xff1a;如果我当年去问顾客他们想要什么&#xff0c;他们肯定会告诉我&#xff1a;一匹更快的马 1.3 需求分析的实际应用 人性七宗罪&#…

计网note

其他 未分类文档 CDMA是码分多路复用技术 和CMSA不是一个东西 UPD是只确保发送 但是接收端收到之后(使用检验和校验 除了检验的部分相加 对比检验和是否相等。如果不相同就丢弃。 复用和分用是发生在上层和下层的问题。通过比如时分多路复用 频分多路复用等。TCP IP 应用层的…

css 图片好玩的一个属性,添加滤镜

鼠标经过效果对比&#xff1a; 上图是改变了图片的饱和度&#xff0c;代码如下&#xff1a; .img-box .v-image:hover {filter: saturate(1.75); }其他滤镜说明如下图&#xff1a;

2023全新小程序广告流量主奖励发放系统源码 流量变现系统 带安装教程

2023全新小程序广告流量主奖励发放系统源码 流量变现系统 分享软件&#xff0c;吃瓜视频&#xff0c;或其他资源内容&#xff0c;通过用户付费买会员来变现&#xff0c;用户需要付费&#xff0c;有些人喜欢白嫖&#xff0c;所以会流失一部分用户&#xff0c;所以就写了这个系统…

46基于matlab的模拟退火算法(SA)优化车辆路径问题(VRP)

基于matlab的模拟退火算法&#xff08;SA&#xff09;优化车辆路径问题&#xff08;VRP&#xff09;&#xff0c;在位置已知的条件下&#xff0c;确定车辆到各个指定位置的行程路线图&#xff0c;使得路径最短&#xff0c;运输成本最低。一个位置由一台车服务&#xff0c;且始于…

内存池设计实现

1.设计原理 1.内存池实际就是预先分配不同大小的内存块, 然如果需要调用的时候, 直接把这个块的指针返回. 图中, 就是内存池划分. 2.通过一个链表, 将这些分配的内存块串联起来, 每一块最头部都记录这这个块的信息 3.分配的时候, 会遍历一遍链表, 找到is_used未被置1, pool…

【C语言进阶】之动态内存管理笔试题及柔性数组

【C语言进阶】之动态内存管理笔试题 1.动态内存管理笔试题汇总1.1第一道题1.2第二道题1.3第三道题1.4第四道题 2.C/C内存管理3.柔性数组3.1什么是柔性数组3.2柔性数组的使用3.2柔性数组的优点 &#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f680; 欢迎关注&#xff1a…

Kubernetes Dashboard 用户名密码方式登录

Author&#xff1a;rab 前言 为了 K8s 集群安全&#xff0c;默认情况下 Dashboard 以 Token 的形式登录的&#xff0c;那如果我们想以用户名/密码的方式登录该怎么操作呢&#xff1f;其实只需要我们创建用户并进行 ClusterRoleBinding 绑定即可&#xff0c;接下来是具体的操作…

Cygwin一个在 Windows 操作系统上提供类似于Unix、Linux 环境的兼容层项目

一、简介 Cygwin 是一个在 Windows 操作系统上提供类似于 Unix/Linux 环境的兼容层的开源项目。它为 Windows 用户提供了一种在 Windows 平台上运行类 Unix 程序的方式。 Cygwin 提供了一组工具和库&#xff0c;包括一个动态链接库&#xff08;cygwin1.dll&#xff09;和一个用…

图解系列--防火墙

05.01 防火墙是怎样的网络硬件 构建安全网络体系而需要遵循的 CIA 基本理念。CIA 是机密性 (Confidentiality) 、 完整性(Integrity) 、 可用性(Availability)。 防火墙硬件作为防范装置能够同时实现CIA 中3个条目的相应对策。在20世纪90年代中期&#xff0c;普通企业一般都…