https://open.alipay.com/develop/manage
点击沙箱

第一种方法
使用SDK
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.5.0.ALL</version>
</dependency>
配置类
package com.dreams;
import lombok.Data;
import org.springframework.context.annotation.Configuration;
@Configuration
@Data
public class AlipayConfig {
// 商户appid
public String APPID = "9xxxxxxxxxxxxxx";
// 私钥 pkcs8格式的
public String RSA_PRIVATE_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxx";
// // 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// public String notify_url = "http://商户网关地址/alipay.trade.wap.pay-JAVA-UTF-8/notify_url.jsp";
// // 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
// public String return_url = "http://商户网关地址/alipay.trade.wap.pay-JAVA-UTF-8/return_url.jsp";
//
// 请求网关地址
public String URL = "https://xxxxxxxxxxdev.xxxxxxxxxxx";
// 编码
public String CHARSET = "UTF-8";
// 返回格式
public String FORMAT = "json";
// 支付宝公钥
public String ALIPAY_PUBLIC_KEY = "xxxxxxxxxxxxxxxxx";
// 日志记录目录
public String log_path = "/log";
// RSA2
public String SIGNTYPE = "RSA2";
}
请求
package com.dreams;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Description:
* @Version: V1.0
*/
@RestController
public class PayController {
@GetMapping("/alipaytest")
public String alipaytest(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, AlipayApiException {
AlipayConfig alipayConfig = new AlipayConfig();
//获得初始化的AlipayClient
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setReturnUrl("url");
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "20220817010101001"); //交易单号
bizContent.put("total_amount", 1); //交易金额 单位:元
bizContent.put("subject", "餐掌柜-餐饮消费"); //支付备注
request.setBizContent(bizContent.toJSONString());
// 封装请求支付信息
AlipayClient client = new DefaultAlipayClient(alipayConfig.URL, alipayConfig.APPID, alipayConfig.RSA_PRIVATE_KEY, alipayConfig.FORMAT, alipayConfig.CHARSET, alipayConfig.ALIPAY_PUBLIC_KEY, alipayConfig.SIGNTYPE);
AlipayTradePrecreateResponse response = null;
try {
response = client.execute(request);
if (response.isSuccess()) {
System.out.println("调用成功");
System.out.println(response.getQrCode());
//生成Base64格式
String base64 = QrCodeUtil.
generateAsBase64(response.getQrCode(), new QrConfig(300, 300), "png");
System.out.println(base64);
return base64;
} else {
System.out.println("调用失败");
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
return "OK";
}
@GetMapping("query")
public String query(String orderNo) throws AlipayApiException {
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "20220817010101001"); //交易单号
request.setBizContent(bizContent.toJSONString());
AlipayConfig alipayConfig = new AlipayConfig();
// 封装请求支付信息
AlipayClient client = new DefaultAlipayClient(alipayConfig.URL, alipayConfig.APPID, alipayConfig.RSA_PRIVATE_KEY, alipayConfig.FORMAT, alipayConfig.CHARSET, alipayConfig.ALIPAY_PUBLIC_KEY, alipayConfig.SIGNTYPE);
AlipayTradeQueryResponse response = null;
response = client.execute(request);
System.out.println("调用成功");
System.out.println(response.getTradeStatus());
System.out.println(response);
if (ObjectUtil.equal(response.getTradeStatus(), "TRADE_SUCCESS")) {
return "SUCCESS";
} else {
return "ERROR";
}
}
@GetMapping("refund")
public String refund(String orderNo, String refundMoney) throws AlipayApiException {
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "20220817010101001"); //交易单号
bizContent.put("refund_amount", "0.5");
// 分多次退款
bizContent.put("out_request_no", "111");
request.setBizContent(bizContent.toJSONString());
AlipayConfig alipayConfig = new AlipayConfig();
// 封装请求支付信息
AlipayClient client = new DefaultAlipayClient(alipayConfig.URL, alipayConfig.APPID, alipayConfig.RSA_PRIVATE_KEY, alipayConfig.FORMAT, alipayConfig.CHARSET, alipayConfig.ALIPAY_PUBLIC_KEY, alipayConfig.SIGNTYPE);
AlipayTradeRefundResponse response = null;
response = client.execute(request);
System.out.println("调用成功");
System.out.println(response.getCode());
System.out.println(response);
if (ObjectUtil.equal(response.getCode(), "10000")) {
return "SUCCESS";
} else {
return "ERROR";
}
}
@GetMapping("refundQuery")
public String refundQuery(String orderNo, String refundNo) throws AlipayApiException {
AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "20220817010101001"); //交易单号
bizContent.put("out_request_no", "111");
request.setBizContent(bizContent.toJSONString());
AlipayConfig alipayConfig = new AlipayConfig();
// 封装请求支付信息
AlipayClient client = new DefaultAlipayClient(alipayConfig.URL, alipayConfig.APPID, alipayConfig.RSA_PRIVATE_KEY, alipayConfig.FORMAT, alipayConfig.CHARSET, alipayConfig.ALIPAY_PUBLIC_KEY, alipayConfig.SIGNTYPE);
AlipayTradeFastpayRefundQueryResponse response = null;
response = client.execute(request);
System.out.println("调用成功");
System.out.println(response.getRefundStatus());
System.out.println(response);
if (ObjectUtil.equal(response.getRefundStatus(), "REFUND_SUCCESS")) {
return "SUCCESS";
} else {
return "ERROR";
}
}
}
第二种方法
使用easy SDK
<!--方式二 https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
<version>2.2.0</version>
</dependency>
MyAlipayConfig
package com.dreams;
import com.alipay.easysdk.kernel.Config;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Description:
* @Version: V1.0
*/
@Configuration
@Data
public class MyAlipayConfig {
@Bean
public Config config() {
AlipayConfig alipayConfig = new AlipayConfig();
Config config = new Config();
config.protocol = "https";
config.gatewayHost = "openapi-xxxxxxxxx.com";
config.signType = alipayConfig.getSIGNTYPE();
config.appId = alipayConfig.getAPPID();
// 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中
config.merchantPrivateKey = alipayConfig.getRSA_PRIVATE_KEY();
//注:证书文件路径支持设置为文件系统中的路径或CLASS_PATH中的路径,优先从文件系统中加载,加载失败后会继续尝试从CLASS_PATH中加载
// config.merchantCertPath = "<-- 请填写您的应用公钥证书文件路径,例如:/foo/appCertPublicKey_2019051064521003.crt -->";
// config.alipayCertPath = "<-- 请填写您的支付宝公钥证书文件路径,例如:/foo/alipayCertPublicKey_RSA2.crt -->";
// config.alipayRootCertPath = "<-- 请填写您的支付宝根证书文件路径,例如:/foo/alipayRootCert.crt -->";
//注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可
config.alipayPublicKey = alipayConfig.getALIPAY_PUBLIC_KEY();
//可设置异步通知接收服务地址(可选)
config.notifyUrl = "";
//可设置AES密钥,调用AES加解密相关接口时需要(可选) <-- 请填写您的AES密钥,例如:aa4BtZ4tspm2wnXLb1ThQA== -->
config.encryptKey = "";
return config;
}
}EasyPayController
package com.dreams;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.kernel.util.ResponseChecker;
import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse;
import com.alipay.easysdk.payment.common.models.AlipayTradeRefundResponse;
import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("easy")
public class EasyPayController {
@Autowired
Config config;
@GetMapping("/alipaytest")
public String alipaytest(String orderNo) {
orderNo = "202208170101010233";
// 1. 设置参数(全局只需设置一次) -- 项目启动时初始化
Factory.setOptions(config);
try {
AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace()
.preCreate("餐掌柜-餐饮消费",
orderNo, "0.01");
// 3. 处理响应或异常
if (ResponseChecker.success(response)) {
System.out.println("调用成功");
System.out.println(response.getQrCode());
//生成Base64格式
String base64 = QrCodeUtil.
generateAsBase64(response.getQrCode(), new QrConfig(300, 300), "png");
System.out.println(base64);
return base64;
// System.out.println("调用成功");
// System.out.println(response.getHttpBody());
// return response;
} else {
System.err.println("调用失败,原因:" + response.msg + "," + response.subMsg);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@GetMapping("query")
public AlipayTradeQueryResponse query(String orderNo) {
// 1. 设置参数(全局只需设置一次) -- 项目启动时初始化
Factory.setOptions(config);
try {
return Factory.Payment.Common().query(orderNo);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@GetMapping("refund")
public AlipayTradeRefundResponse refund(String orderNo, String refundMoney) {
// 1. 设置参数(全局只需设置一次) -- 项目启动时初始化
Factory.setOptions(config);
try {
AlipayTradeRefundResponse response = Factory.Payment.Common().refund(orderNo, refundMoney);
return response;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

