轻源码

  • QingYuanMa.com
  • 全球最大的互联网技术和资源下载平台
搜索
轻源码 门户 终极进阶 查看主题

微信小程序登录步骤流程(C#)

发布者: zjlox | 发布时间: 2018-9-24 05:21| 查看数: 5329| 评论数: 0|帖子模式

作者:Mr.Voop,来自公众号:宏记 
小程序官方文档中说道:

调用wx.login接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)。调用wx.getUserInfo接口将返回的数据会包含 encryptedData, iv 等敏感信息。用户数据的加解密通讯需要依赖会话密钥完成。

UnionID机制说明:

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

小程序登录主要作用是获取用户信息,主要用到两个API,一个是wx.login获取用户的jscode,再通过服务器端用jscode去获取用户的openid与session_key。openid是用户在小程序公众平台的唯一标识,注意,是小程序公众平台内,而不是所有公众平台内,即如果在服务号或订阅号公众平台,就可能会有跟此用户同样openid的用户,如果要微信所有公众平台某个用户的唯一标识,就只能用unionid了。session_key是用户的密钥,用于解密用户敏感数据。另一个wx.getuserInfo就是为了获取到用户的加密敏感数据与偏移量iv,偏移量再加上之前的session_key就能解密用户的敏感数据了。

官方提供的登录流程图: 

下面是主要步骤流程:

  • 客户端调用wx.login获取code
  • 客户端调用wx.request请求把code传到服务器后台
  • 服务器后台根据code+appid+appsecret向微信后台发送请求获取openid+session_key
  • 服务器后台随机生成一个随机数3rd_session(以硬盘或设置或日期+rand随机函数生成),以3rd_session为key,openid+session_key为Value存储起来,并把3rd_session发送至客户端,3rd_session所起的作用只是为了验证用户登录时的时效是否过期,并不是必须的,如不用验证登录是否过期,可不用3rd_session
  • 客户端获取到3rd_session后存储到storage
  • 客户端调用wx.getUserInfo获取用户敏感数据encryptedData和偏移向量IV
  • 客户端调用wx.request请求把encryptedData+偏移向量iv+3rd_session传送到服务器后台
  • 服务器后台根据3rd_session到缓存中找出session_key
  • 服务器后台根据session_key+IV解密encryptedData(AES解密三个参数:密文encryptedData,密钥session_key,偏移向量iv)

步骤流程结合的详细流程图: 

小程序客户端发起的调用:

  1. wx.login({
  2. success: function (res) {
  3. var jscode = res.code;
  4. wx.getUserInfo({
  5. success: function (res) {
  6. var option = {
  7. url: config.ghost+config.UrlApi.app_userlogin_url,
  8. method:'POST',
  9. data: {
  10. "obj":{
  11. "encryptedData": res.encryptedData,
  12. "iv": res.iv,
  13. "jscode": jscode
  14. },
  15. "UserCode": "",
  16. "EncryptUserCode": config.gencryptCusCode,
  17. "AppType":config.gapptype,
  18. "CompanyKey":config.gcompanyKey,
  19. "ShopID":config.gshopID
  20. }
  21. };
  22. utils.ClientRequest(option,
  23. function (res) {
  24. console.log(res);
  25. if(res.data.Body.Code=="1"){
  26. //成功
  27. var resData = res.data.Body.Data;
  28. //初始化
  29. that.setConfigUser(resData);
  30. //把Clientkey存缓存
  31. storage.setStorageData(config.storageKey.Userkey,resData.clientkey);
  32. } else{
  33. console.log(res);
  34. wx.navigateTo({url: "../loginfail/loginfail"});
  35. }
  36. },
  37. function (res) {
  38. console.log(res);
  39. wx.navigateTo({url: "../loginfail/loginfail"});
  40. }
  41. );
  42. },
  43. fail: function () { // 拒绝操作
  44. wx.navigateTo({url: "../loginfail/loginfail"});
  45. }
  46. });
  47. }
  48. });

