依赖
<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