发表于: 2018-10-13 23:19:17
1 468
今天完成的事情
支付宝支付demo
官方文档这么说的:
跟之前的不一样,之前是调接口获取返回值,这次是自己写一个页面
因为是使用spring boot做的,官方SDK又是jsp,只能自己琢磨
想着用过滤器?让这个请求直接不进入controller,在过滤器中直接返回一个页面
但是我把AlipayClient作为Bean使用的,过滤器加载是在spring之前,所以会报空指针
那就拦截器?
开始动手
拦截器:
/**
* @ClassName MyFilter* @author: UU
* @Description: TODO
* @Version 1.0
*/
@Component
public class PayInterceptor implements HandlerInterceptor {
@Autowired
AlipayUtil alipayUtil;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
this.turnPay(httpServletRequest, httpServletResponse);
//只有返回true才会继续向下执行,返回false取消当前请求
System.out.println("myinterc prehandler");
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("myinterc posthandler");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("myinterc aftercompletion");
}
public void turnPay(HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws ServletException, IOException {
alipayUtil.pay(httpRequest, httpResponse);
}
}
添加配置拦截器
/**
* @ClassName MyAdapter
* @author: UU
* @Description: TODO
* @Version 1.0
*/
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* 继承WebMvcConfigureAdapter继承并重写addInterceptor方法用于添加配置拦截器
*
* @author chengxi
*/
public class MyAdapter extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器
registry.addInterceptor(new PayInterceptor())
.addPathPatterns("/alipay");
super.addInterceptors(registry);
}
}
但是昨晚的AlipayUtil是无法注入的,而且也无法import
然后灵光一闪
controller返回值为空呢?
直接调用response.getWritter.write()写上去不就好了?
/**
* @ClassName PayController
* @author: UU
* @Description: TODO
* @Version 1.0
*/
@SuppressWarnings("all")
@RestController
public class PayController {
@Autowired
AlipayClient alipayClient;
@RequestMapping(value = "pay", method = RequestMethod.GET)
void turnToPay(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException {
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共参数中设置回跳和通知地址
alipayRequest.setBizContent("{" +
" \"out_trade_no\":\"20150320010101001\"," +
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
" \"total_amount\":88.88," +
" \"subject\":\"Iphone6 16G\"," +
" \"body\":\"Iphone6 16G\"," +
" \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\"," +
" \"extend_params\":{" +
" \"sys_service_provider_id\":\"2088511833207846\"" +
" }" +
" }");//填充业务参数
String form = "";
//调用SDK生成表单
try {
form = alipayClient.pageExecute(alipayRequest).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType("text/html;charset=" + "utf-8");
//直接将完整的表单html输出到页面
httpResponse.getWriter().write(form);
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
@RequestMapping(value = "alipay", method = RequestMethod.GET)
void turnToPay2() throws IOException {
}
成功:
但是拦截器那个没有成功
明天计划的事情
完善剩下的
昨晚遇到的问题:AlipayUtil是作为Component注入的,但是无法Autowired,甚至无法import
刚刚又试了一下好了…莫名其妙
spring boot 配置bean:
@Bean 的用法
@Bean 是一个方法级别上的注解,主要用在 @Configuration 注解的类里,也可以用在 @Component 注解的类里。添加的 bean 的 id 为方法名
@Configuration
public class AliPayConfig {
//支付宝网关
@Value("${AliPayConfig.url}")
private String url;
// 应用ID
@Value("${AliPayConfig.app_id}")
private String app_id;
// 商户私钥
@Value("${AliPayConfig.merchant_private_key}")
private String merchant_private_key;
//参数返回格式
@Value("${AliPayConfig.format}")
private String format;
// 字符编码格式
@Value("${AliPayConfig.charset}")
private String charset;
// 支付宝公钥
@Value("${AliPayConfig.alipay_public_key}")
private String alipay_public_key;
//商户生成签名字符串所使用的签名算法类型
@Value("${AliPayConfig.sign_type}")
private String sign_type;
@Bean("alipayClient")
public AlipayClient alipayClientBean() {
return new DefaultAlipayClient(url, app_id, merchant_private_key, format, charset, alipay_public_key, sign_type);
}
}
还可以指定作用域:
@Bean("alipayClient")
@Scope("singleton")
public AlipayClient alipayClientBean() {
return new DefaultAlipayClient(url, app_id, merchant_private_key, format, charset, alipay_public_key, sign_type);
}
还有spring boot 如何自定义过滤器:
添加WebFilter注解
@WebFilter(urlPatterns = "/*", filterName = "myfilter")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter初始化中");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("开始进行过滤处理");
//调用该方法后,表示过滤器经过原来的url请求处理方法
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("Filter销毁中");
}
}
启动类加上这个注解:
@ServletComponentScan
就好了
拦截器的话代码在上面,我讲一下步骤
1. 创建自定义的拦截器并实现HandlerInterceptor接口;
2. 创建一个java类继承WebMvcConfiguraeAdapter并重写addInterceptor方法,该类用来添加配置拦截器:
3. 编写一个Controller控制类用于处理url请求,因为拦截器只能拦截SpringMVC的Controller控制器处理的请求:
聚金融里面能不能不用富友支付了?这个感觉学了也没用,要不就用支付宝代替了?
评论