主要功能:小程序获取用户的openid,作为用户唯一识别码。
功能说明:之所以要获取用户的openid是因为其具有唯一识别性,用做识别用户的唯一标识。有了唯一标识我们才能知道是谁用了我们的小程序。而微信制定的规矩使得小程序无法直接获得用户的openid,需要通过云开发模式的接口或者我们自己的服务器作为中转,向微信发起请求来获得。
虽然微信希望我们能获得唯一识别码和sessionkey后结合项目生成自定义登录态(比如独立于微信的账号密码用来登录),但我的小程序目前涉及不到这个功能,只是想学习小程序的开发,所以我只需要openid来作为用户的唯一识别凭证。
主要步骤:
先列出官方步骤 如下:
- 前端调用wx.login获得 临时登录凭证code ,并通过request请求发送给我们的开发服务器
- 开发服务器拿着临时code向微信开放接口发送请求,换取用户唯一标识 OpenID 和 会话密钥 session_key
官方教程 :https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
![](https://i-blog.csdnimg.cn/blog_migrate/d4e1428e4ca30eac279096bff55b2439.png)
示例代码:
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而已。所以我的步骤:
- 前端调用login,得到code并通过发起GET请求将code发送给后端
- 后端获得code,向微信发起GET请求,拿openid和session_key
- 给前端返回openid
- 前端拿到openid,并添加一些基本资料(头像,昵称,性别等)存到服务器作为用户数据
![](https://i-blog.csdnimg.cn/blog_migrate/314decd5d4a72bb061e0aa2e8d412dc5.png)
小程序端:写了一个函数,函数名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复制进去就能用。
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
};
}