Springboot支付宝沙箱支付(快速上手)

1.首先加pom文件

 <!--   支付宝支付的依赖     -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.16.2.ALL</version>
        </dependency>      

2.yml

alipay:
  # 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
  app_id: --------
  # 商户私钥,您的PKCS8格式RSA2私钥
  merchant_private_key: 
  # 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
  alipay_public_key: -----
  # 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数 [需外网能访问]
  notify_url:  //要跳转的路径
  # 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数 [需外网能访问]
  return_url:  //要跳转的路径
  # 签名方式
  sign_type: RSA2
  # 字符编码格式
  charset: utf-8
  # 支付宝网关
  gateway_url: https://openapi-sandbox.dl.alipaydev.com/gateway.do //这里小坑,看好沙箱的支付宝官网
  # 日志路径
  log_path: "log/"

3.加入config


/**
 * <p> 支付宝支付-基础配置类 </p>
 *
 * @author liubo
 * @description
 * @date
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "alipay", ignoreUnknownFields = false)
public class AlipayConfigProperty {

    /**
     * 应用ID,
     * <p>
     * 您的APPID,收款账号既是您的APPID对应支付宝账号
     */
    public String app_id;

    /**
     * 商户私钥
     * <p>
     * 您的PKCS8格式RSA2私钥
     */
    public String merchant_private_key;

    /**
     * 支付宝公钥
     * <p>
     * 查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
     */
    public String alipay_public_key;

    /**
     * 服务器异步通知页面路径
     * <p>
     * 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
     */
    public String notify_url;

    /**
     * 页面跳转同步通知页面路径
     * <p>
     * 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
     */
    public String return_url;

    /**
     * 签名方式
     */
    public String sign_type;

    /**
     * 字符编码格式
     */
    public String charset;

    /**
     * 支付宝网关
     */
    public String gatewayUrl;

    /**
     * 日志路径
     */
    public String log_path;

}

3.Controller

/**
     * 支付宝(上线-->只改支付宝的网管)支付
     */
    @GetMapping("/createOrderPayment/{orderSn}") // orderSn --》 订单号
    public Result pay(@PathVariable String orderSn, HttpServletResponse response) {

        log.info("功能名称:[支付],请求URI:[{}],请求方式:[{}],请求参数:[{}]", request.getRequestURI(), request.getMethod(), JSONObject.toJSONString(orderSn));

        orderService.createOrderPayment(orderSn, response);
        Result result = Result.success();

        log.info("功能名称:[支付],请求URI:[{}],请求方式:[{}],响应结果:[{}]", request.getRequestURI(), request.getMethod(), result);

        return result;

    }

4.ServiceImpl

 public void createOrderPayment(String orderSn, HttpServletResponse response) {
        //商户订单号,订单系统唯一个订单号
        Order order = orderMapper.selectOne(new QueryWrapper<Order>().lambda().eq(Order::getOrderSn, orderSn));
        //根据订单号查询订单信息是否存在
        if (order == null) {
            throw new BizException(501, "订单号号不存在");
        }
        //防止出现重复支付问题
        List<OrderInfo> orderInfoList = orderMapper.findByOrderInfoByOrderSn(orderSn);
        if (!CollectionUtils.isEmpty(orderInfoList)) {
            orderInfoList.forEach(c -> {
                if (c.getPaymentStatus().equals("1")) {
                    throw new RuntimeException("订单已支付");
                }
                if (c.getPaymentStatus().equals("0")) {
                    throw new RuntimeException("订单支付中,请稍后重试");
                }
            });
        }
        // 保存一比交易流水
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setOrderSn(orderSn);
        orderInfo.setSubject(order.getOrderDescription());
        orderInfo.setTotalAmount(order.getPaymentAmount());
        orderInfo.setCreateTime(new Date()); // 订单创建时间
        orderInfo.setPaymentStatus(String.valueOf(0)); //0处理中 //1成功 //2失败
        long orderId = IdUtil.getSnowflake(1, 1).nextId();//雪花算法 (交易流水号)
        orderInfo.setOrderId(orderId);// 商户流水号
        orderMapper.addByOrderInfo(orderInfo);

        //防止重复支付
        if (order.getPaymentStatus() == 1) {
            throw new BizException(501, "订单信息已经存在");
        }

        //调用支付宝下单接口
        // 获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfigProperty.gatewayUrl, alipayConfigProperty.app_id, alipayConfigProperty.merchant_private_key, "json", alipayConfigProperty.charset, alipayConfigProperty.alipay_public_key, alipayConfigProperty.sign_type);

        try {
            // 设置请求参数
            AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
            request.setReturnUrl(alipayConfigProperty.return_url);
            request.setNotifyUrl(alipayConfigProperty.notify_url);
            //传值 => 支付宝
            JSONObject bizContent = new JSONObject();
            // 商户订单号,商家自定义,保持唯一性
            bizContent.put("out_trade_no", orderId);
            // 支付的金额
            bizContent.put("total_amount", order.getPaymentAmount());
            // 订单标题,纯文字
            bizContent.put("subject", order.getOrderDescription());
            // 电脑网站支付场景固定传值:FAST_INSTANT_TRADE_PAY
            bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
            request.setBizContent(bizContent.toString());


            // 执行请求,拿到响应的结果,返回给浏览器
            String form = "";
            form = alipayClient.pageExecute(request).getBody();
            //设置响应结果,将返回的内容写出到浏览器
            response.setContentType("text/html;charset=" + alipayConfigProperty.getCharset());
            response.getWriter().write(form);//直接将完整的表单html输出到页面
            response.getWriter().flush();
            response.getWriter().close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

--- sql表

t_order

t_order_info

本代码嵌入了mp 查询的时候可以直接查询可以不使用mp

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值