小程序开发学习记录-获取用户openid

主要功能:小程序获取用户的openid,作为用户唯一识别码。

功能说明:之所以要获取用户的openid是因为其具有唯一识别性,用做识别用户的唯一标识。有了唯一标识我们才能知道是谁用了我们的小程序。而微信制定的规矩使得小程序无法直接获得用户的openid,需要通过云开发模式的接口或者我们自己的服务器作为中转,向微信发起请求来获得。  

虽然微信希望我们能获得唯一识别码和sessionkey后结合项目生成自定义登录态(比如独立于微信的账号密码用来登录),但我的小程序目前涉及不到这个功能,只是想学习小程序的开发,所以我只需要openid来作为用户的唯一识别凭证。

主要步骤:

先列出官方步骤     如下:

  1. 前端调用wx.login获得 临时登录凭证code ,并通过request请求发送给我们的开发服务器
  2. 开发服务器拿着临时code向微信开放接口发送请求,换取用户唯一标识 OpenID 和 会话密钥 session_key

 官方教程 :https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

                                    

官方的登录流程时序图

示例代码:

wx.login({              //小程序调用login获得临时登陆凭证code
  success (res) {
    if (res.code) {
      //发起网络请求
      wx.request({
        url: 'https://test.com/onLogin', //我们后端的接口地址
        data: {
          code: res.code        //将code作为参数传入后端
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})

 

 

但是我不需要这么多步骤,我只是想要一个openid而已。所以我的步骤:

  1. 前端调用login,得到code并通过发起GET请求将code发送给后端
  2. 后端获得code,向微信发起GET请求,拿openid和session_key
  3. 给前端返回openid
  4. 前端拿到openid,并添加一些基本资料(头像,昵称,性别等)存到服务器作为用户数据

 

只需要openid的时序图

 

小程序端:写了一个函数,函数名getopenid。我是写在util里的,需要用到promise处理异步通信,因为发起请求后,success回调函数是异步的,异步意味着获取的时间会随网络或者其他原因波动。这会导致我在另一个页面调用这个getopenid函数获取openid后,不知道什么时候才可以读取到值。所以用peomise来避免这种情况,一直等待读取success回调后再返回,直接调用一次getopenid获取openid,一步到位。

//参数说明:
//url:后端接口
//appid:开发者的appid
//secret:开发者secret
const getopenid= function(url,appid,secret) {
  var promise = new Promise(function(resolve, reject) {  //这里用到promise是为了避免异步通信
    const app = getApp()
    wx.login({
      success: function(res) {
        if (res.code) {
          //像后端发起网络请求
          wx.request({
            url: url,//请求url
            data: {
              code: res.code,//login成功后获得
              appid:appid,//小程序开发id
              secret:secret,//小程序开发密钥
            },
            method: 'GET',
            success:function(res) {
              console.log("登陆完成",res),
              app.globalData.openid= JSON.parse(res.data.data).openid,//
              console.log("用户openid为:",app.globalData.openid)
              resolve(app.globalData.openid);//异步完成且返回openid
            },
            fail:function (res) {
              reject("登录失败,请检查服务器");
            }
          })
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    });
  });
  return promise;
}

 这里是在另一个页面的调用getopenid的示例:

var promise = util.getopenid(newurl,app.globalData.appid,app.globalData.secret)  //利用promise对象处理异步登录。获取用户openid

    promise.then( function(openid) {
//promise的用法,等待异步进程结束。 
//promise.then在其状态发生改变后才会执行。
//默认为等待状态,在util.getopenid函数内设置为success回调函数执行后改变为成功状态,并返回openid值
      that.setData({
        openid:openid
      })
    }, function ( error ) {

    } );

 

 

 后端:后端我用的框架是ASP.NET.Core,语言为C#,平台为VS2019。后端新建一个Controler复制进去就能用。

 

微信请求地址:https://api.weixin.qq.com/sns/jscode2sessionappid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

APPID  SECRET都是已经有的,JSCODE是小程序调用wx.login得到的。

using System.Net;
using Newtonsoft.Json;
using System.IO;

        /*获取小程序openid*/
        public string Getopenid(string code,string appid,string secret)
        {
            string url = "https://api.weixin.qq.com/sns/jscode2session?appid="+ appid +"&secret="+secret+"&js_code="+code+"&grant_type=authorization_code";
            return BaseGetString(url);
        }


        public  string BaseGetString(string src)
        {
            var obj = BaseGetObject(src);
            Formatting microsoftDataFormatSettings = default(Formatting);
            return JsonConvert.SerializeObject(obj, microsoftDataFormatSettings);
        }


        public static dynamic BaseGetObject(string src)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(src);
            request.Method = "GET";
            request.ContentType = "text/html;charset=utf-8";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, System.Text.Encoding.UTF8);
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();
            return new
            {
                data = retString,
                Success = true
            };
        }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值