后台业务服务端如下:

  1. public SingleResult<object> GetWXLoginInfo(UserInfoWhere Model, MolaResult molaResult)
  2. {
  3. var result = new SingleResult<object>();
  4. using (var db = DbServices.GetDb())
  5. {
  6. try
  7. {
  8. //获取商户信息
  9. BIShopEntity shopinfo = db.GetDal<BIShopEntity>().Get(w => w.ShopCode == molaResult.ShopID);
  10. //1.使用登录凭证WModel.code 获取 session_key 和 openid
  11. var unifiedorderRes = WXHandleBll.GetSessionKeyOpenId(shopinfo.AppId, shopinfo.Secret, Model.jscode);
  12. //反序列化
  13. var reslogion = JsonConvert.DeserializeObject<WXResLoginInfo>(unifiedorderRes);
  14. if (reslogion.session_key != null)
  15. {
  16. //解密敏感数据 openid在每个平台是唯一的,不变的,而unionid是所有平台唯一的,而session_key是一段时期内相同,但过段时间有可能会变
  17. var userdata = WXHandleBll.GetDencryptedData(Model.encryptedData, reslogion.session_key, Model.iv);
  18. //反序列化userdata成WXResencryptedData实体
  19. var encryptedData = JsonConvert.DeserializeObject<WXResencryptedData>(userdata);
  20. //随机数,返回客户端 key-value 暂不用随机,客户端用openid,这样删除应用再登录进来时才能识别是否注册过了
  21. var clientKey = WXHandleBll.GetNoncestr();
  22. //存用户表 先找,没有就增加,有就不管了
  23. BIUserLoginEntity usermodel = db.GetDal<BIUserLoginEntity>().GetList(a => a.OpenID == encryptedData.openId).FirstOrDefault();
  24. BIUserEntity user = new BIUserEntity();
  25. BIUserLoginEntity userlogin = new BIUserLoginEntity();
  26. if (usermodel == null)
  27. {
  28. user.UserCode = UtilService.GetBillCode(db, "BI_User");
  29. user.UserName = encryptedData.nickName;
  30. user.RegisterTime = DateTime.Now;
  31. user.Createtime = DateTime.Now;
  32. user.Province = encryptedData.province;
  33. user.City = encryptedData.city;
  34. user.Sex = encryptedData.gender;
  35. user.HeadImage = encryptedData.avatarUrl;//头像
  36. db.GetDal<BIUserEntity>().AddEx(user);
  37. user.EncryptUserCode = encryptedData.openId;
  38. //这样,第三方的登录态是还没做起来的,暂不做
  39. userlogin.UserCode = user.UserCode;
  40. userlogin.JsCode = Model.jscode;
  41. userlogin.Sessionkey = reslogion.session_key;
  42. userlogin.OpenID = reslogion.openid;
  43. userlogin.Clientkey = encryptedData.openId;// clientKey;
  44. userlogin.CreateTime = DateTime.Now;
  45. //存登录信息
  46. db.GetDal<BIUserLoginEntity>().AddEx(userlogin);
  47. Model.UserCode = user.UserCode;
  48. }
  49. else
  50. {
  51. user = db.GetDal<BIUserEntity>().GetList(a => a.UserCode == usermodel.UserCode).FirstOrDefault();
  52. user.EncryptUserCode = encryptedData.openId;
  53. }
  54. WXResLoginInfo reslogin = new WXResLoginInfo();
  55. reslogin.user = user;
  56. reslogin.shop = shopinfo;
  57. reslogin.clientkey = encryptedData.openId;// clientKey;
  58. result.Data = reslogin;
  59. result.Code = ((int)CommonStatus.Success).ToString();
  60. result.Message = "获取成功!";
  61. }
  62. else
  63. {
  64. result.Code = ((int)CommonStatus.Fail).ToString();
  65. result.BillCode = "";//返回key
  66. result.Message = "获取失败!";
  67. }
  68. }
  69. catch (Exception ex)
  70. {
  71. result.Code = ((int)CommonStatus.Abnormal).ToString();
  72. result.Message = "登录获取失败!";
  73. throw ex;
  74. }
  75. }
  76. return result;
  77. }

返回敏感数据格式如下:

  1. “{\”openId\”:\”o7uAX0bcV-vUiWnSx7L2E\”,\”nickName\”:\”\”,\”gender\”:1,\”language\”:\”zh_CN\”,\”city\”:\”Guangzhou\”,\”province\”:\”Guangdong\”,\”country\”:\”CN\”,\”avatarUrl\”:\”http://wx.qlogo.cn/mmopen/vi_32/DwVhddtjryWwk6wMVKp2RZq4vxS0FtQIOz6WqDONz3BkWJb0SE4a5ibf8Hibg7STFiaaicibKCQax0XkA/0\",\"watermark\":{\"timestamp\":149251873,\"appid\":\"wx11cb7c92\"}}“

最新评论

轻源码让程序更轻更快

QingYuanMa.com

工作时间 周一至周六 8:00-17:30

客服QQ点击咨询

微信公众号

APP客户端

Copyright © 2016-2019 http://www.qingyuanma.com/ 鲁ICP备17014494号

快速回复 返回顶部 返回列表