Easy版SDK文档
示例DEMO
-
通用版SDK文档
通用版SDK文档 -
maven依赖
<dependency>
<groupId>com.alipay.sdkgroupId>
<artifactId>alipay-sdk-javaartifactId>
<version>4.22.110.ALLversion>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.78version>
dependency>
- AlipayConfig.java配置类中,只需要获取配置alipay的参数即可
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 支付宝配置类
* @author fangqi174956
*/
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {
// AppId,例如:2019091767145019
private String appId;
// 应用私钥
private String merchantPrivateKey;
// 支付宝公钥
private String alipayPublicKey;
// 支付类接口异步通知接收服务地址
private String notifyUrl;
}
4.支付宝参数实体类AliPay.java中,配置属性
package com.qingge.springboot.entity;
import lombok.Data;
/**
* 支付实体类
* @author fangqi174956
*/
@Data
public class AliPay {
private String subject;
private String tradeNo;
private String totalAmount;
/** 要退款的订单交易流水号 */
private String aliPayTradeNo;
}
4.配置接口 ,在AliPayController.java中配置以下接口
- 支付接口 ‘/alipay/pay’ ,
- 支付成功回调 ‘/alipay/notify’
- 退款接口 ‘/alipay/returnPay’
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.qingge.springboot.config.AliPayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.qingge.springboot.common.Result;
import com.qingge.springboot.entity.AliPay;
import com.qingge.springboot.entity.Orders;
import com.qingge.springboot.service.IOrdersService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
* alipay支付控制器
* @author fangqi174956
*/
@RestController
@RequestMapping("/alipay")
public class AliPayController {
private Logger logger = LoggerFactory.getLogger(AliPayController.class);
private static final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";
private static final String SIGN_TYPE = "RSA2";
private static final String CHARSET = "UTF-8";
/** 签名方式 */
private static final String FORMAT = "JSON";
@Resource
private AliPayConfig aliPayConfig;
@Resource
private IOrdersService ordersService;
@GetMapping("/pay")
public void pay(AliPay aliPay, HttpServletResponse response) throws Exception {
// System.out.println("alipay===" + aliPay);
//实例化客户端
// AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
// "应用appId", "应用私匙", "json", "utf-8", "支付宝公匙", "RSA2");
AlipayClient alipayClient = new DefaultAlipayClient(
GATEWAY_URL, aliPayConfig.getAppId(),aliPayConfig.getMerchantPrivateKey(),
FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
// 发送请求给支付宝
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
// 设置支付成功异步回调地址
request.setNotifyUrl(aliPayConfig.getNotifyUrl());
// SDK已经封装掉了公共参数,这里只需要传入业务参数
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no",aliPay.getTradeNo());
bizContent.put("total_amount",aliPay.getTotalAmount());
bizContent.put("subject",aliPay.getSubject());
bizContent.put("product_code","FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toJSONString());
String form;
try {
// 调用SDK生成表单
form = alipayClient.pageExecute(request).getBody();
} catch (AlipayApiException e) {
System.err.println("调用遭遇异常,原因:" + e.getMessage());
throw new RuntimeException(e.getMessage(), e);
}
// 设置响应的响应头
response.setContentType("text/html;charset=" + CHARSET);
PrintWriter out = response.getWriter();
// 将完整的form表单输出到页面
out.write(form);
out.flush();
out.close();
}
/**
* 支付宝回调
* 注意: 这里必须是POST 请求
*/
@PostMapping("/notify")
public Result payNotify(HttpServletRequest request) throws Exception {
if("TRADE_SUCCESS".equals(request.getParameter("trade_status"))){
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));
// System.out.println("map参数--->" + name + "=" + request.getParameter(name));
}
String orderNo = params.get("out_trade_no");
String payTime = params.get("gmt_payment");
String alipayNo = params.get("trade_no");
String sign = params.get("sign");
String content = AlipaySignature.getSignCheckContentV1(params);
Boolean checkSignature = AlipaySignature.rsa256CheckContent(content,sign,aliPayConfig.getAlipayPublicKey(),CHARSET);
// 支付宝验签
if(checkSignature){
// 验签通过
System.out.println("交易名称:->" + params.get("subject"));
System.out.println("交易状态:->" + params.get("trade_status"));
System.out.println("支付宝交易凭证号:->" + params.get("trade_no"));
System.out.println("商户订单号:->" + params.get("out_trade_no"));
System.out.println("交易金额:->" + params.get("total_amount"));
System.out.println("买家在支付宝唯一ID:->" + params.get("buyer_id"));
System.out.println("买家付款时间:->" + params.get("gmt_payment"));
System.out.println("买家实际付款金额:->" + params.get("buyer_pay_amount"));
// 根据订单编号查询订单信息
Orders orders = ordersService.getOrderByNo(orderNo);
// 订单状态 state = 1 付款成功
orders.setState(1);
orders.setPayTime(payTime);
orders.setAlipayNo(alipayNo);
System.out.println("更新后的订单信息" + orders);
// 更新订单表订单状态
ordersService.updateById(orders);
}
}
return Result.success();
}
/**
* 支付宝退款
* @param aliPay
* @return
* @throws AlipayApiException
*/
@PostMapping("/returnPay")
public Result returnPay(AliPay aliPay) throws AlipayApiException{
// 模拟7天无理由退款
// 判断付款时间超过7天,不能退款
Orders ord = ordersService.getOrderByNo(aliPay.getTradeNo());
if(ord != null){
// hutool工具类 判断时间间隔
// DateUtil.between(Date beginDate,Date endDate,DateUnit unit)
long between = DateUtil.between(
DateUtil.parseDateTime(ord.getPayTime()),
DateUtil.parseDateTime(DateUtil.now()),
DateUnit.DAY);
if(between > 7){
return Result.error("-1","该订单已超过7天,不支持退款!");
}
}
System.out.println("aliPay参数==>" + aliPay);
// 1. 创建AlipayClient实例, 通用SDK提供的AlipayClient类 负责调用支付宝的API
AlipayClient alipayClient = new DefaultAlipayClient(
GATEWAY_URL, aliPayConfig.getAppId(),aliPayConfig.getMerchantPrivateKey(),
FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
// 2.创建request
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
JSONObject bizContent = new JSONObject();
// 要退款的订单交易流水号
bizContent.put("trade_no",aliPay.getAliPayTradeNo());
bizContent.put("refund_amount", aliPay.getTotalAmount());
// 退款的订单编号
bizContent.put("out_request_no",aliPay.getTradeNo());
request.setBizContent(bizContent.toJSONString());
// 3.执行请求并设置request参数
AlipayTradeRefundResponse response = alipayClient.execute(request);
if(response.isSuccess()){
logger.info("退款成功!");
// 4.更新数据库订单信息
Orders orders = ordersService.getOrderByNo(aliPay.getTradeNo());
// 订单状态 state = 2 退款成功
orders.setState(2);
orders.setPaybackTime(DateUtil.now());
ordersService.updateById(orders);
return Result.success();
}else {
// isSuccess() 为 false 退款失败
logger.info(response.getBody());
return Result.error(response.getCode(),response.getBody());
}
}
}
注意在订单表中,新增一个字段 payback_time 退款时间。
在退款接口中。退款成功后更新订单状态
模拟7天无理由退款
在退款接口中,添加业务逻辑,判断请求退款时间 与 订单支付时间 是否间隔7天以上
// 模拟7天无理由退款
// 判断付款时间超过7天,不能退款
Orders ord = ordersService.getOrderByNo(aliPay.getTradeNo());
if(ord != null){
// hutool工具类 判断时间间隔
// DateUtil.between(Date beginDate,Date endDate,DateUnit unit)
long between = DateUtil.between(
DateUtil.parseDateTime(ord.getPayTime()),
DateUtil.parseDateTime(DateUtil.now()),
DateUnit.DAY);
if(between > 7){
return Result.error("-1","该订单已超过7天,不支持退款!");
}
}
前端发送请求,调用接口:
- 订单支付
// 订单支付
pay (order) {
// let url = '/alipay/pay?subject=' + order.name + '&traceNo=' + order.orderNo + '&totalAmount='+ order.total
let url = `http://localhost:9090/alipay/pay?subject=${order.name}&tradeNo=${order.orderNo}&totalAmount=${order.total}`
console.log('-------',url)
// 发送请求,调用后端支付宝接口,打开新的支付页面
window.open(url)
},
- 订单退款
// 退款
payBack(order){
console.log('正在发送退款请求')
let payback_url = `http://localhost:9090/alipay/returnPay?tradeNo=${order.orderNo}&totalAmount=${order.total}&aliPayTradeNo=${order.alipayNo}`
// console.log('正在发送退款请求',payback_url)
this.request.post(payback_url).then( res => {
if (res.code === '200') {
this.$message.success("退款成功")
this.load()
}else{
console.log('退款失败',res)
this.$message.error(res.msg)
}
})
},
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)