微信登录小程序端与SSM框架结合,小程序端授权登录。

求大家一波关注。。。

我们可以在微信官方文档中,找到小程序登录的时序图。如下图所示:

 注意事项:

小程序端登陆代码

// index.js

// 获取应用实例
const app = getApp()
var httpUtils = require('../../utils/http.js')
Page({
  data: {
  },

  onLoad: function (param) {
  },

  //登录
  doLogin: function (e) {
    //API接口
    wx.getUserProfile({
       desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
       success: (res) => {
       console.log(res.userInfo);
        wx.switchTab({
           url: '../indexsy/indexsy',
          })
        }
      }),
    wx.login({
       success: (res) => {
       //获取登录的临时凭证
       var code = res.code;
       console.log("小程序的code"+code);
       //调用后端,获取微信的session_key和secret
       if (res.code) {
       //发起网络请求,用于注册或获取用户信息
         wx.showToast({
              title: '成功登录小程序',
              duration: 10000
            });
            console.log(55);
            httpUtils.postReq('user/getUserByCode', {
              code: res.code
            }, function (res) {
              console.log("登录成功");
              wx.setStorage({
                  key: "token",
                  data: token,
                  success: function (res) {
                       typeof cb == "function" && cb(true)
                  },
                  fail: function (res) {
                       typeof cb == "function" && cb(false)
                  }
              })
            })
          } else {
            return 
          }
        }
      })
  }
})



//http.js

function postReq(url, data, cb, showNoCommonModal, showLoading = true) {
  if (showLoading) {
    wx.showLoading({
      title: '加载中...',
    })
  }
  data['page'] = 1;
  data['limit'] = 10000;
  header.token = uriUtils.getToken();
  wx.request({
    url:'http://127.0.0.1:8080/mycode_war_exploded/' + url,
    header: header,
    data: data,
    method: 'post',
    success: function (res) {
      if (res.data.code != uriUtils.CODE_SUCCESS &&
        res.data.code != uriUtils.CODE_SUCCESS_0 &&
        res.data.code != uriUtils.CODE_NEED_AUTH_USERINFO) {
        if (!showNoCommonModal) {
          showErrModal(res.data.msg, '提示');
        }
        // cb是不是函数类型同时将一个参数传入名为cb的函数下
        return typeof cb == "function" && cb(false, res.data.msg)
      }
      return typeof cb == "function" && cb(res.data)
    },
    fail: function () {
      if (!showNoCommonModal) {
        showErrModal();
      }
      return typeof cb == "function" && cb(false)
    },
    complete: function () {
      wx.hideLoading({
        fail(){}
      });
      wx.stopPullDownRefresh();
    }
  })

}

后端的相关代码:

controller层代码

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
   private UserService userService;
  
    @RequestMapping("/getUserByCode")
    @ResponseBody
    public ReturnData getUserByCode(String code){

        return userService.selectUserByCode(code);
    }

}

service层代码 

//service层相关代码
 public ReturnData selectUserByCode(String code) {
        //根据code去微信查询openid
        ReturnData returnData = WxLoginUtils.jsCode2Session(code);
        if(returnData.getCode()!=ReturnData.KEY_CODE_SUCCESS){
            return returnData;
        }
        User newUser = (User) returnData.getData();
        //查询用户是否已经注册,如果没有注册进行注册操作
        User dbUser = userMapper.selectUserByOpenid(newUser.getOpenid());
        if(dbUser==null){       //没注册呢
            newUser.setHaveGetUserInfo(User.NOT_GET_USERINFO);
            int count = userMapper.insertUser(newUser);
            if(count<=0){
                return ReturnData.fail("登录失败,请重试");
            }
            Long userId = userMapper.selectUserByOpenid(newUser.getOpenid()).getId();
            Map<String,Object> map = MapWrapperUtils.builder(MapWrapperUtils.KEY_USER_ID,userId);
            String token = JwtUtil.creatToken(map);
            return ReturnData.notGetUserInfo(token);
        }else if(User.NOT_GET_USERINFO.equals(dbUser.getHaveGetUserInfo())){        //已经注册过但是尚未完善用户信息
            Long userId = dbUser.getId();
            Map<String,Object> map = MapWrapperUtils.builder(MapWrapperUtils.KEY_USER_ID,userId);
            String token = JwtUtil.creatToken(map);
            return ReturnData.notGetUserInfo(token);
        }else {         //已经注册并已经完善了用户信息
            Long userId = dbUser.getId();
            Map<String,Object> map = MapWrapperUtils.builder(MapWrapperUtils.KEY_USER_ID,userId);
            String token = JwtUtil.creatToken(map);
            return (ReturnData) ReturnData.success().put(ReturnData.KEY_DATA,token);
        }
    }

 相关类的配置


/**
 * 微信登录相关的工具类
 */
public class WxLoginUtils {
    //向微信服务器去请求,根据前台小程序传来的code获取openid
    public static ReturnData jsCode2Session(String loginCode){
        if(TextUtils.isEmpty(loginCode)){
            return ReturnData.fail("参数有误");
        }
        //请求微信服务器的参数
        //appid小程序唯一标识,secret小程序的app secret,js_code登录时获取的code,grant_type填写为authorization_code
        String  params="appid="+ SettingUtils.WX_APPID
                +"&secret="+ SettingUtils.WX_APPSECRET
                +"&js_code="+loginCode
                +"&grant_type="+SettingUtils.GRANT_TYPE_AUTHORIZATION_CODE;
        //发送请求
        String result=HttpRequest.sendGet(UriUtils.GET_SESSION_BY_CODE,params);
        //对数据进行解析
        JSONObject jsonObject =JSON.parseObject(result);
        if(jsonObject==null){
            return ReturnData.fail("微信api调用失败,请重试");
        }
        Integer  errcode=(Integer)  jsonObject .get("errcode");
        String errmsg=(String)jsonObject.get("errmsg");
        if(errcode!=null && errcode!=ConstantUtils.ERR_CODE_SUCCESS  ){
            return ReturnData .fail(errmsg);
        }
        String openid=(String)jsonObject .get("openid") ;
        User user=new User();
        user.setOpenid(openid ) ;
        return ReturnData .success(user ) ;
    }
}

相关的截图:

感兴趣的朋友可以自己尝试一下,也欢迎大家遇到问题和我交流。

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值