关于如何使用微信登录,获取到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;
}
}