这里采用支付宝沙盒
文档:
一、导入依赖
<!-- 支付宝sdk整合-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.31.12.ALL</version>
</dependency>
二、沙盒案例
手机网站支付 DEMO下载地址:手机网站支付 DEMO - 支付宝文档中心 (alipay.com)
查看配置信息
1.密钥工具下载
2. 配置沙盒 密钥
三、整合使用
1.配置信息
alipay: appid: 9021000134660751 private: key: 应用私钥 public: key: 支付宝公钥 notify: url: http://回调地址(此处无响应未知) return: url: http://支付完成后跳转地址 url: https://openapi-sandbox.dl.alipaydev.com/gateway.do charset: UTF-8 format: json sign: type: RSA2 log: path: /logs
2.构造Template对象 -核心案例代码
package com.yueluo.mall.order.template;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.yueluo.mall.common.vo.PayVo;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 支付宝支付模板类
* @author xjx
* @email 15340655443@163.com
* @date 2024/2/17 12:40
*/
@Component
public class AlipayTemplate {
// 商户appid
@Value("${alipay.appid}")
public static String APPID="";
// 私钥 pkcs8格式的
@Value("${alipay.private.key}")
public static String RSA_PRIVATE_KEY="";
// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
@Value("${alipay.notify.url}")
public static String notify_url="http://www.yueluo.top/order/pay/notityUrl";
// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
@Value("${alipay.return.url}")
public static String return_url="http://www.yueluo.top/order/pay/returnUrl";
// 请求网关地址
@Value("${alipay.url}")
public static String URL="https://openapi-sandbox.dl.alipaydev.com/gateway.do";
// 编码
@Value("${alipay.charset}")
public static String CHARSET="UTF-8";
// 返回格式
@Value("${alipay.format}")
public static String FORMAT="json";
// 支付宝公钥
@Value("${alipay.public.key}")
public static String ALIPAY_PUBLIC_KEY="";
// 日志记录目录
@Value("${alipay.log.path}")
public static String log_path="/logs";
// RSA2
@Value("${alipay.sign.type}")
public static String SIGN_TYPE="RSA2";
public String toPay(PayVo payVo){
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
//调用RSA签名方式
AlipayClient client = new DefaultAlipayClient(URL, APPID, RSA_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY,SIGN_TYPE);
AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo(payVo.getOut_trade_no());
model.setSubject(payVo.getSubject());
model.setTotalAmount(payVo.getTotal_amount());
model.setBody(payVo.getBody());
model.setTimeoutExpress("5000");
model.setProductCode("商品码");
alipay_request.setBizModel(model);
// 设置异步通知地址
alipay_request.setNotifyUrl(notify_url);
// 设置同步地址
alipay_request.setReturnUrl(return_url);
// form表单生产
String form = "";
try {
// 调用SDK生成表单
form = client.pageExecute(alipay_request).getBody();
return form;
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "支付宝支付";
}
}
3. Controller调用
/**
* 整合支付宝支付
* 跳转到支付宝支付页面
* 沙盒账号:puhsea0558@sandbox.com
* 密码:111111
* @param orderSn
* @param model
* @return
*/
@GetMapping(value = "/order/alipay",produces = "text/html")
@ResponseBody
public String alipay(@RequestParam(value = "orderSn") String orderSn, Model model){
//1.调用订单服务查询订单信息
PayVo payVo = orderService.getPayVo(orderSn);
//2.整合支付宝支付
String pay = alipayTemplate.toPay(payVo);
//3.跳转到支付宝支付页面
return pay;
}
4.跳转页面Controller
/**
* 支付--后台支付成功后跳转到订单详情页
* @param orderSn
* @param model
* @return
*/
@GetMapping("/order/pay/returnUrl")
public String pay(@RequestParam(value = "orderSn",required = false) String orderSn,
@RequestParam(value = "out_trade_no",required = false) String out_trade_no,
Model model){
System.out.println("接收到的要支付的订单编号为:"+orderSn);
System.out.println("接收已经支付成功后的订单编号为:"+out_trade_no);
//1.调用订单服务更新订单状态并返回订单及其订单项信息
if (StringUtils.isNotBlank(orderSn)) {
//TODO 表单提交支付(银行卡)相关的支付操作
System.out.println("银行卡支付成功");
orderService.paySuccess(orderSn);
}else {
//TODO 支付宝支付成功后的更新操作
orderService.paySuccess(out_trade_no);
}
//TODO 加载订单详情
//2.支付成功跳转到订单详情页
return "list";
}