SpringBoot微信授权使用第三方SDK best-pay-sdk

必须已经会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调用接口[这一步具体情况看项目]



猜你喜欢

转载自blog.csdn.net/qq_34446485/article/details/80046297