在写项目中为了功能完善我们经常会用到支付宝,现在用支付宝沙箱模拟
首先导入依赖
<!-- 支付宝支付的依赖 -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.16.2.ALL</version>
</dependency>
进入支付宝沙箱登录 - 支付宝
登录后可以看到应用的基本信息,这里我们以后要用到,点开公钥模式的查看可以看到我们需要的私钥以及公钥
接下来我们构建一个controller
并注入以下配置
@Resource
private UserService userService;
//appid
private final String APP_ID = "。。。。。";
//应用私钥
private final String APP_PRIVATE_KEY = "。。。";
private final String CHARSET = "UTF-8";
// 支付宝公钥
private final String ALIPAY_PUBLIC_KEY = "。。。。";
//这是沙箱接口路径,正式路径为https://openapi.alipay.com/gateway.do
private final String GATEWAY_URL ="。。。。";
private final String FORMAT = "JSON";
//签名方式
private final String SIGN_TYPE = "RSA2";
//支付宝异步通知路径,付款完毕后会异步调用本项目的方法,必须为公网地址
private final String NOTIFY_URL = "http://127.0.0.1/notifyUrl";
//支付宝同步通知路径,也就是当付款完毕后跳转本项目的页面,可以不是公网地址
private final String RETURN_URL = "http://localhost:8080/returnUrl";
为了方便,这里直接在controller里实现接口
//必须加ResponseBody注解,否则spring会寻找thymeleaf页面
@ResponseBody
@RequestMapping("/pay/alipay")
public String alipay(HttpSession session, Model model,
@RequestParam("money") float money,
@RequestParam("id") long id) throws AlipayApiException {
//把dona_id项目id 放在session中
session.setAttribute("user_id",id);
//生成订单号(支付宝的要求?)
String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String user = UUID.randomUUID().toString().replace("-","").toUpperCase();
String OrderNum = time+user;
//调用封装好的方法(给支付宝接口发送请求)
return sendRequestToAlipay(OrderNum,money,"[Kun吧积分充值]");
}
/*
参数1:订单号
参数2:订单金额
参数3:订单名称
*/
//支付宝官方提供的接口
private String sendRequestToAlipay(String outTradeNo,Float totalAmount,String subject) throws AlipayApiException {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL,APP_ID,APP_PRIVATE_KEY,FORMAT,CHARSET,ALIPAY_PUBLIC_KEY,SIGN_TYPE);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(RETURN_URL);
alipayRequest.setNotifyUrl(NOTIFY_URL);
//商品描述(可空)
String body="";
alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\","
+ "\"total_amount\":\"" + totalAmount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"body\":\"" + body + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求
String result = alipayClient.pageExecute(alipayRequest).getBody();
return result;
}
@RequestMapping("/returnUrl")
public String returnUrlMethod(HttpServletRequest request, HttpSession session, Model model) throws AlipayApiException, UnsupportedEncodingException {
System.out.println("=================================同步回调=====================================");
// 获取支付宝GET过来反馈信息
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
System.out.println(params);//查看参数都有哪些
//验证签名(支付宝公钥)
boolean signVerified = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE); // 调用SDK验证签名
//验证签名通过
if(signVerified){
// 商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 支付宝交易流水号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 付款金额
float money = Float.parseFloat(new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8"));
System.out.println("商户订单号="+out_trade_no);
System.out.println("支付宝交易号="+trade_no);
System.out.println("付款金额="+money);
//在这里编写自己的业务代码(对数据库的操作)
Long userId = (Long)session.getAttribute("user_id");
userService.update().setSql("integral=integral+"+money*100).eq("id", userId).update();
//跳转到提示页面(成功或者失败的提示页面)
model.addAttribute("flag",1);
model.addAttribute("msg","支持");
return "index";
}else{
//跳转到提示页面(成功或者失败的提示页面)
model.addAttribute("flag",0);
model.addAttribute("msg","支持");
return "index";
}
}
至此,配置完成
访问
http://localhost:8080/pay/alipay?money=999&id=1664811236571467778
支付成功后会自动跳转至预设的页面,并且数据操作成功