当前位置 主页 > 网站技术 > 代码类 >

    .Net之微信小程序获取用户UnionID的实现(3)

    栏目:代码类 时间:2019-09-11 14:31

    优点:无需用户授权。

    前提:用户需要关注该微信公众号。

    小程序端调用接口wx.login获取code凭证,在通过请求auth.code2Session接口获取用户信息(UnionID,openid,session_key会话密钥)两种方式:

    1.直接通过wx.login请求到code凭证后,在请求该地址获取用户信息:

    GET:https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

    详细说明请看微信官方文档(代码略):https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

    2.通过请求wx.login获取code凭证,在向.net webapi后端请求code2Session接口:

    原因:因为我们需要对获取的用户信息做相关业务逻辑处理。

    微信小程序端代码:

    复制代码 代码如下:/***封装用户promise登录,通过code凭证获取用户信息(UnionID,openid,session_key会话密钥)*/userLogin: function() {var that = this;//定义promise方法return new Promise(function(resolve, reject) {//调用登录接口wx.login({success: function(res) {if (res.code) {console.log("用户登录授权code为:" + res.code);//调用wx.request请求传递code凭证换取用户openid,并获取后台用户信息wx.request({url: 'https://www.xxxx.xxx.api/User_oAuth/GetUserInfo',//后台请求用户信息方法data: {code: res.code //code凭证},header: {'content-type':'application/json' // 默认值},success(res) {console.log(res.data)if (res.data.errcode == 0) {//存入session缓存中console.log(res.data.openid);//微信用户唯一标识console.log(res.data.UnionID);//微信开发平台联合IDconsole.log(res.data.session_key);//会话密钥//***注意****//注意:这里是直接把session_key缓存起来,在上面wx.getUserInfo会使用到wx.setStorageSync("session_key",res.data.session_key);[code]//promise机制放回成功数据 resolve(res.data); } else { reject('error'); } }, fail: function(res) { reject(res); wx.showToast({ title: '系统错误' }) }, complete: () => { } //complete接口执行后的回调函数,无论成功失败都会调用 }) } else { reject("error"); }}})})}[/code

    .Net WebApi 请求用户信息接口:

    /// <summary>  /// 获取用户信息  /// </summary>  /// <param name="code">信息数据code凭证</param>  /// <returns></returns>  [HttpGet]  public IHttpActionResult GetUserInfo(string code)  {   string AppSecret = "小程序秘钥";   string AppId = "应用程序标识";   try   {    //请求目标地址和参数(authorization_code授权类型,此处只需填写 authorization_code)    string OauthUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=" + AppId + "&secret=" + AppSecret + "&js_code=" + code + "&grant_type=authorization_code";//序列化解析数据    var Result = HttpGet(OauthUrl);    return Json(new { openid = Result.openid, errcode = Result.errcode, UnionID = Result.unionid, session_key = Result.session_key });   }   catch (Exception ex)   {    return Json(new { errcode = 1, msg = "获取用户信息失败" + ex.Message });   }  }  /// <summary>  /// 请求code2Session接口获取用户信息  /// </summary>  /// <param name="requestDataAndUrl">目标地址和参数</param>  /// <returns></returns>  public WxOauthModle HttpGet(string requestDataAndUrl)  {   HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestDataAndUrl);   request.Method = "GET";   request.ContentType = "text/html;charset=UTF-8";   HttpWebResponse response = (HttpWebResponse)request.GetResponse();   Stream myResponseStream = response.GetResponseStream();   StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);   string retString = myStreamReader.ReadToEnd();   myStreamReader.Close();   myResponseStream.Close();   return JsonConvert.DeserializeObject<WxOauthModle>(retString);  }  public class WxOauthModle  {   /// <summary>   /// 用户唯一标识   /// </summary>   public string openid { get; set; }   /// <summary>   /// 会话秘钥   /// </summary>   public string session_key { get; set; }   /// <summary>   /// 联立编号   /// </summary>   public string unionid { get; set; }   /// <summary>   /// 错误码   /// </summary>   public int errcode { get; set; }   /// <summary>   /// 错误信息   /// </summary>   public string errmsg { get; set; }  }