Springboot整合支付宝支付功能

作者:亚利桑那的天空 时间:2023-07-02 17:38:09 

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;
}

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

来源:https://blog.csdn.net/Mrz_woDeMeng/article/details/105122184

标签:Springboot,支付宝,支付
0
投稿

猜你喜欢

  • C#使用GUID(全局统一标识符)

    2022-08-23 10:25:25
  • 解决Springboot get请求是参数过长的情况

    2023-11-27 16:45:37
  • spring @Validated 注解开发中使用group分组校验的实现

    2021-09-29 14:07:22
  • C# 弹出窗口show()和showdialog()的两种方式

    2022-05-08 17:12:36
  • 如何安装java的运行环境IDEA

    2022-09-20 10:42:38
  • C# IQueryable及IEnumerable区别解析

    2021-11-27 13:46:36
  • JAVA复制数组和重置数组大小操作

    2021-08-29 02:02:41
  • Java面向对象的封装你了解吗

    2023-11-06 16:32:38
  • Struts2拦截器 关于解决登录的问题

    2023-07-02 14:06:09
  • Android LayoutInflater加载布局详解及实例代码

    2021-09-29 04:21:01
  • Java实现把文件及文件夹压缩成zip

    2022-03-30 05:28:45
  • C#中Decimal类型截取保留N位小数并且不进行四舍五入操作

    2022-01-22 20:55:59
  • C#找不到类型名"SqlConnection"的有效解决方法

    2022-05-10 09:47:26
  • C#实现简单的Login窗口实例

    2021-07-18 02:23:29
  • Android studio 出现 Unsupported major.minor version 52.0解决办法

    2023-12-01 18:30:53
  • Java 控制线程的方法

    2022-10-14 15:20:22
  • 通过实例讲解springboot整合WebSocket

    2023-03-07 07:02:03
  • 聊聊@RequestBody和Json之间的关系

    2023-11-27 03:31:45
  • c# 将Datatable数据导出到Excel表格中

    2023-12-26 02:03:53
  • java实现163邮箱发送邮件到qq邮箱成功案例

    2023-09-18 02:38:09
  • asp之家 软件编程 m.aspxhome.com