我想的是通过点击支付按钮调用pay函数,我想请问下点击之后没能跳转是怎么回事,添加了一条打印信息,发现控制类的pay函数都没有执行,请问这是怎么回事呢
pay() {
window.open('http://localhost:8080/alipay/pay?oid=' + this.payOrderId)
},
这是我的支付宝控制类的代码:
package com.movie.api.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.movie.api.config.AlipayConfig;
import com.movie.api.model.entity.Order;
import com.movie.api.service.OrderService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
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 {
//在提供的代码中,并没有直接引用支付宝开发工具(如支付宝SDK)来处理支付流程。相反,这段代码使用了Spring框架和Alipay的HTTP API来实现支付功能。
//具体来说,AlipayController 类中的 pay 方法使用了一个HTTP GET请求到/alipay/pay端点,并通过Spring的@GetMapping注解进行了映射。这个方法通过后端服务OrderService获取订单信息,然后构建了一个AlipayTradePagePayRequest对象来封装请求参数,并通过支付宝沙箱网关地址发送这个请求。
//当支付状态异步回调时(即用户完成支付后支付宝服务器向前端服务器发送通知),会调用AlipayController类中的payNotify方法,这也是一个HTTP POST请求到/alipay/notify端点,并且用@PostMapping注解映射。这个方法解析了来自支付宝的异步通知,并根据交易状态更新订单状态。
//总结来说,这段代码没有直接使用支付宝的开发工具SDK,而是利用了支付宝提供的HTTP API来完成支付流程和处理支付结果。这种方式可能更加灵活,因为它允许开发者通过HTTP客户端(如Java的HttpClient库)来与支付宝API进行交互,而不需要集成支付宝的SDK。
@Value("${alipay.appId}")
private String appId;
@Value("${alipay.appPrivateKey}")
private String privateKey;
@Value("${alipay.alipayPublicKey}")
private String publicKey;
@Value("${alipay.notifyUrl}")
private String notifyUrl;
// 支付宝沙箱网关地址
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 OrderService orderService;
@GetMapping("/pay")
public void pay(String oid,HttpServletResponse httpResponse) throws Exception {
//查询订单信息
System.out.println("哈哈哈哈哈哈:");
Order order = orderService.selectByOrderID(oid);
if(order==null) return;
//1. 创建CLinet,通过SDK提供的Client,负责调用支付宝的API
// AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, alipayConfig.getAppId(),
// alipayConfig.getAppPrivateKey(), FORMAT, CHARSET, alipayConfig.getAppPublicKey(), SIGN_TYPE);
AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, appId, privateKey, FORMAT, CHARSET, publicKey, SIGN_TYPE);
//2. 创建Request并设置Request参数 用于封装支付请求的参数
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); //发送请求的类
//request.setNotifyUrl(alipayConfig.getNotifyUrl());
request.setNotifyUrl(notifyUrl);
JSONObject bizContent = new JSONObject(); //设置了支付成功后的通知URL,这是支付宝服务器在支付成功后会回调的地址
bizContent.put("out_trade_no", order.getId()); //订单编号
bizContent.put("total_amount", order.getPrice()); //订单总金额
bizContent.put("subject", order.getPhone()); //支付订单的手机号
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");//这一行代码向JSON对象中添加了产品码,表示这次支付是即时交易类型。
request.setBizContent(bizContent.toString());
request.setReturnUrl("http://localhost:8080/me/order"); //支付成功返回至订单界面
//执行请求,拿到响应的结果,返回浏览器
String form = "";
try {
form = alipayClient.pageExecute(request).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
//设置响应的内容类型和字符集,并将请求结果写入HttpServletResponse对象。最后关闭输出流。
httpResponse.setContentType("text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form);
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
@PostMapping("/notify") // 注意这里必须是POST接口
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.getAppPublicKey(),"UTF-8");
//支付宝验证
if(checkSignature){
//输出一些支付信息
System.out.println("交易金额"+params.get("total_amount"));
String oid = params.get("out_trade_no");
Order order = orderService.selectByOrderID(oid);
order.setStatus(2);
}
}
}
}