微信扫码登录(测试号)

1,码前准备

2,流程

3,生成二维码,接入微信接口

4,获取token

5,获取用户个人信息

(说明:个人学习使用,使用的是测试账号,不过流程都一样。前提要有自己的服务器和域名)

1.1,登入微信公众平台 (qq.com)

1.2,填写个人信息

 接口配置信息url,这个是要测试你的服务器资源是否正常,自己写个接口接收一下token值就行

 

 

2.1,流程(来自b站的拓新教育,建议大家去看看视频讲的很详细 

 

3.1,上代码(注意看官方文档:微信开放文档 (qq.com)

一,wechatutil(帮助类)

	
import com.alibaba.fastjson.JSON;
import com.example.weichattest.entity.CodeToken;
import com.example.weichattest.entity.WeChatPerson;
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 WxUtils {
    /**
     * 获取扫码人的个人信息
     * @param appid 账号appid
     * @param secret 账号secret
     * @param code 状态
     * @return 返回值为首页地址,用于授权成功后自己跳转自己的首页
     * @throws Exception
     */
    public static String getLogin(String  appid, String secret, String code) throws Exception{
        HttpClient httpclient =  HttpClients.createDefault();
        //用code交换token,code为扫码后微信服务器响应来的值
        String smsUrl="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+ appid +"&SECRET="+ secret + "&code=" + code + "&grant_type=authorization_code";
        //发请求
        HttpGet httpGet = new HttpGet(smsUrl);
        String strResult = "";
        //接收返回的数据,转成utf-8格式
        HttpResponse response = httpclient.execute(httpGet);
        if (response.getStatusLine().getStatusCode() == 200) {
            strResult = EntityUtils.toString(response.getEntity(),"UTF-8");
        }
        //处理数据,存到实体类CodeToken里面
        CodeToken codeToken = JSON.parseObject(strResult, CodeToken.class);
        System.out.println(codeToken);

        //用token交换扫码人的个人信息
        String smsUrl1="https://api.weixin.qq.com/sns/userinfo?access_token="+codeToken.getAccess_token()+"&openid="+codeToken.getOpenid()+"&lang=zh_CN";
        //向微信端发请求
        HttpGet httpGet1 = new HttpGet(smsUrl1);
        String strResult1 = "";
        //接收数据
        HttpResponse response1 = httpclient.execute(httpGet1);
        if (response1.getStatusLine().getStatusCode() == 200) {
            strResult1 = EntityUtils.toString(response1
                    .getEntity(),"UTF-8");
        }
        //处理数据,存到实体类中  后把用户个人信息存到数据库,由于我是测试在这里我就不存了
        WeChatPerson weChatPerson = JSON.parseObject(strResult1, WeChatPerson.class);

        System.out.println(weChatPerson);
        return "本处为首页url,即扫码成功后前台重定向到页面"+"用户名:"+weChatPerson.getNickname()+"唯一id"+weChatPerson.getOpenid();
    }

}

2,maven依赖

<!--二维码操作的核心包-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.3</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.72</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

3,两个实体类,用于存储和微信服务器交互返回的数据

@Data
public class CodeToken {

    /**
     * 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
     */
    private String access_token;
    /**
     * access_token接口调用凭证超时时间,单位(秒)
     */
    private String expires_in;
    /**
     * 用户刷新access_token
     */
    private String refresh_token;
    /**
     * 用户唯一标识
     */
    private String openid;
    /**
     * 用户授权的作用域,使用逗号(,)分隔
     */
    private String scope;


}
@Data
public class WeChatPerson {
    /**
     * 用户的唯一标识
     */
    private String openid;
    /**
     *用户昵称
     */
    private String nickname;
    /**
     * 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
     */
    private Integer sex;
    /**
     * 国家,如中国为CN
     */
    private String country;
    /**
     * 普通用户个人资料填写的城市
     */
    private String city;
    /**
     * 用户个人资料填写的省份
     */
    private String province;
    /**
     * 用户头像
     */
    private String headimgurl;
    /**
     * 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
     */
    private String privilege;
    /**
     * 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
     */
    private String unionid;
}

4,controller


import cn.hutool.extra.qrcode.QrCodeUtil;
import com.example.weichattest.util.WxUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 微信登录
 */
@Controller
public class WeCatController {

    /**
     * pc点击微信登录,生成登录二维码
     * @throws Exception
     */
    @GetMapping(value = "/wxLogin")
    @ResponseBody
    public void wxLoginPage(HttpServletRequest request, HttpServletResponse response,String token) throws Exception {
        System.out.println("js");
        //redirect_uri是回调的地址 注意要转成UrlEncode格式
            String url1 ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http%3A%2F%2Fwww.***.pro%2FpcLogin&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
        //生成二维码的,扫描后跳转上面的地址
            QrCodeUtil.generate(url1, 300, 300, "jpg", response.getOutputStream());

    }

    /**
     * 扫描二维码授权成功,取到code,就是回调方法(redirect_uri访问地址)
     *
     * @author js
     * @param code
     * @param state
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/pcLogin")
    @ResponseBody
    public String pcCallback(String code, String state, HttpServletRequest request, HttpServletResponse response,
                             HttpSession session) throws Exception {
        String loginAcessToken = WxUtils.getLogin("appid", "secret", code);
        return loginAcessToken;
    }

}

有不对的地方欢迎大家指出来!

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值