使用第三方sdk,微信wechat扫码登录

依赖

<dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>2.7.0</version>
        </dependency>

配置类,从yml中注入

wx:
  mp:
    configs:
      appid: XXX   #公众号appid
      secret: XXX  #公众号secret
      #扫码登录的appid和secret和之前的是不一样的
      openAppId: XXX  #扫码登录的appid
      openAppSecret: XXX  #扫码登录的secret
      mchId: XXX    #商家id
      mchKey: XXX  #商家key
      keyPath: D:\imooc\coding-117\doc\h5.p12 #证书
      notifyUrl:  http://XXX.XXX.XXX/pay/notify  #支付通知回调地址
package com.chan.wechatshop.config;

import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class WechatOpenConfig {

    @Autowired
    private WeChatAccountConfig weChatAccountConfig;



    /**
     * 这里和公众号那里的是同一个接口,这里的bean改个名字wxOpenService,就是方法名
     */
    @Bean
    public WxMpService wxOpenService(@Qualifier("wxOpenConfigStorage") WxMpConfigStorage wxOpenConfigStorage){
        WxMpService wxOpenService = new WxMpServiceImpl();
        wxOpenService.setWxMpConfigStorage(wxOpenConfigStorage);
        return wxOpenService;
    }


    @Bean
    public WxMpConfigStorage wxOpenConfigStorage(){
        WxMpInMemoryConfigStorage wxOpenConfigStorage = new WxMpInMemoryConfigStorage();
        wxOpenConfigStorage.setAppId(weChatAccountConfig.getOpenAppId());
        wxOpenConfigStorage.setSecret(weChatAccountConfig.getOpenAppSecret());
        return wxOpenConfigStorage;
    }



}

获取code和openid的controllrt

qr开头那两个,其余的是公众号的

package com.chan.wechatshop.controller;

import com.chan.wechatshop.config.ProjectUrl;
import com.chan.wechatshop.enums.ResultEnum;
import com.chan.wechatshop.exception.SellException;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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.RequestParam;
import org.springframework.web.client.RestTemplate;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;


@Controller
@RequestMapping("/wechat")
@Slf4j
public class WeChatController {

    private String accessToken;

    @Autowired
    @Qualifier("wxMpService")
    private WxMpService wxMpService;

    @Autowired
    @Qualifier("wxOpenService")
    private WxMpService wxOpenService;

    @Autowired
    private ProjectUrl projectUrl;


    @GetMapping("auth")
    public void auth(@RequestParam("code") String code) {
        log.info("code={}", code);
        log.info("进入auth方法。。。。。");
        accessToken = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=XXX&secret=xxx&code=" + code + "&grant_type=authorization_code";
        RestTemplate restTemplate = new RestTemplate();
        String response = restTemplate.getForObject(accessToken, String.class);
        log.info("response={}", response);

    }


    /**
     * 请求code的url中的state会原封不动的发回来,详情可以参照微信文档https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
     * 微信会把授权code请求给redirect_url中的接口
     * sdk会自动拼接成微信获取获取code的url,其中的redirect_url就是方法参数中传入的url,然后利用springmvc的请求重定向在另一个controller中接收code
     * https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXX&redirect_uri=http://XXX.XXX.XXX/wechat/auth&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
     * @param backUrl
     * @return
     */
    @GetMapping("authorize")
    public String authorize(@RequestParam("backUrl") String backUrl){
        
        //backUrl放在state里会原封不动传回来
        //String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state);
        String redirectUrl = wxMpService.oauth2buildAuthorizationUrl(projectUrl.wechatMpAuthorize + "/wechat/userInfo", WxConsts.OAUTH2_SCOPE_BASE, URLEncoder.encode(backUrl));
        //https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXX&redirect_uri=http%3A%2F%XXX.XXX.XXX%2Fwechat%2FuserInfo&response_type=code&scope=snsapi_base&state=http://www.imooc.com&connect_redirect=1#wechat_redirect
        return "redirect:" + redirectUrl;       //这里的redirectUrl应该是把请求转发给了微信获取code的url,然后把state作为获取openid后要跳转的controller,因为把url替换了微信获取code的returnUrl,所以接下来在url这个链接中可以获取code等其他参数
    }


    /**
     * 根据code获取wechat的网页授权的access_token,然后获取openid
     */
    @GetMapping("userInfo")
    public String getUserInfo(@RequestParam("code") String code,@RequestParam("state") String backUrl){
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null;
        try {
            wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
        } catch (WxErrorException e) {
            log.error("[微信网页授权] {}",e);
            e.printStackTrace();
            throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(),e.getError().getErrorMsg());
        }

        String openId = wxMpOAuth2AccessToken.getOpenId();

        return "redirect:" + backUrl + "?openid=" + openId;
    }


    @GetMapping("qrAuthorize")
    public String qrAuthorize(@RequestParam("returnUrl") String returnUrl){
        String url = "http://felixchan.natapp1.cc/wechat/qrUserInfo";
        //这里第三方sdk就是拼一个微信获取code的url出来,并且把returnUrl放到state中,因为state会原封不动传回来
        //其中的微信获取code的回调url字段redirect_url就是下面的http://XXX.XXX.XXX.XXX/wechat/qrUserInfo
        //这样微信会把code抛给下面的qrUserInfo controller
        String redirectUrl = wxOpenService.buildQrConnectUrl(projectUrl.wechatOpenAuthorize + "wechat/qrUserInfo",WxConsts.QRCONNECT_SCOPE_SNSAPI_LOGIN,URLEncoder.encode(returnUrl));
        return "redirect:" + redirectUrl;
    }

    @GetMapping("qrUserInfo")
    public String qrUserInfo(@RequestParam("code") String code,@RequestParam(value = "state",required = false) String state){
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null;
        try {
            wxMpOAuth2AccessToken = wxOpenService.oauth2getAccessToken(code);
        } catch (WxErrorException e) {
            log.error("[微信网页授权] {}",e);
            e.printStackTrace();
            throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(),e.getError().getErrorMsg());
        }

        String openId = wxMpOAuth2AccessToken.getOpenId();

        return "redirect:" + state + "?openid=" + openId;
    }




}

不懂的也可以观看官方文档
https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值