package com.ruoyi.database.service; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradeCreateRequest; import com.alipay.api.response.AlipayTradeCreateResponse; import com.ruoyi.config.AlipayConfig; import org.springframework.stereotype.Service; @Service public class AlipayService { private final AlipayConfig alipayConfig; public AlipayService(AlipayConfig alipayConfig) { this.alipayConfig = alipayConfig; } /** * 创建支付宝小程序支付订单 * * @param orderId 商户订单号 * @param amount 支付金额(单位:元) * @param subject 订单标题 * @param buyerId 支付宝用户ID(相当于OpenID) * @return 支付订单字符串,用于小程序前端调起支付 */ public String createOrder(String orderId, String amount, String subject, String buyerId) { try { // 1. 创建AlipayClient实例 AlipayClient alipayClient = new DefaultAlipayClient( alipayConfig.gateway, alipayConfig.appId, alipayConfig.privateKey, "json", "UTF-8", alipayConfig.alipayPublicKey, "RSA2" ); // 2. 创建API请求对象,设置请求参数 AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); request.setNotifyUrl(alipayConfig.notifyUrl); // 3. 组装业务参数 String bizContent = "{" + "\"out_trade_no\":\"" + orderId + "\"," + "\"total_amount\":\"" + amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"buyer_id\":\"" + buyerId + "\"," + "\"product_code\":\"JSAPI_PAY\"" + // 小程序场景固定值 "}"; request.setBizContent(bizContent); // 4. 调用支付宝接口 AlipayTradeCreateResponse response = alipayClient.execute(request); // 5. 处理响应 if (response.isSuccess()) { System.out.println("支付宝预下单成功,交易号: " + response.getTradeNo()); // 返回给前端的订单字符串,用于调起支付 return response.getOutTradeNo(); // 注意:在实际开发中,你可能需要返回一个包含更多信息的对象或重新构造一个支付参数字符串。 // 具体返回格式需与前端调用 my.tradePay 时所需的参数保持一致。 } else { System.err.println("支付宝预下单失败: " + response.getMsg() + " - " + response.getSubMsg()); throw new RuntimeException("支付宝预下单失败"); } } catch (Exception e) { throw new RuntimeException("调用支付宝接口异常", e); } } }