Springboot+Vue整合支付宝沙箱模拟支付以及退款(支持部分退款)

Springboot+Vue整合支付宝沙箱模拟支付以及退款

第一步打开支付宝开放平台并登录

支付宝开放平台

查看AppId 应用公钥 应用私钥 支付宝公钥
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第二步准备内网穿透工具

内网穿透工具是将本地的服务映射到公网上面,因为支付宝在支付成功后会回调本地的方法,自己可以在这个方法当中编写支付成功后的逻辑。

https://natapp.cn/login natapp内网穿透地址,注册登录后购买免费隧道

在这里插入图片描述

在我的隧道当中进行配置

在这里插入图片描述

修改项目的端口号 自己本地的项目在哪个端口就配置哪个端口,我的项目是9090端口,所以这边我配置的就是9090端口

在这里插入图片描述

根据自己的电脑下载对应的客户端

在这里插入图片描述

解压后创建一个satrt.bat

natapp.exe -authtoken=你自己隧道的token

在这里插入图片描述
双击启动后就可以看到穿透的url,将这个url配置到application.yml当中即可

第三步编写后端代码

引入依赖
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.35.79.ALL</version>
</dependency>
配置application.yml
alipay:
  appId: 
  #应用私钥
  appPrivateKey: 
  #应用公钥
  appPublicKey: 
  #支付宝公钥
  alipayPublicKey: 
  #启动nata内网穿透后命令提示框中的http地址,上面启动后保留的地址
  notifyUrl: http://tzqse7.natappfree.cc/policy/notify

注意appId、应用私钥、应用公钥、支付宝公钥均要与自己的对应,notifyUrl是在支付成功后支付宝回调的url,使用内网穿透的地址拼接自己项目当中的地址

AliPayConfig.java
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {
    private String appId;
    private String appPrivateKey;
    private String alipayPublicKey;
    private String notifyUrl;
    private String appPublicKey;
}

付款代码、退款、回调代码

