java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Springboot支付宝支付

Springboot整合支付宝支付功能

作者:亚利桑那的天空

这篇文章主要介绍了Springboot整合支付宝支付功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1.需要的Maven依赖

// 支付宝
<dependency>
   <groupId>com.alipay.sdk</groupId>
   <artifactId>alipay-sdk-java</artifactId>
   <version>4.8.73.ALL</version>
</dependency>

2.controller层

/**
 * 统一下单接口
 * @param orderNo 订单号
 * @param request
 * @return
 */
@PostMapping("/unifiedOrder")
@CrossOrigin(origins = "*",maxAge = 3600)//跨域
public ResultMap unifiedOrder(@RequestParam("orderNo") String orderNo,@RequestParam("payType") Integer payType,
                              HttpServletRequest request){
    try {
        // 1、验证订单是否存在
        // 2、开始微信支付统一下单
        Orders orders = ordersService.FindOrder(orderNo);
        ResultMap resultMap =null;
        if(orders!=null){
           if(payType==1){
               String spbill_create_ip = getIpAddr(request);
               resultMap = wxPayService.unifiedOrder(orders.getOrderNo(),orders.getTotalPrice(),"云App",spbill_create_ip);
               Hotel hotel= hotelMapper.selHotelById(orders.getHId());
               Note note=new Note();
               String s=note.Notefs(hotel.getPhone(),1);
               ordersService.updataorderpaytype(orders.getOrderNo(),payType);
           return resultMap;
           }else if(payType==2){
                // 2、创建支付宝订单
                String orderStr = alipayService.createOrder(orders.getOrderNo(), orders.getTotalPrice(),"App");
               ordersService.updataorderpaytype(orders.getOrderNo(),payType);
                return ResultMap.ok().put("data",orderStr);
           }
        }
      return resultMap;//系统通用的返回结果集
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
        return ResultMap.error("服务器异常,付款失败");
    }


}

//这是支付宝异步回调函数
/**
 * 支付异步通知
 * 接收到异步通知并验签通过后,一定要检查通知内容,
 * 包括通知中的app_id、out_trade_no、total_amount是否与请求中的一致,并根据trade_status进行后续业务处理。
 * https://docs.open.alipay.com/194/103296
 */
@PostMapping("/notify")
@CrossOrigin(origins = "*",maxAge = 3600)//跨域
public String notify(HttpServletRequest request, HttpSession session) {
  // 调用service层rsaCheckV1验证签名
    boolean flag = alipayService.rsaCheckV1(request);
    if (flag) {
         String tradeStatus = request.getParameter("trade_status"); // 交易状态
        String outTradeNo = request.getParameter("out_trade_no"); // 商户订单号
        String tradeNo = request.getParameter("trade_no"); // 支付宝订单号
        /**
         * 还可以从request中获取更多有用的参数,自己尝试
         */
         //调用service层notify函数
        boolean notify = alipayService.notify(tradeStatus, outTradeNo, tradeNo);
        if(notify){
            return "success";
        }
    }
    return "fail";
}

3.service层

private String publicKey="公钥";
    @Override
    public String createOrder(String orderNo, double amount, String body) throws AlipayApiException {
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
    //构造client
        //构造client
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
    //设置网关地址https://openapi.alipay.com/gateway.do
        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用Id
        certAlipayRequest.setAppId("appid");
//设置应用私钥
        certAlipayRequest.setPrivateKey("应用私钥");
        certAlipayRequest.setFormat("json");
//设置字符集
        certAlipayRequest.setCharset("UTF-8");
//设置签名类型
        certAlipayRequest.setSignType("RSA2");
//设置应用公钥证书路径
        certAlipayRequest.setCertPath("证书验证的应用公钥证书路径");
//设置支付宝公钥证书路径
        certAlipayRequest.setAlipayPublicCertPath("证书验证的支付宝公钥证书路径");
//设置支付宝根证书路径
        certAlipayRequest.setRootCertPath("证书验证的支付宝根证书路径");
//构造client
        AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setSubject(body);
        model.setOutTradeNo(orderNo);
        model.setTotalAmount(String.valueOf(amount));
        model.setTimeoutExpress("30m");
        /*model.setTotalAmount("0.01");*/
        model.setProductCode("QUICK_MSECURITY_PAY");
       /* model.setPassbackParams("公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数");*/
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();
        ali_request.setBizModel(model);
        ali_request.setNotifyUrl("回调地址");// 回调地址
        AlipayTradeAppPayResponse ali_response = alipayClient.sdkExecute(ali_request);
        //就是orderString 可以直接给客户端请求,无需再做处理。
        return ali_response.getBody();
    }
//支付宝签名验证
    @Override
    public boolean rsaCheckV1(HttpServletRequest request){
        try {
            //获取支付宝POST过来反馈信息
            Map<String,String> params = new HashMap<String,String>();
            Map requestParams = request.getParameterMap();
            for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
                String name = (String) iter.next();
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                //乱码解决,这段代码在出现乱码时使用。
                //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
                params.put(name, valueStr);
            }
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
            boolean flag = AlipaySignature.rsaCertCheckV1(params, publicKey, alipayConfig.getCharset(),"RSA2");
         /* 千万不要调用错了!!!上面的才是证书验证调用的函数这个是普通验证调用函数  boolean verifyResult = AlipaySignature.rsaCheckV1(params, publicKey, alipayConfig.getCharset(), alipayConfig.getSignType());*/
            System.out.println("flag-----------"+flag);
            return flag;
        }catch (AlipayApiException e) {
            logger.debug("verify sigin error, exception is:{}",e);
            return false;
        }
    }
//notify()支付成功或者失败后一系列操作
@Override
public boolean notify(String tradeStatus, String orderNo, String tradeNo) {
    if ("TRADE_FINISHED".equals(tradeStatus)
            || "TRADE_SUCCESS".equals(tradeStatus)) {
        Orders orders =ordersMapper.FindOrder(orderNo);
        // 支付成功,根据业务逻辑修改相应数据的状态
        int state =ordersMapper.updateOrder(DateUtil.now(),orderNo);
       Hotel hotel= hotelMapper.selHotelById(orders.getHId());
        Note note=new Note();
        String s=note.Notefs(hotel.getPhone(),1);
        // boolean state = orderPaymentService.updatePaymentState(orderNo, tradeNo);
        if (state!=0) {
            return true;
        }else {
         UMember m= memberMapper.selMemByOrderNo(orderNo);
         Boolean b= userMapper.updateVip(m.getOpenId(),2);
        }
    }
    //支付失败查询订单详情得到用户id
    Orders orders=ordersMapper.FindOrder(orderNo);
    //将扣除的积分返还
    if(orderNo!=null){
        //添加用户积分
        ordersMapper.RefundIntegral(orders.getOpenId(),orders.getIntegral());
        /*//添加退回积分记录
        ordersMapper.insIntegralRecord(orders.getOpenId(),orders.getIntegral(),1,2);*/
    }
    return false;
}

哈哈,以上仅为基础版证书验证支付宝支付的源码,有很大的优化空间,需要小伙伴自己去优化了!

到此这篇关于Springboot整合支付宝支付功能的文章就介绍到这了,更多相关Springboot支付宝支付内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文