1.首先加pom文件
<!-- 支付宝支付的依赖 -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.16.2.ALL</version>
</dependency>
2.yml
alipay:
# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
app_id: --------
# 商户私钥,您的PKCS8格式RSA2私钥
merchant_private_key:
# 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
alipay_public_key: -----
# 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数 [需外网能访问]
notify_url: //要跳转的路径
# 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数 [需外网能访问]
return_url: //要跳转的路径
# 签名方式
sign_type: RSA2
# 字符编码格式
charset: utf-8
# 支付宝网关
gateway_url: https://openapi-sandbox.dl.alipaydev.com/gateway.do //这里小坑,看好沙箱的支付宝官网
# 日志路径
log_path: "log/"
3.加入config
/**
* <p> 支付宝支付-基础配置类 </p>
*
* @author liubo
* @description
* @date
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "alipay", ignoreUnknownFields = false)
public class AlipayConfigProperty {
/**
* 应用ID,
* <p>
* 您的APPID,收款账号既是您的APPID对应支付宝账号
*/
public String app_id;
/**
* 商户私钥
* <p>
* 您的PKCS8格式RSA2私钥
*/
public String merchant_private_key;
/**
* 支付宝公钥
* <p>
* 查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
*/
public String alipay_public_key;
/**
* 服务器异步通知页面路径
* <p>
* 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
*/
public String notify_url;
/**
* 页面跳转同步通知页面路径
* <p>
* 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
*/
public String return_url;
/**
* 签名方式
*/
public String sign_type;
/**
* 字符编码格式
*/
public String charset;
/**
* 支付宝网关
*/
public String gatewayUrl;
/**
* 日志路径
*/
public String log_path;
}
3.Controller
/**
* 支付宝(上线-->只改支付宝的网管)支付
*/
@GetMapping("/createOrderPayment/{orderSn}") // orderSn --》 订单号
public Result pay(@PathVariable String orderSn, HttpServletResponse response) {
log.info("功能名称:[支付],请求URI:[{}],请求方式:[{}],请求参数:[{}]", request.getRequestURI(), request.getMethod(), JSONObject.toJSONString(orderSn));
orderService.createOrderPayment(orderSn, response);
Result result = Result.success();
log.info("功能名称:[支付],请求URI:[{}],请求方式:[{}],响应结果:[{}]", request.getRequestURI(), request.getMethod(), result);
return result;
}
4.ServiceImpl
public void createOrderPayment(String orderSn, HttpServletResponse response) {
//商户订单号,订单系统唯一个订单号
Order order = orderMapper.selectOne(new QueryWrapper<Order>().lambda().eq(Order::getOrderSn, orderSn));
//根据订单号查询订单信息是否存在
if (order == null) {
throw new BizException(501, "订单号号不存在");
}
//防止出现重复支付问题
List<OrderInfo> orderInfoList = orderMapper.findByOrderInfoByOrderSn(orderSn);
if (!CollectionUtils.isEmpty(orderInfoList)) {
orderInfoList.forEach(c -> {
if (c.getPaymentStatus().equals("1")) {
throw new RuntimeException("订单已支付");
}
if (c.getPaymentStatus().equals("0")) {
throw new RuntimeException("订单支付中,请稍后重试");
}
});
}
// 保存一比交易流水
OrderInfo orderInfo = new OrderInfo();
orderInfo.setOrderSn(orderSn);
orderInfo.setSubject(order.getOrderDescription());
orderInfo.setTotalAmount(order.getPaymentAmount());
orderInfo.setCreateTime(new Date()); // 订单创建时间
orderInfo.setPaymentStatus(String.valueOf(0)); //0处理中 //1成功 //2失败
long orderId = IdUtil.getSnowflake(1, 1).nextId();//雪花算法 (交易流水号)
orderInfo.setOrderId(orderId);// 商户流水号
orderMapper.addByOrderInfo(orderInfo);
//防止重复支付
if (order.getPaymentStatus() == 1) {
throw new BizException(501, "订单信息已经存在");
}
//调用支付宝下单接口
// 获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfigProperty.gatewayUrl, alipayConfigProperty.app_id, alipayConfigProperty.merchant_private_key, "json", alipayConfigProperty.charset, alipayConfigProperty.alipay_public_key, alipayConfigProperty.sign_type);
try {
// 设置请求参数
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl(alipayConfigProperty.return_url);
request.setNotifyUrl(alipayConfigProperty.notify_url);
//传值 => 支付宝
JSONObject bizContent = new JSONObject();
// 商户订单号,商家自定义,保持唯一性
bizContent.put("out_trade_no", orderId);
// 支付的金额
bizContent.put("total_amount", order.getPaymentAmount());
// 订单标题,纯文字
bizContent.put("subject", order.getOrderDescription());
// 电脑网站支付场景固定传值:FAST_INSTANT_TRADE_PAY
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
// 执行请求,拿到响应的结果,返回给浏览器
String form = "";
form = alipayClient.pageExecute(request).getBody();
//设置响应结果,将返回的内容写出到浏览器
response.setContentType("text/html;charset=" + alipayConfigProperty.getCharset());
response.getWriter().write(form);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
} catch (Exception e) {
e.printStackTrace();
}
}
--- sql表
t_order
t_order_info
本代码嵌入了mp 查询的时候可以直接查询可以不使用mp