//付款
@GetMapping("/pay")
public void pay(String orderNumber, HttpServletResponse httpServletResponse) throws IOException {
    //查询保单信息   这个地方换成自己的业务逻辑
    LambdaQueryWrapper<InsurancePolicyEntity> insurancePolicyLambdaQueryWrapper = new LambdaQueryWrapper<>();
    insurancePolicyLambdaQueryWrapper.eq(InsurancePolicyEntity::getOrderNumber, orderNumber);
    InsurancePolicyEntity insurancePolicyEntity = insurancePolicyService.getOne(insurancePolicyLambdaQueryWrapper);

    //创建Client,调用通用SDK提到的Client,用来调用支付宝的API  固定
    AlipayClient alipayClient = new DefaultAlipayClient(GAETWAY_URL, aliPayConfig.getAppId(), aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAppPublicKey(), SIGN_TYPE);
 
    //创建Request并设置参数   固定参数,要传递其他参数可去查阅帮助文档
    AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
    request.setNotifyUrl(aliPayConfig.getNotifyUrl());
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("out_trade_no", insurancePolicyEntity.getOrderNumber());
    jsonObject.put("total_amount", insurancePolicyEntity.getAmount());
    jsonObject.put("subject", insurancePolicyEntity.getProductName());
    jsonObject.put("product_code", "FAST_INSTANT_TRADE_PAY");
    request.setBizContent(jsonObject.toString());
    //支付成功后前端跳转的url
    request.setReturnUrl("http://localhost:90/#/mall");

    String form = "";
    try {
        form = alipayClient.pageExecute(request).getBody();
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    httpServletResponse.setContentType("text/html;charset="+CHARSET);
    httpServletResponse.getWriter().write(form);
    httpServletResponse.getWriter().flush();
    httpServletResponse.getWriter().close();
}

//支付成功回调
    @PostMapping("/notify")
    public void payNotify(HttpServletRequest request) throws AlipayApiException {
        if ("TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
            System.out.println("支付宝异步回调");
            HashMap<String, String> params = new HashMap<>();
            Map<String, String[]> parameterMap = request.getParameterMap();
            for (String name : parameterMap.keySet()) {
                params.put(name, request.getParameter(name));
            }

            OrderInfoEntity orderInfoEntity = new OrderInfoEntity();
            orderInfoEntity.setSubject(params.get("subject"));
            orderInfoEntity.setTradeStatus(params.get("trade_status"));
            orderInfoEntity.setTradeNo(params.get("trade_no"));
            orderInfoEntity.setOutTradeNo(params.get("out_trade_no"));
            orderInfoEntity.setTotalAmount(params.get("total_amount"));
            orderInfoEntity.setBuyerId(params.get("buyer_id"));
            orderInfoEntity.setGmtPayment(params.get("gmt_payment"));
            orderInfoEntity.setBuyerPayAmount(params.get("buyer_pay_amount"));
            String refundAmount = params.get("refund_fee");
            if ("".equals(refundAmount) || refundAmount == null) {
                //退款与付款回调同一个函数,所以在这判断是否存在退款金额,此处用来处理退款后业务逻辑
            }
        }
    }

@GetMapping("/refund")
    public AjaxResult refund(String orderNumber,String refundAmount) throws IOException, AlipayApiException {
        //获取保单信息
        LambdaQueryWrapper<InsurancePolicyEntity> insurancePolicyEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
        insurancePolicyEntityLambdaQueryWrapper.eq(InsurancePolicyEntity::getOrderNumber, orderNumber);
        InsurancePolicyEntity insurancePolicyEntity = insurancePolicyService.getOne(insurancePolicyEntityLambdaQueryWrapper);

        //查询订单信息
        LambdaQueryWrapper<OrderInfoEntity> orderInfoEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
        orderInfoEntityLambdaQueryWrapper.eq(OrderInfoEntity::getOutTradeNo, insurancePolicyEntity.getOrderNumber());
        OrderInfoEntity orderInfoEntity = orderInfoService.getOne(orderInfoEntityLambdaQueryWrapper);


        //创建Client,调用通用SDK提到的Client,用来调用支付宝的API
        AlipayClient alipayClient = new DefaultAlipayClient(GAETWAY_URL, aliPayConfig.getAppId(), aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);


        //创建Request并设置参数
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("out_trade_no", insurancePolicyEntity.getOrderNumber());  //我的单号
        jsonObject.put("refund_amount", refundAmount);//订单金额
        jsonObject.put("trade_no", orderInfoEntity.getTradeNo());//支付宝本身的订单流水号
        jsonObject.put("out_request_no", UUIDGenerator.generateId());   //这个参数需要注意,如果想要实现部分退款逻辑这个参数是必须的
        request.setBizContent(jsonObject.toString());
        request.setBizContent(jsonObject.toJSONString());
        //执行请求
        AlipayTradeRefundResponse response = alipayClient.execute(request);
        if(response.isSuccess()){
            System.out.println("退款成功:"+refundAmount);
            //这里用来编写退款成功后的业务逻辑
    }

前端请求付款退款

前端调用付款注意必须使用window.open来进行调用,后面根据自己的业务逻辑传递参数即可

window.open('http://localhost:9090/policy/pay?orderNumber=' + res.data);

退款直接调用就可以,参数也是看具体的业务逻辑

return request(
    '/api/policy/refund?orderNumber='+data.orderNumber+'&refundAmount='+data.refundAmount,
    METHOD.GET,
)

如有任何疑问加Q771828475 免费帮忙解答

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Spring BootVue.js应用程序中的支付宝沙箱支付代码示例: 在Spring Boot项目中: 1. 添加以下依赖: ``` <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.3.0.ALL</version> </dependency> ``` 2. 创建一个包含支付宝配置信息的类,例如: ``` @Configuration public class AlipayConfig { private String appId; private String privateKey; private String publicKey; private String notifyUrl; private String returnUrl; private String gatewayUrl; // getters and setters } ``` 3. 创建一个返回AlipayClient的方法: ``` @Bean public AlipayClient getAlipayClient() { return new DefaultAlipayClient( alipayConfig.getGatewayUrl(), alipayConfig.getAppId(), alipayConfig.getPrivateKey(), "json", "UTF-8", alipayConfig.getPublicKey(), "RSA2" ); } ``` 4. 在控制器中创建支付接口,例如: ``` @Autowired private AlipayClient alipayClient; @Autowired private AlipayConfig alipayConfig; @PostMapping("/pay") public String pay(@RequestParam String orderNo, @RequestParam String amount) throws AlipayApiException { AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(alipayConfig.getReturnUrl()); alipayRequest.setNotifyUrl(alipayConfig.getNotifyUrl()); alipayRequest.setBizContent("{\"out_trade_no\":\"" + orderNo + "\"," + "\"total_amount\":\"" + amount + "\"," + "\"subject\":\"" + "测试订单" + "\"," + "\"body\":\"" + "测试订单" + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); String form = alipayClient.pageExecute(alipayRequest).getBody(); return form; } ``` 在Vue.js中: 1. 创建一个按钮来启动支付流程: ``` <template> <div> <button @click="pay">Pay Now</button> </div> </template> ``` 2. 在脚本部分中创建一个调用支付接口的方法: ``` <script> export default { methods: { pay() { axios.post('/api/pay', { orderNo: '123456', amount: '0.01' }) .then(response => { let form = response.data; document.write(form); // 打开支付页面 }) .catch(error => { console.log(error); }); } } } </script> ``` 请注意,以上示例只适用于测试环境,如果您想在生产环境中使用支付宝支付,您需要进行更多的测试和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值