(十四)SpringBoot开发微信授权支付

前提:配置好域名,在公众号配置

一.引用jar包,在pom.xml文件加入依赖

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

  

二.在application.yml 加入配置

wechat:
  mpAppId: wxd898fcb01713c658
  mpAppSecret: 47ccc303338cee6e62894fxxxxxxxxxxx

  mpAppId ,mpAppSecret可以从公众号上取到

三.账户属性值注入

新建一个WechatAccountConfig.java类

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 yux
 * @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 yux
 * @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 yx
 * @version V1.0
 * @time 2018年4月17日
 */
@Controller // 需要重定向的时候不能使用RestController
@RequestMapping("/wechat")
@Slf4j
public class WechatController {
 
	@Autowired
	private WxMpService wxMpService;
 
	//@Autowired
	//private WxMpService wxOpenService;
 
 
	/**第一步:请求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 = /域名/+/项目名/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;
}
}

  

总结:

1、配置开发者id和密钥

2、设置微信回调接口,并在项目中设置,注入

3、注册微信授权bean【 WxMpConfigStorage, WxMpService】 前者是设置配置文件,后者是服务,里面有授权封装

4、编写控制器,

    第一步:请求CODE   【authoeize方法】

    第二步:通过code获取access_token  【userInfo方法】

    第三步:通过access_token调用接口[这一步具体情况看项目]

posted @ 2018-09-30 15:23  魔鬼YU天使  阅读(1981)  评论(0编辑  收藏  举报