spring boot 集成支付宝模块(沙箱)--简单版本 --快速入门

1.导入相关依赖


        
            com.alipay.sdk
            alipay-easysdk
            2.2.0
        

2.登录支付获取沙箱环境

登录支付宝开发者

spring boot 集成支付宝模块(沙箱)--简单版本 --快速入门_第1张图片

 开启默认公玥得到公玥与私玥

spring boot 集成支付宝模块(沙箱)--简单版本 --快速入门_第2张图片

 下面才是私玥

spring boot 集成支付宝模块(沙箱)--简单版本 --快速入门_第3张图片

 3.创建bean获取后续必须要用的值

application.yml配置(noyifyUrl没有公网请用内网穿透工具 后面我会讲)

spring boot 集成支付宝模块(沙箱)--简单版本 --快速入门_第4张图片

 创建初始化阿里支付的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.支付金额

spring boot 集成支付宝模块(沙箱)--简单版本 --快速入门_第5张图片

 @GetMapping("pay")
    public String alipay(AliPay aliPay) throws Exception {
        //禁止重复支付
        QueryWrapper 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 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 params=new HashMap<>();
            Map 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 orderUpdateWrapper=new UpdateWrapper<>();
            orderUpdateWrapper.eq("order_no",orderNo);
            orderUpdateWrapper.set("status",updateStatus);
            service.update(orderUpdateWrapper);
        }
        return "SUCCESS";
    }

你可能感兴趣的:(spring,boot,spring,boot,java,spring)