一如既往的简易
第一步
添加maven
<!-- 支付宝支付最新依赖-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.22.34.ALL</version>
<scope>compile</scope>
</dependency>
为了省事这里就一个配置文件
新建 AliPayConfig.java配置类
/**
* 微信支付配置类
*/
public class AliPayConfig {
/** 支付宝支付的appid */
public static String APP_ID = "xxxxxxxxxxx";
/** 商户私钥 */
public static String APP_PRIVATE_KEY = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
//字符集
public static String CHARSET = "utf-8";
//正式环境支付宝网关,如果是沙箱环境需更改成https://openapi.alipaydev.com/gateway.do
public static String URL = "https://openapi.alipay.com/gateway.do";
//加密方式
public static String SIGN_TYPE = "RSA2";
//配置证书
public static String APP_CERT_PATH = "/xxxxxxxxxxx/appCertPublicKey_2021003113684123.crt";
public static String ALIPAY_CERT_PATH = "/xxxxxxxxxxx/alipayCertPublicKey_RSA2.crt";
public static String ALIPAY_ROOT_CERT_PATH = "/xxxxxxxxxxx/alipayRootCert.crt";
}
新建 AliPayConfig.java配置类
/**
* @author 影子
*/
public interface AliPaymentService
{
/**
* 支付宝商品支付
* @param alipayParam 订单接收对象
* @return
*/
public Map<String, Object> alidoUnifiedOrder(String orderNumber) throws Exception;
/**
* 支付宝支付回调
* @param request
* @return
*/
public String aliPayNotify( HttpServletRequest request);
}
新建 AlipaymentServiceImpl.java配置类
@Service
@Slf4j
public class AlipaymentServiceImpl implements AliPaymentService {
//支付宝支付回调 省事0.0
public static final String ALI_PAY_NOTIFY_URL = "https://xxxxxxxx/aliPayNotify";
/**
* 支付宝商品订单支付
*
* @param payParam
* @return
* @throws Exception
*/
@Override
public Map<String,Object> alidoUnifiedOrder(String orderNumber) throws Exception {
Map<String,Object> map = new HashMap<>();
//支付总金额
BigDecimal totalPrice = BigDecimal.ZERO;
//你的订单金额
totalPrice = totalPrice.add(BigDecimal.valueOf(600));
try {
//构造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//设置网关地址
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用Id
certAlipayRequest.setAppId(AliPayConfig.APP_ID);
//设置应用私钥
certAlipayRequest.setPrivateKey(AliPayConfig.APP_PRIVATE_KEY);
//设置请求格式,固定值json
certAlipayRequest.setFormat("json");
//设置字符集
certAlipayRequest.setCharset(AliPayConfig.CHARSET);
//设置签名类型
certAlipayRequest.setSignType(AliPayConfig.SIGN_TYPE);
//设置应用公钥证书路径
certAlipayRequest.setCertPath(AliPayConfig.APP_CERT_PATH);
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath(AliPayConfig.ALIPAY_CERT_PATH);
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath(AliPayConfig.ALIPAY_ROOT_CERT_PATH);
//构造client
DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是测试数据");
//App支付测试Java
model.setSubject("影子");
/*setTimeoutExpress :该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,
d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。
该参数数值不接受小数点, 如 1.5h,可转换为 90m。*/
model.setTimeoutExpress("30m");
//请保证OutTradeNo值每次保证唯一
model.setOutTradeNo(“2017090080001939235”);//商品订单(2017090080001939235 )
//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
model.setTotalAmount("0.01");
request.setBizModel(model);
//商户外网可以访问的异步地址
request.setNotifyUrl(ALI_PAY_NOTIFY_URL);
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse responses = alipayClient.sdkExecute(request);
map.put("code",200);
map.put("msg","操作成功");
map.put("data",responses.getBody());
return map;
//就是orderString 可以直接给客户端请求,无需再做处理。
} catch (AlipayApiException e) {
e.printStackTrace();
map.put("code",500);
map.put("msg","下单失败");
return map;
}
} catch (Exception e) {
e.printStackTrace();
log.info("异常==>",e);
map.put("code",500);
map.put("msg","支付异常");
return map;
}
}
/**
* 支付宝支付回调
* @param request
* @return
*/
@Override
public String aliPayNotify(HttpServletRequest request) {
//支付宝交易号
String payTradeNo= "";
//获取支付宝POST过来反馈信息
Map < String , String > params = new HashMap< String , String >();
Map requestParams = request . getParameterMap ();
for (Iterator iter = requestParams . keySet (). iterator (); iter . hasNext ();) {
String name = ( String ) iter . next ();
String [] values = ( String []) requestParams . get ( name );
String valueStr = "" ;
for ( int i = 0 ; i < values . length ; i ++ ) {
valueStr = (i == values . length - 1) ? valueStr + values [ i ]
: valueStr + values [ i ] + "," ;
}
params.put(name,valueStr );
}
payTradeNo = params.get("trade_no");
try {
//验签
boolean flag = AlipaySignature.rsaCertCheckV1(params,AliPayConfig.ALIPAY_CERT_PATH,AliPayConfig.CHARSET,AliPayConfig.SIGN_TYPE );
if (flag){//验签成功
//商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
//交易状态
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
//查询订单逻辑省略....
if (trade_status.equals("TRADE_SUCCESS")) {
if (out_trade_no != null) {
// 注意特殊情况:订单已经退款,但收到了支付结果成功的通知,不应把商户的订单状态从退款改成支付成功
// 注意特殊情况:微信服务端同样的通知可能会多次发送给商户系统,所以数据持久化之前需要检查是否已经处理过了,处理了直接返回成功标志
//业务数据持久化
//业务逻辑省略....
//必须返回SUCCESS 不然支付宝收不到成功信息会再次请求回调
return "SUCCESS";
}
}
}
return "500";
} catch (AlipayApiException | UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
Controller类贴一下吧 照顾一下迷的“小”朋友
/**
* 支付宝商品支付
* @param orderNumber
* @return
* @throws Exception
*/
@PostMapping("/alidoUnifiedOrder")
public Map<String,Object> alidoUnifiedOrder(String orderNumber) throws Exception {
Map<String,Object> map = aliPaymentService.alidoUnifiedOrder(orderNumber);
return map;
}
/**
* 商品订单支付回调
* @param request
* @return
*/
@PostMapping("/aliPayNotify")
@ResponseBody
public String aliPayNotify( HttpServletRequest request) {
String code = aliPaymentService.aliPayNotify(request);
return code;
}
到这就结束了 够简单吧 !复制粘贴即可一如既往没其它依赖