1.导入相关依赖
<!--支付宝-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
<version>2.2.0</version>
</dependency>
2.登录支付获取沙箱环境
开启默认公玥得到公玥与私玥
下面才是私玥
3.创建bean获取后续必须要用的值
application.yml配置(noyifyUrl没有公网请用内网穿透工具 后面我会讲)
创建初始化阿里支付的bean
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.pay")
@Slf4j
public class AliPayBean {
private String appId; //ID
private String appPrivateKey; //私玥
private String appPublicKey; //公玥
private String notifyUrl; //支付成功 回调地址 必须是公网IP
@PostConstruct
public void init(){
//支付初始化
Config option=getOptions();
option.appId=this.appId;
option.merchantPrivateKey=this.appPrivateKey;
option.alipayPublicKey=this.appPublicKey;
option.notifyUrl=this.notifyUrl;
Factory.setOptions(option);
log.info("支付宝bean初始化成功");
}
public Config getOptions(){
Config config=new Config();
config.protocol="https";
config.gatewayHost="openapi.alipaydev.com"; //设置网关 支付宝默认
config.signType="RSA2"; //加密方式
return config;
}
}
编写支付Vo
@Data
public class AliPay {
private String subject; //商家名
private String traceNo; //订单号 自拟 11都行
private String totalAmount; //支付金额
}
3.编写支付接口
重点说三个参数:1.subject:商家名称 2.支付单号(可自拟)3.支付金额
@GetMapping("pay")
public String alipay(AliPay aliPay) throws Exception {
//禁止重复支付
QueryWrapper<Order> orderQueryWrapper=new QueryWrapper<>();
orderQueryWrapper.eq("order_no",aliPay.getTraceNo());
orderQueryWrapper.eq("status",1);//支付状态1 已支付
long count = service.count(orderQueryWrapper);
if (count!=0){
return "PAYED(请勿重复支付)";//已支付
}
//校验金额是否正确
QueryWrapper<Order> QueryWrapper=new QueryWrapper<>();
QueryWrapper.eq("order_no",aliPay.getTraceNo());
QueryWrapper.eq("total_fee",aliPay.getTotalAmount());//金额校验
long flag = service.count(QueryWrapper);
if (flag==0){
return "小黑客你在想啥呢...............";
}
AlipayTradePagePayResponse response;
response=Factory.Payment.Page()
.pay(URLEncoder.encode(aliPay.getSubject(),"UTF-8"),aliPay.getTraceNo(),aliPay.getTotalAmount(),"");
return response.getBody();
}
4.编写支付回调接口(查看回调是否成功,成功表示支付成功)如果你支付成功 请求就会打在你的公网回调地址
自我测试建议使用内网穿透工具,临时将自己主机变成公网ip 这里我给你们推荐免费工具
NATAPP-内网穿透 基于ngrok的国内高速内网映射工具
(使用请注意使用当前服务端口映射正确)
@PostMapping("callback")
public String callback(HttpServletRequest request){
if (request.getParameter("trade_status")==null){
log.info("出现非法请求支付回调api");
return "PAY IS ERROR";
}
if (request.getParameter("trade_status").equals("TRADE_SUCCESS")){
Map<String,String> params=new HashMap<>();
Map<String,String[]> requestParams=request.getParameterMap();
for (String name : requestParams.keySet()) {
params.put(name,request.getParameter(name));
//回调各种参数
}
String orderNo=params.get("out_trade_no");
Integer updateStatus=1; //1 表示已支付
//更新支付状态
UpdateWrapper<Order> orderUpdateWrapper=new UpdateWrapper<>();
orderUpdateWrapper.eq("order_no",orderNo);
orderUpdateWrapper.set("status",updateStatus);
service.update(orderUpdateWrapper);
}
return "SUCCESS";
}