微信扫码登录-java

 

步骤:

1.微信开放平台注册https://open.weixin.qq.com/

2.完善开发者信息

3.申请创建 网站应用 

4.填写对应信息 然后坐等审核通过

注意点:

申请创建网站应用 授权回调地址 必须是域名 不能用ip 不能带端口 

af9c1147a28843ba8813c02fe79976ec.png

如果你的回调地址是 www.test.com/login/callBack 那这里就只用填写www.test.com 而在你代码里 需要填写具体的回调地址


后端开发:

流程:

1.获取微信二维码

2.用户扫码确认登录生成code和state,微信会根据回调地址,自己带上code和state

3.根据code换access_token,做本地操作

代码:

<!-这里用到的依赖-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.11</version>
</dependency>
#微信appid应用唯一标识
wx.open.app_id=wx123456
#微信appSecret
wx.open.app_secret=3e8de831138d
#回调地址 这里是具体的回调地址
wx.open.redirect_url=http://www.test.com/wxLogin/callBack
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ConstantPropertiesUtil implements InitializingBean {

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

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

    @Value("${wx.open.redirect_url}")
    private String redirectUrl;

    public static String WX_OPEN_APP_ID;
    public static String WX_OPEN_APP_SECRET;
    public static String WX_OPEN_REDIRECT_URL;

    
    @Override
    public void afterPropertiesSet() throws Exception {
        WX_OPEN_APP_ID = appId;
        WX_OPEN_APP_SECRET = appSecret;
        WX_OPEN_REDIRECT_URL = redirectUrl;
    }
}

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RestController
@RequestMapping("/wxLogin")
public class WeChatLogin {


    @ApiOperation(value = "获取微信二维码")
    @GetMapping("/getWxCode")
    public ApiResult getWxCode() {
         //微信开放平台授权baseUrl
        String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
                "?appid=%s" +
                "&redirect_uri=%s" +
                "&response_type=code" +
                "&scope=snsapi_login" +
                "&state=%s" +
                "#wechat_redirect";
        String redirectUrl = ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL;
        try {
            redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
       
        String qrcodeUrl = String.format(
                baseUrl,
                ConstantPropertiesUtil.WX_OPEN_APP_ID,
                redirectUrl,
        //这里的onlineEdu 微信建议第三方带上这个参数 可随机为任何
                "onlineEdu");
        return ApiResult.successWithObject("redirect:" + qrcodeUrl);
    }


    @ApiOperation(value = "回调地址")
    @GetMapping ("/callBack")
    public ApiResult callBack(
            @RequestParam("code") String code,
            @RequestParam("state") String state,
            ) throws Exception{

   
        //获取access_token
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        url = url.replace("APPID", ConstantPropertiesUtil.WX_OPEN_APP_ID)
                .replace("SECRET", ConstantPropertiesUtil.WX_OPEN_APP_SECRET)
                .replace("CODE", code);
        String tokenInfoStr = HttpClientUtil.doGet(url);
        JSONObject tokenInfoObject = JSONUtil.parseObj(tokenInfoStr);

        //获取用户信息
        String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
        userInfoUrl = userInfoUrl.replace("ACCESS_TOKEN", tokenInfoObject.getStr("access_token"))
                .replace("OPENID", tokenInfoObject.getStr("openid"));
        String userInfoStr = HttpClientUtil.doGet(userInfoUrl);

        JSONObject wxUserInfo = JSONUtil.parseObj(userInfoStr);

        //判断是否存该用户
        String openid = tokenInfoObject.getStr("openid");
        String unionId = tokenInfoObject.getStr("unionid");
        User userInfo = userService.getByOpenid(openid);
        if (userInfo == null){
            //业务上进行保存用户各信息
            
        }

        //存在直接进行登录 生成token或其他 根据自己需求来 
        String token = "token";
        return ApiResult.successWithObject(token);
    }
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个微信扫码登录Java代码示例: 1. 定义一个类WechatLogin,包含以下字段和方法: - appid: 微信开放平台申请的应用id - secret: 微信开放平台申请的应用密钥 - redirect_uri: 授权后重定向的回调链接地址 - scope: 应用授权作用域,snsapi_login表示只能获取用户基本信息,无需用户同意 - state: 用于防止CSRF攻击,生成随机数即可 - getQrCodeUrl(): 获取微信扫码登录的二维码链接地址 - getAccessToken(String code): 根据授权码code获取access_token ```java import java.net.URLEncoder; import java.util.UUID; public class WechatLogin { private static final String APPID = "your_appid"; private static final String SECRET = "your_secret"; private static final String REDIRECT_URI = "http://yourdomain.com/wechat_redirect"; private static final String SCOPE = "snsapi_login"; private static final String STATE = UUID.randomUUID().toString().replaceAll("-", ""); /** * 获取微信扫码登录的二维码链接地址 * @return */ public static String getQrCodeUrl() throws Exception { String url = "https://open.weixin.qq.com/connect/qrconnect?appid=" + APPID + "&redirect_uri=" + URLEncoder.encode(REDIRECT_URI, "UTF-8") + "&response_type=code&scope=" + SCOPE + "&state=" + STATE + "#wechat_redirect"; return url; } /** * 根据授权码获取access_token * @param code * @return */ public static String getAccessToken(String code) throws Exception { String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APPID + "&secret=" + SECRET + "&code=" + code + "&grant_type=authorization_code"; String result = HttpUtils.doGet(url); JSONObject json = JSONObject.parseObject(result); String access_token = json.getString("access_token"); return access_token; } } ``` 2. 使用HttpClient发送HTTP请求,获取access_token。这里可以使用第三方库,如OkHttp或Apache HttpClient。 ```java import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class HttpUtils { public static String doGet(String url) throws Exception { HttpClient client = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); HttpResponse response = client.execute(httpGet); HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity, "UTF-8"); return result; } } ``` 3. 在Controller中处理微信扫码登录的回调请求,获取授权码code,并根据code获取access_token和用户信息。 ```java import com.alibaba.fastjson.JSONObject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; @Controller public class WechatLoginController { @RequestMapping("/wechat_redirect") public String wechatRedirect(HttpServletRequest request, Model model) throws Exception { String code = request.getParameter("code"); String access_token = WechatLogin.getAccessToken(code); String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN"; String result = HttpUtils.doGet(url); JSONObject json = JSONObject.parseObject(result); String nickname = json.getString("nickname"); String headimgurl = json.getString("headimgurl"); //TODO: 根据openid判断用户是否已经绑定,如果已经绑定则直接登录,否则跳转到绑定页面 return "bindPage"; } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值