uni-app微信登录以及如何获取openId和SessionKey

关于如何使用微信登录,获取到openId和SessionKey。自己用于记录使用,直接上代码

1、在微信中代码如下

wxLogin(){
    var _self=this;
     uni.login({
     provider:'weixin',
     success:(res)=>{
        //这样就到微信返回的code,然后再到后台换取openId和session_key
        _self.authLogin(res.code);
     }
    })
},
authLogin(code){
    uni-request({
        url:`${this.baseUrl/api/login/${code}}`,
        method:'GET',
        header:getApp().globalData.header,
        success:(res)=>{
            //这里就返回你自己定义的session,微信不建议使用微信提供的session_key
            //我们可以在后台,将openId和session_key两者数据,存在服务端的session里面
            //在返回自己拼接的sessionKey到微信,用于调用后台接口有个验证,防止接口被滥用。
            //这里存在全局变量里面,我这里存在header里面
            //这里存在header的原因,这里大家要注意,微信小程序是没有cookie,session一说,所以后台设置了session,下次通过SessionKey,也是获取不到的。这里很多人都会遇到这个坑
            //所以这样修改即可,我后端是.net,这样下次请求的时候,在后台就可以获取到session
            //后续的每个请求都要加上header 
            if(res.header["Set-Cookie"]!=null)
            {
               //设置cookie
				getApp().globalData.header["Cookie"]+=res.header["Set-Cookie"];
            }
            getApp().globalData.header["SessionKey"]=res.data.SessionKey;
            
        },
        fail(err=>{
        });
    })
}

2、后台代码如何通过AppId,AppSecret,code获取openid和session_key

        /// <summary>
        /// 获取微信小程序openId和session_key
        /// </summary>
        /// <param name="AppId"></param>
        /// <param name="AppSecret"></param>
        /// <param name="code"></param>
        /// <returns></returns>
        public Dictionary<string, string> GetOpenIdAndSeesion_key(string AppId, string AppSecret, string code)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            string url = $"https://api.weixin.qq.com/sns/jscode2session?appid={AppId}&secret={AppSecret}&js_code={code}&grant_type=authorization_code";
            try
            {
                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
                //请求方式
                myRequest.Method = "GET";
                HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
                Stream stream = myResponse.GetResponseStream();
                StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
                XmlDictionaryReader xmlReader = JsonReaderWriterFactory.CreateJsonReader(stream, XmlDictionaryReaderQuotas.Max);
                xmlReader.Read();
                string xml = xmlReader.ReadOuterXml();
                myResponse.Close();
                stream.Close();
                stream.Dispose();


                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
                XmlElement rootElement = doc.DocumentElement;
                if (rootElement.SelectSingleNode("openid") != null &&
                     rootElement.SelectSingleNode("session_key") != null)
                {
                    string openid = rootElement.SelectSingleNode("openid").InnerText.Trim();
                    string session_key = rootElement.SelectSingleNode("session_key").InnerText.Trim();
                    dic.Add("openid", openid);
                    dic.Add("session_key", session_key);

                    //用户在开放平台的唯一标识符,用户关注了公众号,并且与该微信小程序有关联,才会有
                    if (rootElement.SelectSingleNode("unionid") != null)
                    {
                        dic.Add("unionid", rootElement.SelectSingleNode("unionid").InnerText.Trim());
                    }
                    return dic;
                }
                else
                {
                    //这里找不到一般是报错
                    //过期:<errcode type="number">40163</errcode><errmsg type="string">code been used, hints: [ req_id: zeJfA5yFe-wbsk.a ]</errmsg>
                    //code不正确:<errcode type="number">40029</errcode><errmsg type="string">invalid code, hints: [ req_id: 1eJf8.5ce-BdHZ7 ]</errmsg>
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值