必须已经会SpringBoot,且配置了微信授权的回调接口。
SDK地址:https://github.com/Pay-Group/best-pay-sdk/blob/master/doc/use.md
pow依赖
<!-- 需要添加eclipse插件 可以使用 @Data注解等等,不用此工具则需要添加set get等等方法 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
<!-- 微信公众号sdk --> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>2.7.0</version> </dependency>
项目url【这个项目url使用的是域名,如何绑定域名请看微信官方文档】
package cn.edu.jxnu.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 微信公众平台url前缀配置 注入springboot属性文件的值 * * @author 梦境迷离. * @version V1.0 * @time 2018年4月13日 */ @Data @ConfigurationProperties(prefix = "projectUrl") @Component public class ProjectUrlConfig { /** * 微信公众平台授权url */ public String wechatMpAuthorize; /** * 微信开放平台授权url,授权没用到 */ //public String wechatOpenAuthorize; }
再次说明:
projectUrl,wechat是SpringBoot的application.properties的前缀 如projectUrl=openid
账户属性值注入
package cn.edu.jxnu.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Map; /** * 微信账号配置 读取属性文件值 * * @author 梦境迷离. * @version V1.0 * @time 2018年4月13日 */ @Data @Component @ConfigurationProperties(prefix = "wechat") public class WechatAccountConfig { /** * 公众平台id */ private String mpAppId; /** * 公众平台密钥 */ private String mpAppSecret; }
微信公众号配置
package cn.edu.jxnu.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.context.annotation.Bean; import org.springframework.stereotype.Component; /** * 微信公众平台配置 * * @author 梦境迷离 * @version V1.0 * @time 2018年4月13日 */ @Component public class WechatMpConfig { @Autowired private WechatAccountConfig accountConfig; /** * 微信公众号服务层 bean注册 * * @time 下午6:08:13 * @version V1.0 * @return WxMpService */ @Bean public WxMpService wxMpService() { WxMpService wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(wxMpConfigStorage()); return wxMpService; } /** * 微信公众号配置 bean注册 * * @time 下午6:08:41 * @version V1.0 * @return WxMpConfigStorage */ @Bean public WxMpConfigStorage wxMpConfigStorage() { WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage(); // 设置开发者的id和密钥 wxMpConfigStorage.setAppId(accountConfig.getMpAppId()); wxMpConfigStorage.setSecret(accountConfig.getMpAppSecret()); return wxMpConfigStorage; } }
控制器
package cn.edu.jxnu.controller; import java.net.URLEncoder; import org.springframework.beans.factory.annotation.Autowired; 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 cn.edu.jxnu.config.ProjectUrlConfig; import cn.edu.jxnu.enums.ResultEnum; import cn.edu.jxnu.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; /** * 微信授权,使用github的微信sdk * * @author 梦境迷离. * @version V1.0 * @time 2018年4月17日 */ @Controller // 需要重定向的时候不能使用RestController @RequestMapping("/wechat") @Slf4j public class WechatController { @Autowired private WxMpService wxMpService; //@Autowired //private WxMpService wxOpenService; @Autowired private ProjectUrlConfig projectUrlConfig; /**第一步:请求CODE,必要参数return * 此方法实现请求授权 * @time 下午6:17:37 * @version V1.0 * @param returnUrl * @return 重定向 string */ @SuppressWarnings("deprecation") @GetMapping("/authorize") public String authorize(@RequestParam("returnUrl") String returnUrl) { // 1. 配置 // 2. 调用方法 String url = projectUrlConfig.getWechatMpAuthorize() + "/项目名或者/ /wechat/userInfo"; // OAUTH2_SCOPE_BASE 默认直接授权 String redirectUrl = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAUTH2_SCOPE_BASE, URLEncoder.encode(returnUrl));// 重定向到回调接口地址 redirectUrl,必须编码url log.info("授权:{}", redirectUrl); return "redirect:" + redirectUrl; } /**第二步:通过code获取access_token * 上面的authorize方法重定向到这个方法获取用户信息 * 用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数 * @time 下午6:17:59 * @version V1.0 * @param code * @param returnUrl * @return 重定向 string */ @GetMapping("/userInfo") public String userInfo(@RequestParam("code") String code, @RequestParam("state") String returnUrl) { WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken(); try { //通过code获取access_token wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code); } catch (WxErrorException e) { log.error("【微信网页授权】{}", e); // 继续抛出 throw Exception(); } // 拿到openid 到这一步重点已经完成 String openId = wxMpOAuth2AccessToken.getOpenId(); log.info("获得openid:{}", openId); // 这个接口前端和后端的开发文档规定的,视情况而定 return "redirect:" + returnUrl + "?openid=" + openId;}}
微信官方的api
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
可以看到只有code是未知的,需要携带
微信端使用 域名/wechat/authorize?returnUrl=回调地址 【微信配置的】
总结:
1、配置开发者id和密钥
2、设置微信回调接口,并在项目中设置,注入
3、注册微信授权bean【 WxMpConfigStorage, WxMpService】 前者是设置配置文件,后者是服务,里面有授权封装
4、编写控制器,
第一步:请求CODE 【authoeize方法】
第二步:通过code获取access_token 【userInfo方法】
第三步:通过access_token调用接口[这一步具体情况看项目]