首先去支付宝申请一个 支付宝沙盒进行模拟测试

首先访问支付宝进行登录开放平台
https://open.alipay.com/api

登录以后点击控制台

点击

在这里插入图片描述

APPID就是后面代码需要填写的appid 点击系统默认秘钥的进行启动公钥模式

操作完成以后

在这里插入图片描述

应用私钥 就是后面要填写的商家私钥

支付宝公钥就是后面类里面要写入的公钥
设置以后点击沙盒账号
在这里插入图片描述

1为收款人的账户余额 2为你进行支付的时候填写的账号 3为支付密码 4为支付人的账号余额 可以点击充值 随便写

下面上·代码直接复制 启动就能使用 使用不了找我私信 后续会继续完善此代码 记得点赞收藏加关注噢!!!!!

首先建两个 BO AliPayBean.java 和 refundBean.java 一个用来获取下单 一个用来退款
AliPayBean.java

/**
 * 支付宝支付实体
 * meikongli
 * 2022年12月8日11:41:24
 */
@Data
public class AliPayBean {
    /**
     * 商户订单号
     */
    private String out_trade_no;

    /**
     * 订单名称
     */
    private String subject;

    /**
     * 付款金额
     */
    private String total_amount;

    /**
     * 商品描述
     */
    private String body;

    /**
     * 超时时间参数
     */
    private String timeout_express = "60m";

    /**
     * 产品编号
     */
    private String product_code = "FAST_INSTANT_TRADE_PAY";
}

refundBean.java

/**
 * 支付宝退款实体
 * meikongli
 * 2022年12月8日11:41:24
 */
@Data
public class refundBean {
    /**
     * 商户订单号
     */
    private String out_trade_no;

    /**
     * 支付宝交易号
     */
    private String trade_no;


    /**
     * 支付宝交易状态
     */
    private String trade_status;

    /**
     * 付款金额
     */
    private String total_amount;

}

Service 层 和实现类

/**
 * 支付接口
 * meikongli
 * 2022年12月8日
 */
public interface  PayService {
    //支付接口
    String aliPay(AliPayBean aliPayBean) throws AlipayApiException, AlipayApiException;

    //退款接口
    String refund(refundBean refund) throws AlipayApiException, AlipayApiException;

    /**
     * 交易查询
     * @param outTradeNo 订单编号(唯一)
     */
    String query(String outTradeNo) throws AlipayApiException;

}

实现类

/**
 * 支付服务接口
 * meikongli
 * 2022年12月8日
 */
@Service("payService")
public class PayServiceImpl implements PayService {

    /**日志对象*/
    private static final Logger logger = LoggerFactory.getLogger(PayServiceImpl.class);

    private final String format = "JSON";

    /**
     * appId
     */
//    @Value("${app.appId}")
    private String appId = "202100";

    /**
     * 商户私钥
     */
//    @Value("${app.privateKey}")
    private String privateKey = "xxx";

    /**
     * 支付宝公钥
     */
//    @Value("${app.publicKey}")
    private String publicKey = "xxx";
    /**
     * 服务器异步通知页面路径,需要公网能访问到
     */
//    @Value("${app.notifyUrl}")
    private String notifyUrl ="http://localhost:8080/ali/alpaySuccess";

    /**
     * 服务器同步通知页面路径,需要公网能访问到
     */
//    @Value("${app.returnUrl}")
    private String returnUrl ="http://localhost:8080/ali/alpaySuccess";

    /**
     * 签名方式
     */
//    @Value("${app.signType}")
    private String signType = "RSA2";

    /**
     * 字符编码格式
     */
//    @Value("${app.charset}")
    private String charset = "utf-8";

    /**
     * 支付宝网关
     */
//    @Value("${app.gatewayUrl}")
    private String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

