前言:最近开发支付宝支付功能,总结一下做个分享

官方文档:https://opendocs.alipay.com/apis

支付宝沙箱地址: https://openhome.alipay.com/platform/appDaily.htm?tab=info

支付宝支付流程:

  1. 准备工作:获取支付宝沙箱数据(APPID,支付宝网关,RSA2秘,沙箱支付账号等)
  2. 集成SpringBoot,使用Java代码发起支付请求
  3. 支付宝收到支付请求后,返回HTML代码片段,用于前端展示二维码
  4. 扫码支付成功后,支付宝发送同步、异步通知请求,同步、异步通知路径可在配置文件中进行配置
  5. 收到异步通知结果后,进行验签,验签通过,返回成功信息通知支付宝不在进行异步通知
  6. 此时支付宝支付流程完成,调用支付宝查询接口,确认支付成功

一、获取支付宝沙箱数据

打开上述沙箱地址,获取沙箱配置,查看下图信息

二、集成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支付宝扫码支付以及支付回调相关推荐

  1. 苹果+android+扫码支付,苹果iOS12捷径扫码付款怎么设置 微信支付宝扫码二合一支付捷径...

    苹果iOS12捷径扫码付款怎么设置 微信支付宝扫码二合一支付捷径.捷径是苹果手机一个比较实用的功能,如今手机扫码支付非常流行,因此在苹果手机中安装一个支付捷径,还是非常方便的.下面小编就来分享一个微信 ...

  2. Spring使用支付宝扫码支付

    前一段一直在研究支付宝的扫码支付,不得不说,支付宝的文档写的真是一个烂(起码在下刚开始看的时候是mengbi的).文档上面的示例和demo里面的示例长的完全不一样.往往文档上面的例子很简单,而demo ...

  3. Spring Boot 实现扫码登录,这种方式太香了!!

    作者 | 93年颈椎病人 来源 | https://blog.csdn.net/q826qq1878/article/details/91041679 最近有个项目涉及到websocket实现扫码登录 ...

  4. Spring Boot 实现扫码登录

    一.首先咱们需要一张表 这表是干啥的呢?就是记录一下谁扫码了.谁登录了. User_Token表 字段如下: uuid : 用于确保唯一性 userId :谁登录的 loginTime :登录时间 c ...

  5. Spring Boot 实现扫码登录,太赞了(附源码)!!

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐ 点击领取全栈资料:全栈资料 一.首先咱们需要一张表 二.角色都有哪些 三.接口都需要哪些? 四.步骤 五.疯狂贴代码 springBoot中 ...

  6. Spring Boot 实现扫码登录,这种方式太香了

    开发者(KaiFaX) 面向全栈工程师的开发者 专注于前端.Java/Python/Go/PHP的技术社区 来源 https://blog.csdn.net/q826qq1878/article/de ...

  7. Java代码实现支付宝扫码支付功能(配置沙箱环境)

    支付宝沙箱配置环境 什么是沙箱呢? 协助开发者进行接口功能,独立于线上环境的配置. 支付接口需要签约生效后才能使用,有些签约几天才能通过,比如资料不全,导致无法立刻签约:沙箱环境提供了测试环境,解决了 ...

  8. 支付宝扫码即时到账支付

    String strResult1 = "";// //请求参数//// 接口调用时间String timestamp = UtilDate.getDateFormatter(); ...

  9. 支付宝扫码支付示例源码

    支付宝扫码支付示例源码 支付宝扫码付,相对来说根据开发文档开发的话,基本上可以一遍过的.直接上代码. controller: @RequestMapping(value = {"/api/a ...

最新文章

  1. r240显卡 linux,NV发布260.19.36正式版Linux驱动 270系列将至
  2. 简述Zookeeper作注册中心
  3. 安装jenkins时出现 No such plugin: cloudbees-folder的解决办法
  4. 光纤收发器一定要成对使用吗?
  5. 坐拥270亿参数!阿里达摩院发布超大规模语言模型PLUG,上能写诗词歌赋、下能对答如流...
  6. 百度鹰眼ajax 坐标转换,Web服务更新日志
  7. android车机播放器,万能视频播放器 车机版
  8. html 多选框取值,多选框取值
  9. echarts设置背景图片
  10. 《炬丰科技-半导体工艺》硅片减薄、分离工艺
  11. 深圳加密芯片服务器,国民技术-加密芯片-Z32HUB-安全加密芯片
  12. 张孝祥java面试大全
  13. 【西瓜书】第4章决策树---学习笔记
  14. 性能服务器石墨和化合物区别,南开大学陈军教授Nano Lett. :具有高容量和快速钠离子存储性能的硫化锑-石墨烯化合物...
  15. 学习HCIA总结(第一天)
  16. SpringData集成Elasticsearch
  17. HTML——微信H5分享
  18. java查询几万条数据_java一次性查询几十万,几百万数据解决办法(转载)
  19. HiPhone的Sciphone I9审查和全规格
  20. 论企业如何快速建立SDL流程

热门文章

  1. 为什么说小米会是品牌2020年最重要的增长源?
  2. windows 网络远程连接samba,并修改windows默认连接samba端口445到指定端口(支持监听ipv6 及ipv4 IP地址)
  3. 水星怎么设置网速最快_水星路由器怎么限制别人网速_水星怎么限制wifi网速?-192路由网...
  4. Mac:当iPhone连接苹果电脑时,自动弹出照片的解决方案
  5. WeCube开源首周感悟
  6. 第二十二章 SQL命令 CREATE TRIGGER(二)
  7. C++: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  8. Ensight 基本操作
  9. 图解|网络究竟是如何运作的?
  10. K8s JavaClient watch Pod检测状态变更、和Read timed out异常