springboot实现支付宝沙箱支付

简单几步实现商城订单支付!!!!

springboot实现支付宝沙箱支付_第1张图片

首先,在我们的pom.xml里面引入依赖 springboot实现支付宝沙箱支付_第2张图片


        
            com.alipay.sdk
            alipay-easysdk
            2.2.0
        


        
            cn.hutool
            hutool-all
            5.7.20
        
        
            org.apache.poi
            poi-ooxml
            4.1.2
        

依次导入我们需要的编码,编码用到Lombok简化了代码

springboot实现支付宝沙箱支付_第3张图片

        
            org.projectlombok
            lombok
            true
        

 下面是我们的文件位置

springboot实现支付宝沙箱支付_第4张图片

 1.新建一个AlipayConfig.java

springboot实现支付宝沙箱支付_第5张图片

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {
    private String appId;
    private String appPrivateKey;
    private String alipayPublicKey;
    private String notifyUrl;


    @PostConstruct
    public void init() {
        // 设置参数(全局只需设置一次)
        Config config = new Config();
        config.protocol = "https";
        config.gatewayHost = "openapi.alipaydev.com";
        config.signType = "RSA2";
        config.appId = this.appId;
        config.merchantPrivateKey = this.appPrivateKey;
        config.alipayPublicKey = this.alipayPublicKey;
        config.notifyUrl = this.notifyUrl;
        Factory.setOptions(config);
        System.out.println("=======支付宝SDK初始化成功=======");
    }

}

 2.放入我们的alipay实体类

springboot实现支付宝沙箱支付_第6张图片

import lombok.Data;

@Data
public class AliPay {
    private String traceNo;
    private String totalAmount;
    private String subject;
//    private String alipayTraceNo;
}

 3.然后是我们的控制层Controller

springboot实现支付宝沙箱支付_第7张图片

 springboot实现支付宝沙箱支付_第8张图片

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.example.demo.controller.dto.AliPay;
import com.example.demo.mapper.OrdersMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/alipay")
public class AliPayController {

    @Resource
    private OrdersMapper ordersMapper;


    @GetMapping("/pay") // &subject=xxx&traceNo=xxx&totalAmount=xxx
    public String pay(AliPay aliPay) {
        AlipayTradePagePayResponse response;
        try {
            //  发起API调用(以创建当面付收款二维码为例)
            response = Factory.Payment.Page()
                    .pay(aliPay.getSubject(), aliPay.getTraceNo(), aliPay.getTotalAmount(), "");
        } catch (Exception e) {
            System.err.println("调用遭遇异常,原因:" + e.getMessage());
            throw new RuntimeException(e.getMessage(), e);
        }
        return response.getBody();
    }


    @PostMapping("/notify")  // 注意这里必须是POST接口
    public String payNotify(HttpServletRequest request) throws Exception {
        if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
            System.out.println("=========支付宝异步回调========");

            Map params = new HashMap<>();
            Map requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                params.put(name, request.getParameter(name));
                // System.out.println(name + " = " + request.getParameter(name));
            }

            String tradeNo = params.get("out_trade_no");
            String gmtPayment = params.get("gmt_payment");
            String alipayTradeNo = params.get("trade_no");
            // 支付宝验签
            if (Factory.Payment.Common().verifyNotify(params)) {
                // 验签通过
                System.out.println("交易名称: " + params.get("subject"));
                System.out.println("交易状态: " + params.get("trade_status"));
                System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
                System.out.println("商户订单号: " + params.get("out_trade_no"));
                System.out.println("交易金额: " + params.get("total_amount"));
                System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
                System.out.println("买家付款时间: " + params.get("gmt_payment"));
                System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
                // 更新订单未已支付
                ordersMapper.updateState(tradeNo, "已支付", gmtPayment, alipayTradeNo);
            }
        }
        return "success";
    }
}

 然后是我们的数据库

订单表:

