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文件添加支付宝依赖
<!-- 支付宝支付 --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.7.26.ALL</version></dependency>
2、在项目中新建一个支付宝工具类
public class AlipayConfig {// ↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号public static String app_id = "";// 商户私钥,您的PKCS8格式RSA2私钥public static String merchant_private_key = "";// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。public static String alipay_public_key = "";// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问// 这里需要配置支付宝回调的后端路径,必须要外网可以访问public static String notify_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问// TODO 这里需要配置支付宝回调的前端路径,必须要外网可以访问public static String return_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp"; // 签名方式public static String sign_type = "RSA2";// 字符编码格式public static String charset = "UTF-8";// 支付宝网关public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";// 日志路径public static String log_path = "C:\\";// ↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑/*** 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)* * @param sWord 要写入日志里的文本内容*/public static void logResult(String sWord) {FileWriter writer = null;try {writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis() + ".txt");writer.write(sWord);} catch (Exception e) {e.printStackTrace();} finally {if (writer != null) {try {writer.close();} catch (IOException e) {e.printStackTrace();}}}}
}
3、定义Service
public interface AlipayService {/*** 发起支付* @param outTradeNo 订单编号(唯一)* @param totalAmount 订单价格* @param subject 商品名称*/String goPay(String outTradeNo,BigDecimal totalAmount,String subject) throws Exception;/*** 交易查询* @param outTradeNo 订单编号(唯一)*/String query(String outTradeNo) throws AlipayApiException;/*** 交易关闭* @param outTradeNo订单编号(唯一)*/String close(String outTradeNo) throws AlipayApiException;
}
4、实现ServiceImpl,发起支付请求,交易查询等
public class AlipayServiceImpl implements AlipayService {@Autowiredprivate RechargeDetailService rechargeDetailService;@Overridepublic String goPay(String outTradeNo, BigDecimal totalAmount, String subject) throws Exception {AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key,AlipayConfig.sign_type);AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();/** 同步通知,支付完成后,支付成功页面 */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\"}");/** 转换格式 */String form = "";form = alipayClient.pageExecute(alipayRequest).getBody();return form;}@Overridepublic String query(String outTradeNo) throws AlipayApiException {AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key,AlipayConfig.sign_type);AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();/** 请求接口 */alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}");/** 转换格式 */String result = alipayClient.execute(alipayRequest).getBody();return result;}@Overridepublic String close(String outTradeNo) throws AlipayApiException {AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest();AlipayClient alipayClient = new DefaultAlipayClient(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\":\"" + "" + "\"}");String result = alipayClient.execute(alipayRequest).getBody();return result;}
}
5、创建支付宝controller
public class AlipayController {@Autowiredprivate AlipayService alipayService;/*** 订单支付*/@GetMapping("goPay")public Map<Object, Object> goPay() throws Exception{/** 模仿数据库,从后台调数据*/String outTradeNo = "202101010001";BigDecimaltotalAmount = new BigDecimal(10000);String subject = "苹果12";String pay = alipayService.goPay(outTradeNo, totalAmount, subject);Map<Object, Object> pays = new HashMap<>();pays.put("pay", pay);return pays;}/*** 交易查询*/@PostMapping("aipayQuery")public Result<Object> alipayQuery() throws Exception{/**调取支付订单号*/String outTradeNo = "13123";String query = alipayService.query(outTradeNo);Object json = JSONObject.toJSON(query);/*JSONObject jObject = new JSONObject();jObject.get(query);*/return Result.success(json);}/*** 交易关闭* @throws AlipayApiException */@PostMapping("alipayclose")public Result<Object> alipaycolse() throws AlipayApiException{/** 调取数据*/String outTradeNo = "13123";String close = alipayService.close(outTradeNo);return Result.success(close);}/*** 异步通知支付结果* * @param request* @return String* @throws AlipayApiException* @throws ParseException*/@PostMapping("/callBack")public String alipayNotify(HttpServletRequest request) throws Exception {// 获取支付宝的请求信息Map<String, String> map = new HashMap<>();Map<String, String[]> requestParams = request.getParameterMap();if(requestParams.isEmpty()) {return "failure";}// 将 Map<String,String[]> 转为 Map<String,String>for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = iter.next();String[] values = requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}map.put(name, valueStr);}// 验签boolean signVerified = AlipaySignature.rsaCheckV1(map, AlipayConfig.alipay_public_key, AlipayConfig.charset,AlipayConfig.sign_type);// 验签通过if (signVerified) {//支付成功后进行操作}return "failure";}
}
到此SpringBoot整合支付宝扫码支付,就完成了
有什么问题大家多互相交流^_^
Java-Spring Boot支付宝扫码支付以及支付回调相关推荐
- 苹果+android+扫码支付,苹果iOS12捷径扫码付款怎么设置 微信支付宝扫码二合一支付捷径...
苹果iOS12捷径扫码付款怎么设置 微信支付宝扫码二合一支付捷径.捷径是苹果手机一个比较实用的功能,如今手机扫码支付非常流行,因此在苹果手机中安装一个支付捷径,还是非常方便的.下面小编就来分享一个微信 ...
- Spring使用支付宝扫码支付
前一段一直在研究支付宝的扫码支付,不得不说,支付宝的文档写的真是一个烂(起码在下刚开始看的时候是mengbi的).文档上面的示例和demo里面的示例长的完全不一样.往往文档上面的例子很简单,而demo ...
- Spring Boot 实现扫码登录,这种方式太香了!!
作者 | 93年颈椎病人 来源 | https://blog.csdn.net/q826qq1878/article/details/91041679 最近有个项目涉及到websocket实现扫码登录 ...
- Spring Boot 实现扫码登录
一.首先咱们需要一张表 这表是干啥的呢?就是记录一下谁扫码了.谁登录了. User_Token表 字段如下: uuid : 用于确保唯一性 userId :谁登录的 loginTime :登录时间 c ...
- Spring Boot 实现扫码登录,太赞了(附源码)!!
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐ 点击领取全栈资料:全栈资料 一.首先咱们需要一张表 二.角色都有哪些 三.接口都需要哪些? 四.步骤 五.疯狂贴代码 springBoot中 ...
- Spring Boot 实现扫码登录,这种方式太香了
开发者(KaiFaX) 面向全栈工程师的开发者 专注于前端.Java/Python/Go/PHP的技术社区 来源 https://blog.csdn.net/q826qq1878/article/de ...
- Java代码实现支付宝扫码支付功能(配置沙箱环境)
支付宝沙箱配置环境 什么是沙箱呢? 协助开发者进行接口功能,独立于线上环境的配置. 支付接口需要签约生效后才能使用,有些签约几天才能通过,比如资料不全,导致无法立刻签约:沙箱环境提供了测试环境,解决了 ...
- 支付宝扫码即时到账支付
String strResult1 = "";// //请求参数//// 接口调用时间String timestamp = UtilDate.getDateFormatter(); ...
- 支付宝扫码支付示例源码
支付宝扫码支付示例源码 支付宝扫码付,相对来说根据开发文档开发的话,基本上可以一遍过的.直接上代码. controller: @RequestMapping(value = {"/api/a ...
最新文章
- r240显卡 linux,NV发布260.19.36正式版Linux驱动 270系列将至
- 简述Zookeeper作注册中心
- 安装jenkins时出现 No such plugin: cloudbees-folder的解决办法
- 光纤收发器一定要成对使用吗?
- 坐拥270亿参数!阿里达摩院发布超大规模语言模型PLUG,上能写诗词歌赋、下能对答如流...
- 百度鹰眼ajax 坐标转换,Web服务更新日志
- android车机播放器,万能视频播放器 车机版
- html 多选框取值,多选框取值
- echarts设置背景图片
- 《炬丰科技-半导体工艺》硅片减薄、分离工艺
- 深圳加密芯片服务器,国民技术-加密芯片-Z32HUB-安全加密芯片
- 张孝祥java面试大全
- 【西瓜书】第4章决策树---学习笔记
- 性能服务器石墨和化合物区别,南开大学陈军教授Nano Lett. :具有高容量和快速钠离子存储性能的硫化锑-石墨烯化合物...
- 学习HCIA总结(第一天)
- SpringData集成Elasticsearch
- HTML——微信H5分享
- java查询几万条数据_java一次性查询几十万,几百万数据解决办法(转载)
- HiPhone的Sciphone I9审查和全规格
- 论企业如何快速建立SDL流程
热门文章
- 为什么说小米会是品牌2020年最重要的增长源?
- windows 网络远程连接samba,并修改windows默认连接samba端口445到指定端口(支持监听ipv6 及ipv4 IP地址)
- 水星怎么设置网速最快_水星路由器怎么限制别人网速_水星怎么限制wifi网速?-192路由网...
- Mac:当iPhone连接苹果电脑时,自动弹出照片的解决方案
- WeCube开源首周感悟
- 第二十二章 SQL命令 CREATE TRIGGER(二)
- C++: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
- Ensight 基本操作
- 图解|网络究竟是如何运作的?
- K8s JavaClient watch Pod检测状态变更、和Read timed out异常