    AlipayClient alipayClient = new DefaultAlipayClient(
            gatewayUrl, appId, privateKey, format, charset, publicKey, signType);
    @Override
    public String aliPay(AliPayBean aliPayBean) throws AlipayApiException {
               /* 订单号:outTradeNo
                订单名称:subject
                付款金额:totalAmount
                商品描述:body*/
        logger.info("调用支付服务接口...");

        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(returnUrl);
        alipayRequest.setNotifyUrl(notifyUrl);
        alipayRequest.setBizContent(JSON.toJSONString(aliPayBean));
        logger.info("封装请求支付宝付款参数为:{}", JSON.toJSONString(alipayRequest));
        alipayRequest.getBizContent();
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        logger.info("请求支付宝付款返回参数为:{}", result);
        return result;
    }

    @Override
    public String refund(refundBean refund) throws AlipayApiException, AlipayApiException {

        //设置请求参数
        AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
        //商户订单号,必填
        String out_trade_no = new String(refund.getOut_trade_no());
        //需要退款的金额,该金额不能大于订单金额,必填
        String refund_amount = new String(refund.getTotal_amount());
        //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
        String out_request_no = new String(UUID.randomUUID().toString());
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"refund_amount\":\""+ refund_amount +"\","
                + "\"out_request_no\":\""+ out_request_no +"\"}");
        //请求
        String result = alipayClient.execute(alipayRequest).getBody();
        return result;
    }


    /**
     * 交易查询--指定
     *
     * @param outTradeNo 订单编号(唯一)
     */
    @Override
    public String query(String outTradeNo) throws AlipayApiException {
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\","
                + "\"trade_no\":\"\"}");
        //转换格式
        String result = alipayClient.execute(alipayRequest).getBody();
        return result;
    }


}

在然后就是Controller

/**
 *支付宝公共接口调用方法
 * meikongli
 * 2022年12月8日
 */
@Controller
@RequestMapping("/ali")
public class OrderController {

    /**日志对象*/
    private static final Logger logger = LoggerFactory.getLogger(OrderController.class);

    @Autowired
    private PayService payService;

    @RequestMapping(value = "/pay", produces = { "text/html;charset=UTF-8" })
    @ResponseBody
    public String alipay(String outTradeNo, String subject, String totalAmount, String body,HttpServletResponse response) throws AlipayApiException {
        logger.info("订单号为{},订单名称为{},付款金额为{},商品描述{}", outTradeNo, subject, totalAmount, body);
        AliPayBean alipayBean = new AliPayBean();
        alipayBean.setOut_trade_no(outTradeNo);
        alipayBean.setSubject(subject);
        alipayBean.setTotal_amount(totalAmount);
        alipayBean.setBody(body);
        return payService.aliPay(alipayBean);
    }


    @RequestMapping(value = "/refund", produces = { "text/html;charset=UTF-8" })
    @ResponseBody
    public String refund(String outTradeNo,String totalAmount,HttpServletResponse response) throws AlipayApiException {
        logger.info("订单号为{},退款金额为{}", outTradeNo, totalAmount);
        String isok = payService.query(outTradeNo);

        refundBean refundbean = new refundBean();
        refundbean.setOut_trade_no(outTradeNo);
        refundbean.setTotal_amount(totalAmount);
        return payService.refund(refundbean);
    }
    @RequestMapping(value = "/query", produces = { "text/html;charset=UTF-8" })
    @ResponseBody
    public String refqueryund(String outTradeNo,HttpServletResponse response) throws AlipayApiException {
        logger.info("订单号为{}", outTradeNo);
        return  payService.query(outTradeNo);
    }




    @RequestMapping(value = "/alpaySuccess", produces = { "text/html;charset=UTF-8" })
    @ResponseBody
    public String alpaySuccess(){
        return "支付成功";
    }



    @RequestMapping(value = "/index")
    public String payCoin(){
        return "index.html";
    }
}

这样就完成啦 后续更换成上线商家的真正数据就行啦 记得点赞关注加收藏!!!!!!!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