发表于: 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控制器处理的请求:



聚金融里面能不能不用富友支付了?这个感觉学了也没用,要不就用支付宝代替了?



返回列表 返回列表
评论

    分享到