微信小程序登录

微信小程序登录(完整代码可执行)

众所周知,微信开发官方为了保护用户隐私,取消了使用getUser和getUserInfo的方法,导致初学者的学习开发变得艰难。但是我们仍可以使用后端获取的方法去实现微信小程序的登录。本文主要是为了解决初学者以及单纯为了完成课程设计的学生设计了一个不需要进行花费300元去进行微信小程序登录的认证的一个简单实现方法的代码(前后端都有,直接复制粘贴就可以使用)

  • 首先要到微信公众平台https://mp.weixin.qq.com/获取自己小程序的appId和appSecret,并将其配置在application.yml文件上

image-20240129182533182

//调用了微信小程序的APIwx.login获取登录凭证(根据当前用户微信号获取的)		
wx.login({
		    success: async (res) => {
			if (res.code) {
			  console.log('成功获取登录凭证:', res.code);
			  try {
                //将获取的code发送给服务器端
				const { data: loginResult } = await uni.$http.post('/wx/user/login', { authCode: res.code });
				console.log('登录请求成功:', loginResult);
				this.updateUserInfo(loginResult)
			  } catch (error) {
				console.error('登录请求失败:', error);
				// 在这里处理登录请求失败后的逻辑
			  }
			} else {
			  console.log('获取登录凭证失败!' + res.errMsg);
			  // 在这里处理获取登录凭证失败的逻辑
			}
		  },
		    fail: (error) => {
			console.error('wx.login 失败', error);
			uni.$showMsg('登录失败!');
			
		  }
		});
//第一次登录 获取session_key  保存在userInfo,跳转页面 根据获取的oepn
//第二次登录 code获取—> openId和session_key
package com.example.fresh_demo.service.impl;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import cn.hutool.http.HttpRequest;

import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.example.fresh_demo.Req.WxLoginReq;
import com.example.fresh_demo.Resp.WxLoginResp;
import com.example.fresh_demo.pojo.User;
import com.example.fresh_demo.service.UserService;
import com.example.fresh_demo.service.WxUserService;
import com.example.fresh_demo.utils.ConverterUtils;
import com.example.fresh_demo.utils.RedisUtil;
import com.example.fresh_demo.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;



@Slf4j
@Service
public class WxUserServiceImpl implements WxUserService {

    @Autowired
    private UserService userService;


    @Autowired
    private RedisUtil redisUtil;

    @Value("${wx.appId}")
    private String appId;

    @Value("${wx.appSecret}")
    private String appSecret;

    /**
     * wx accessToken前缀
     *

     */
    public static final String WX_ACCESS_TOKEN_KEY = "wx:access:token:%s";

    /**
     * 获取wx accessToken请求路径
     *

     */
    public static final String WX_GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";

    /**
     * 获取微信手机号请求路径
     *
     */
    public static final String WX_GET_PHONE_NUMBER_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s";

    /**
     * 获取微信用户openId
     *
     */
//    通过access-token去获取
//    public static final String WX_GET_OPEN_ID_URL = "https://api.weixin.qq.com/wxa/getpluginopenpid?access_token=%s";
    public static final String WX_GET_OPEN_ID_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=wx5fd0c997df4db18d&secret=35781834f18108a79c2ffdd68b66d0e9&js_code=%s&grant_type=authorization_code";


    /**
     * 微信小程序accessToken过期返回状态码
     *
     * @author wfs
     * @date 2023/9/26
     */
    public static final String WX_ACCESS_TOKEN_EXPIRE = "40001";

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result  login(WxLoginReq req) {
        log.info("小程序授权登录请求参数_{}", req);
        WxLoginResp wxLoginResp =  getWxOpenIdAndSessionKey(req.getAuthCode());
        if(wxLoginResp == null)
        {
            return  Result.build(wxLoginResp, 40001, "该码无效");
        }
        //实现将openId传入数据库
        //并且将sessionKey和openId的值以及用户的基础知识,传给前端,存在vuex中
    }

	//通过code获取SessionKey和OpenId
    public WxLoginResp getWxOpenIdAndSessionKey(String authCode) {
        if (StringUtils.isBlank(authCode)) {
            return null;
        }
        String respText = HttpRequest.post(String.format(WX_GET_OPEN_ID_URL, authCode))
                .setConnectionTimeout(30000)
                .setReadTimeout(30000)
                .execute()
                .body();
        log.info("getUserOpenId_ [获取微信openId和sessionKey结果 {}]", respText);
        if (StringUtils.isEmpty(respText)) {
            log.error("getUserOpenId_ [获取失败!]");
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(respText);
        WxLoginResp wxLoginResp = new WxLoginResp();
        if(StringUtils.isEmpty(jsonObject.getString(("openid")) )|| StringUtils.isEmpty(jsonObject.getString(("session_key"))))
        {
            return null;
        }
        wxLoginResp.setOpenId(jsonObject.getString(("openid")));
        wxLoginResp.setSessionKey(jsonObject.getString(("session_key")));
        return wxLoginResp;

    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值