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