Java中Spring Boot支付宝扫码支付及支付回调的实现代码
前言:最近开发支付宝支付功能,总结一下做个分享
官方文档:https://opendocs.alipay.com/apis
支付宝沙箱地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info
支付宝支付流程:
准备工作:获取支付宝沙箱数据(APPID,支付宝网关,RSA2秘,沙箱支付账号等)
集成SpringBoot,使用Java代码发起支付请求
支付宝收到支付请求后,返回HTML代码片段,用于前端展示二维码
扫码支付成功后,支付宝发送同步、异步通知请求,同步、异步通知路径可在配置文件中进行配置
收到异步通知结果后,进行验签,验签通过,返回成功信息通知支付宝不在进行异步通知
此时支付宝支付流程完成,调用支付宝查询接口,确认支付成功
一、获取支付宝沙箱数据
打开上述沙箱地址,获取沙箱配置,查看下图信息
二、集成SpringBoot,使用Java代码发起支付请求
1、在pom.xml文件添加支付宝依赖
com.alipay.sdk alipay-sdk-java 3.7.26.ALL
2、在项目中新建一个支付宝工具类
publicclassAlipayConfig{
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
publicstaticStringapp_id="";
//商户私钥,您的PKCS8格式RSA2私钥
publicstaticStringmerchant_private_key="";
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm对应APPID下的支付宝公钥。
publicstaticStringalipay_public_key="";
//服务器异步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//这里需要配置支付宝回调的后端路径,必须要外网可以访问
publicstaticStringnotify_url="http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
//页面跳转同步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//TODO这里需要配置支付宝回调的前端路径,必须要外网可以访问
publicstaticStringreturn_url="http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
//签名方式
publicstaticStringsign_type="RSA2";
//字符编码格式
publicstaticStringcharset="UTF-8";
//支付宝网关
publicstaticStringgatewayUrl="https://openapi.alipaydev.com/gateway.do";
//日志路径
publicstaticStringlog_path="C:\\";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
*写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
*
*@paramsWord要写入日志里的文本内容
*/
publicstaticvoidlogResult(StringsWord){
FileWriterwriter=null;
try{
writer=newFileWriter(log_path+"alipay_log_"+System.currentTimeMillis()+".txt");
writer.write(sWord);
}catch(Exceptione){
e.printStackTrace();
}finally{
if(writer!=null){
try{
writer.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
}
3、定义Service
publicinterfaceAlipayService{
/**
*发起支付
*@paramoutTradeNo订单编号(唯一)
*@paramtotalAmount订单价格
*@paramsubject商品名称
*/
StringgoPay(StringoutTradeNo,BigDecimaltotalAmount,Stringsubject)throwsException;
/**
*交易查询
*@paramoutTradeNo订单编号(唯一)
*/
Stringquery(StringoutTradeNo)throwsAlipayApiException;
/**
*交易关闭
*@paramoutTradeNo订单编号(唯一)
*/
Stringclose(StringoutTradeNo)throwsAlipayApiException;
}
4、实现ServiceImpl,发起支付请求,交易查询等
publicclassAlipayServiceImplimplementsAlipayService{
@Autowired
privateRechargeDetailServicerechargeDetailService;
@Override
publicStringgoPay(StringoutTradeNo,BigDecimaltotalAmount,Stringsubject)throwsException{
AlipayClientalipayClient=newDefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,
AlipayConfig.merchant_private_key,"json",AlipayConfig.charset,AlipayConfig.alipay_public_key,
AlipayConfig.sign_type);
AlipayTradePagePayRequestalipayRequest=newAlipayTradePagePayRequest();
/**同步通知,支付完成后,支付成功页面*/
alipayRequest.setReturnUrl(AlipayConfig.return_url);
/**异步通知,支付完成后,需要进行的异步处理*/
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
alipayRequest.setBizContent("{\"out_trade_no\":\""+outTradeNo+"\","+"\"total_amount\":\""+totalAmount
+"\","+"\"subject\":\""+subject+"\","+"\"body\":\"付款\","+"\"timeout_express\":\"15m\","
+"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
/**转换格式*/
Stringform="";
form=alipayClient.pageExecute(alipayRequest).getBody();
returnform;
}
@Override
publicStringquery(StringoutTradeNo)throwsAlipayApiException{
AlipayClientalipayClient=newDefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,
AlipayConfig.merchant_private_key,"json",AlipayConfig.charset,AlipayConfig.alipay_public_key,
AlipayConfig.sign_type);
AlipayTradeQueryRequestalipayRequest=newAlipayTradeQueryRequest();
/**请求接口*/
alipayRequest.setBizContent("{\"out_trade_no\":\""+outTradeNo+"\","+"\"trade_no\":\""+""+"\"}");
/**转换格式*/
Stringresult=alipayClient.execute(alipayRequest).getBody();
returnresult;
}
@Override
publicStringclose(StringoutTradeNo)throwsAlipayApiException{
AlipayTradeCloseRequestalipayRequest=newAlipayTradeCloseRequest();
AlipayClientalipayClient=newDefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,
AlipayConfig.merchant_private_key,"json",AlipayConfig.charset,AlipayConfig.alipay_public_key,
AlipayConfig.sign_type);
alipayRequest.setBizContent("{\"out_trade_no\":\""+outTradeNo+"\","+"\"trade_no\":\""+""+"\"}");
Stringresult=alipayClient.execute(alipayRequest).getBody();
returnresult;
}
}
5、创建支付宝controller
publicclassAlipayController{
@Autowired
privateAlipayServicealipayService;
/**
*订单支付
*/
@GetMapping("goPay")
publicMap