当前位置:首页 > 工具 > 正文内容

支付宝沙箱环境支付集成

访客 工具 2026年9月19日 11

前置准备

在开始之前,需要完成以下准备工作:

  1. 注册沙箱支付宝账号,并获取到对应的商家信息和买家信息。
  2. 为了测试回调接口,下载并配置 natapp 工具。完成实名认证后,购买免费隧道服务,将本地端口映射到公网地址(此端口为后端服务器运行的端口)。启动命令示例:natapp.exe -authtoken=xxxx。

后端实现

1. 添加依赖

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-easysdk</artifactId>
    <version>2.2.3</version>
</dependency>
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.22.110.ALL</version>
</dependency>

2. 配置文件

在 application.yml 中添加以下内容:

alipay:
  appId: xxx
  privateKey: xxx
  publicKey: xxx
  notifyUrl: http://your-public-url/notify
  returnUrl: http://localhost:8080/return
  gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
  format: JSON
  charset: UTF-8
  signType: RSA2

3. 配置类

创建一个用于加载配置的类:

@Component
@ConfigurationProperties(prefix = "alipay")
@Data
public class AlipayConfig {
    private String appId;
    private String privateKey;
    private String publicKey;
    private String gatewayUrl;
    private String notifyUrl;
    private String returnUrl;
    private String format;
    private String charset;
    private String signType;
}

4. 初始化客户端

通过 Spring 的 @Configuration 注解初始化 AlipayClient:

@Configuration
public class AlipayClientConfig {

    @Bean
    public AlipayClient alipayClient(AlipayConfig config) {
        return new DefaultAlipayClient(
            config.getGatewayUrl(),
            config.getAppId(),
            config.getPrivateKey(),
            config.getFormat(),
            config.getCharset(),
            config.getPublicKey(),
            config.getSignType()
        );
    }
}

5. 控制器与服务实现

以下是支付接口与回调处理的实现:

@RestController
@RequestMapping("/payment")
public class PaymentController {

    @Autowired
    private PaymentService paymentService;

    @PostMapping("/pay")
    public ResponseEntity<String> pay(@RequestBody PaymentRequest request) throws Exception {
        String formHtml = paymentService.createPayment(request);
        return ResponseEntity.ok(formHtml);
    }

    @PostMapping("/notify")
    public ResponseEntity<String> notify(HttpServletRequest request) {
        try {
            Map<String, String> params = parseRequestParams(request);
            if (params.isEmpty()) {
                return ResponseEntity.badRequest().body("failure");
            }
            String result = paymentService.handleNotify(params);
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("failure");
        }
    }

    private Map<String, String> parseRequestParams(HttpServletRequest request) {
        Map<String, String> params = new HashMap<>();
        request.getParameterMap().forEach((key, values) -> {
            if (values.length > 0) {
                params.put(key, values[0]);
            }
        });
        return params;
    }
}

@Service
public class PaymentServiceImpl implements PaymentService {

    @Autowired
    private AlipayClient alipayClient;

    @Autowired
    private AlipayConfig alipayConfig;

    public String createPayment(PaymentRequest request) {
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", request.getOrderNo());
        bizContent.put("total_amount", request.getAmount());
        bizContent.put("subject", request.getSubject());

        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(alipayConfig.getReturnUrl());
        alipayRequest.setNotifyUrl(alipayConfig.getNotifyUrl());
        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
        alipayRequest.setBizContent(bizContent.toString());

        try {
            return alipayClient.pageExecute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            throw new RuntimeException("支付请求生成失败", e);
        }
    }

    @Override
    public String handleNotify(Map<String, String> params) {
        boolean isValid = verifySignature(params);
        if (!isValid) {
            return "fail";
        }
        // 处理业务逻辑,如更新订单状态等
        System.out.println("Order ID: " + params.get("out_trade_no"));
        return "success";
    }

    private boolean verifySignature(Map<String, String> params) {
        try {
            return AlipaySignature.rsaCheckV1(
                params,
                alipayConfig.getPublicKey(),
                alipayConfig.getCharset(),
                alipayConfig.getSignType()
            );
        } catch (AlipayApiException e) {
            throw new RuntimeException("签名验证失败", e);
        }
    }
}

6. 安全配置

确保支付相关接口不受安全限制:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/payment/**", "/notify").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin().disable()
            .httpBasic().disable();
    }
}

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

企业级 Oracle 数据库部署与初始化实战

系统环境规划与前置条件检查 在着手部署 Oracle RDBMS 之前,必须对底层基础设施进行严格评估。该企业级关系型数据库管理系统常用于处理高并发业务逻辑,因此对计算资源、存储 I/O 及网络稳定性有较高标准。 1. 资源规格定义 为确保实例稳定运行,建议满足以下基准配置: 计算单元:双核或以上处理器,主频不低于 2.0GHz。 内存容量:物理内存至少 2GB,生产环境建议扩容至 4GB 以...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。