CREATE TABLE `orders` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL COMMENT '用户ID',
  `alipay_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci DEFAULT NULL COMMENT '支付宝流水号',
  `name` varchar(255) COLLATE utf8mb4_turkish_ci DEFAULT NULL COMMENT '名称',
  `no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci DEFAULT NULL COMMENT '编号',
  `total_price` decimal(10,2) DEFAULT NULL COMMENT '总金额',
  `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci DEFAULT '待付款' COMMENT '状态',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间',
  `pay_time` varchar(255) COLLATE utf8mb4_turkish_ci DEFAULT NULL COMMENT '订单付款时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_turkish_ci;

springboot实现支付宝沙箱支付_第9张图片

 做完这些我们就开始进行支付,在支付之前我们要先到支付宝平台申请一下开放

支付宝开放平台 (alipay.com)

 进入到界面,我们登录然后进行获取

springboot实现支付宝沙箱支付_第10张图片

 springboot实现支付宝沙箱支付_第11张图片

 springboot实现支付宝沙箱支付_第12张图片

 以上内容按照步骤进行就可以,然后是我们的配置application.yml

springboot实现支付宝沙箱支付_第13张图片

springboot实现支付宝沙箱支付_第14张图片

alipay:
  appId: 你的AppId
  appPrivateKey: 应用私钥
  alipayPublicKey: 应用公钥
  notifyUrl: natapp获取

 然后我们还需要一个工具natapp,内网穿透:https://natapp.cn/

springboot实现支付宝沙箱支付_第15张图片

申请一个免费的隧道然后进行配置

 springboot实现支付宝沙箱支付_第16张图片

 本地端口号就是你的后台的端口号,我这里是9090

然后下好工具之后,复制我们的authtoken

springboot实现支付宝沙箱支付_第17张图片

 在外面的bat里面换成我们自己的这个authtoken

 当你看见下面的内容时就说明连接成功了

springboot实现支付宝沙箱支付_第18张图片

 然后将我们的这个http放入刚刚的配置里面

记住,一定要加上/alipay/notify !!!!!!!!!!!!!!!!!

然后我们就配置成功了,就可以进行支付

前台页面





 核心代码:进行调用我们的支付宝沙箱支付接口

pay(row) {
      // window.open('http://localhost:9090/alipay/pay?subject=${row.name}&traceNo=${row.no}&totalAmount=${row.totalPrice}');
      window.open("http://localhost:9090/alipay/pay?subject=" + row.name + "&traceNo=" + row.no + "&totalAmount=" + row.totalPrice)
      this.load()
    },

然后我们访问URL进行测试,测试的url格式:http://localhost:9090/alipay/pay?subject=商品名称&traceNo=一个订单号&totalAmount=1000(totalAmount为订单支付价格)

springboot实现支付宝沙箱支付_第19张图片

 如何我们的账号在我们的页面有提供

springboot实现支付宝沙箱支付_第20张图片

 输入账号和密码就可以进行付款了

springboot实现支付宝沙箱支付_第21张图片

 springboot实现支付宝沙箱支付_第22张图片

 然后我们就可以看见有一个接口回调:

springboot实现支付宝沙箱支付_第23张图片

代码回调在我们的Controller里面有:

@PostMapping("/notify")  // 注意这里必须是POST接口
    public String payNotify(HttpServletRequest request) throws Exception {
        if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
            System.out.println("=========支付宝异步回调========");

            Map params = new HashMap<>();
            Map requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                params.put(name, request.getParameter(name));
                // System.out.println(name + " = " + request.getParameter(name));
            }

            String tradeNo = params.get("out_trade_no");
            String gmtPayment = params.get("gmt_payment");
            String alipayTradeNo = params.get("trade_no");
            // 支付宝验签
            if (Factory.Payment.Common().verifyNotify(params)) {
                // 验签通过
                System.out.println("交易名称: " + params.get("subject"));
                System.out.println("交易状态: " + params.get("trade_status"));
                System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
                System.out.println("商户订单号: " + params.get("out_trade_no"));
                System.out.println("交易金额: " + params.get("total_amount"));
                System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
                System.out.println("买家付款时间: " + params.get("gmt_payment"));
                System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
                // 更新订单未已支付
                ordersMapper.updateState(tradeNo, "已支付", gmtPayment, alipayTradeNo);
            }
        }
        return "success";
    }

 最后在我们的数据库就可以看见信息了

 然后我们的前台页面也可以看见信息

用户:

springboot实现支付宝沙箱支付_第24张图片

 然后用户就可以进行操作啦!!!

管理员:

springboot实现支付宝沙箱支付_第25张图片

就可以进行订单操作,用户也可以看见信息啦!!!!

好了!完结撒花花,以上内容就是我进行支付宝支付的一些方法,有问题的可以私聊我,当然也希望大家在觉得内容不错的时候进行鼓励,关注走起来!!!!

后续也会进行其他的更新哦,敬请期待吧!!!!

你可能感兴趣的:(前后端分离,spring,boot,java,spring)