0


支付宝沙箱--模拟支付(springboot)

1.支付宝沙箱是支付宝提供的一个模拟环境,它允许开发者在不会影响到真实支付宝账户和资金的情况下,测试支付宝的各种接口和功能。

首先展示一些支付效果,这里是一个订单页面,在点击支付按钮之后实现支付宝模拟支付。

点击之后跳出支付宝支付框,在这里登录自己的支付宝沙箱账号和自己的支付密码。

之后跳到另一个页面,输入自己的支付密码

输入完支付密码后支付完成的效果如下

之后跳回到自己的订单页面,可以发现订单状态更变为已支付。

以上就是完整的沙箱的完整演示效果,接下来带你手把手实现这样的功能。

1.首先我们要注册属于自己的沙箱账号并且在springboot中配置,登录 - 支付宝,这个网址可以注册自己的沙箱账号。

2.配置沙箱环境(springboot),在pom.xml中添加相关依赖

<!--        支付宝沙箱-->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.35.79.ALL</version>
        </dependency>
<!--        cn-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.14</version>
        </dependency>

3.在application.yml中配置支付宝(Alipay)的SDK配置,用于与支付宝的API进行交互。

  • appId: 这是支付宝分配给开发者的应用ID,用于标识接入支付宝的应用。
  • appPrivateKey: 应用私钥,用于生成签名和验证支付宝返回的签名,确保数据传输的安全性。
  • alipayPublicKey: 支付宝的公钥,开发者用它来验证支付宝服务器发送的签名数据。
  • notifyUrl: 这是支付宝服务器在交易完成后向您的服务器发送通知的URL。这个URL必须提供可访问的公网地址,支付宝才能成功发送通知。

appId:使用自己的支付宝

appPrivateKey私钥:

alipayPublicKey公钥:

然后就是在配置文件中创建配置类AliPayConfig.java

package com.example.demo.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix ="alipay")
public class AliPayConfig {
    private String appId;
    private String appPrivateKey; // 属性名与getters/setters保持一致
    private String alipayPublicKey;
    private String notifyUrl; // 属性名与Java命名规范一致

    // appId 的 getters 和 setters
    public String getAppId() {
        return appId;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    // appPrivateKey 的 getters 和 setters
    public String getAppPrivateKey() {
        return appPrivateKey;
    }

    public void setAppPrivateKey(String appPrivateKey) {
        this.appPrivateKey = appPrivateKey;
    }

    // alipayPublickey 的 getters 和 setters
    public String getAlipayPublicKey() {
        return alipayPublicKey;
    }

    public void setAlipayPublicKey(String alipayPublicKey) {
        this.alipayPublicKey = alipayPublicKey;
    }

    // notifyUrl 的 getters 和 setters
    public String getNotifyUrl() {
        return notifyUrl;
    }

    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }
}

4.创建AliPayController

package com.example.demo.controller;

import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.example.demo.config.AliPayConfig;
import com.example.demo.entity.Orders;
import com.example.demo.service.OrdersService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

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

@RestController
@RequestMapping("/alipay")
public class AlipayController {
    // 支付宝沙箱网关地址

    //    private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
    private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
    private static final String FORMAT = "JSON";

    private static final String CHARSET = "UTF-8";

    private static final String SIGN_TYPE = "RSA2";

    @Resource
    private AliPayConfig alipayConfig;
    @Resource
    private OrdersService ordersService;

    private static final Logger logger = LoggerFactory.getLogger(AlipayController.class);

    @GetMapping("/pay")
    public void pay( @RequestParam  String trackingNumber, HttpServletResponse httpResponse) throws Exception{
        Orders orders = ordersService.getOrdersByTrackingNumber(trackingNumber);
        if (orders == null){
            return;
        }
        //1.创建Client,通用SDK提供的Client,负责调用支付宝的API
        AlipayClient alipayClient= new DefaultAlipayClient(GATEWAY_URL, alipayConfig.getAppId(),
                alipayConfig.getAppPrivateKey(),FORMAT,CHARSET,alipayConfig.getAlipayPublicKey(),SIGN_TYPE);
        //2.创建Request并设置Request参数
        AlipayTradePagePayRequest request=new AlipayTradePagePayRequest();
        request.setNotifyUrl(alipayConfig.getNotifyUrl());
        JSONObject bizContent=new JSONObject();
        bizContent.set("out_trade_no",orders.getTrackingNumber());
        bizContent.set("total_amount",orders.getTotalAmount());
        bizContent.set("subject",orders.getProductsJson());
        bizContent.set("product_code","FAST_INSTANT_TRADE_PAY");
        request.setBizContent(bizContent.toString());
        request.setReturnUrl("http://localhost:8080/front/Order");

        String form="";
        try {
            form=alipayClient.pageExecute(request).getBody();
        }catch (AlipayApiException e){
            e.printStackTrace();
        }
        httpResponse.setContentType("text/html;charset=" +CHARSET);
        httpResponse.getWriter().write(form);
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();
    }
    @PostMapping("/notify")
    public  void payNotify(HttpServletRequest request) throws Exception{
        if(request.getParameter("trade_status").equals("TRADE_SUCCESS")){
            System.out.println("======支付宝异步回调======");
            Map<String,String> params =new HashMap<>();
            Map<String,String[]>requestParams =request.getParameterMap();
            for (String name:requestParams.keySet()){
                params.put(name,request.getParameter(name));
            }
            String sign=params.get("sign");
            String content = AlipaySignature.getSignCheckContentV1(params);
            boolean checkSignature =AlipaySignature.rsa256CheckContent(content,sign,alipayConfig.getAlipayPublicKey(),"UTF-8");
            if (checkSignature){
                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"));
                String trackingNumber =params.get("out_trade_no");
//            String payment =params.get("gmt_payment");
                String alipayTradeNo =params.get("trade_no");
                Orders orders=ordersService.getOrdersByTrackingNumber(trackingNumber);
                orders.setPayStatus("已支付");
//            orders.setOrderDate(payment);
//
                ordersService.updateOrder(orders);
            }
        }
    }
}

5.然后就是在前端自己去调用这两个方法

6.下载一个内网穿透NATAPP,NATAPP是一个内网穿透工具,它允许用户将内网中的服务映射到公网上,使得外部可以访问。下载完成后创建一个start.bat文件,编辑内容将authtoken换成自己的。

每次支付时要记得启动start.bat文件更换一些内网穿透的网址到自己的application文件中

标签: spring boot java spring

本文转载自: https://blog.csdn.net/weixin_63775234/article/details/139799945
版权归原作者 例外833 所有, 如有侵权,请联系我们删除。

“支付宝沙箱--模拟支付(springboot)”的评论:

还没有评论