当前位置:   article > 正文

2024年最新版 springboot+vue整合支付宝沙箱支付功能,一步一步带您实现完整的支付宝支付功能_vue支付宝支付

vue支付宝支付

目录

1、进入支付宝开放平台

1.1 登录支付宝账号后下拉选择网页/移动应用开发​编辑

1.2 创建网页应用​编辑

1.3 创建成功后进入沙箱 

1.4 点击启用公钥(有重要作用!springboot整合时会用到)​编辑

2、开始springboot与支付宝沙箱的整合

2.1导入支付宝api的依赖

2.2 配置 application.yml 沙箱参数

         2.3 引入支付宝沙箱的配置代码

2.3.1 引入alipay的java配置:AplipayConfig.java 

2.3.2 在过滤器和拦截器中忽略掉alipay的系列端口

2.3.3 新建AliPayController.java,定义了支付接口与支付回调接口:

2.3.4 编写AliPay.java  接收前端传来的参数

3、使用natapp进行内网穿透

3.1 进入natapp官网注册账号,并进行实名认证、与支付宝账号进行绑定。

3.2 下载指定版本的natapp应用

​3.2.1 运行natapp.exe

3.2.2 配置natapp中的隧道

​3.2.3 启动自己本机的web服务

3.3 配置application.yml中notifyUrl参数

4、支付宝沙箱支付前端Vue代码

5、启动项目并测试功能

1、进入支付宝开放平台

支付宝开发者平台icon-default.png?t=N7T8https://openhome.alipay.com/

1.1 登录支付宝账号后下拉选择网页/移动应用开发
1.2 创建网页应用
1.3 创建成功后进入沙箱 

        沙箱比较不好找到 沙箱地址在这里:

登录 - 支付宝欢迎登录支付宝,支付宝-全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验以及转账收款/水电煤缴费/信用卡还款等生活服务应用;为广大为从事电子商务的网站提供支付产品/支付服务的在线订购和技术支持等服务,帮助商家快速接入支付工具,高效、安全、快捷地开展电子商务。icon-default.png?t=N7T8https://open.alipay.com/develop/sandbox/app

1.4 点击启用公钥(有重要作用!springboot整合时会用到)

2、开始springboot与支付宝沙箱的整合

2.1导入支付宝api的依赖
  1. <!--引入支付宝支付 -->
  2. <dependency>
  3. <groupId>com.alipay.sdk</groupId>
  4. <artifactId>alipay-easysdk</artifactId>
  5. <version>2.2.1</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.alipay.sdk</groupId>
  9. <artifactId>alipay-sdk-java</artifactId>
  10. <version>4.22.113.ALL</version>
  11. </dependency>
2.2 配置 application.yml 沙箱参数
  1. #支付宝
  2. alipay:
  3. appId:
  4. appPrivateKey:
  5. alipayPublicKey:
  6. notifyUrl:
  7. returnUrl:

 这五个参数都是什么意思呢?

  •   appId:  沙箱中的应用id
  •   appPrivateKey:  应用私钥
  •   alipayPublicKey: 支付宝公钥
  •   notifyUrl: 调用支付宝支付接口后产生的回调,需要内网穿透,后面详细讲,先不配置
  •   returnUrl: 支付成功后的页面跳转,设置成你项目中的成功支付界面(可不填)

 appPrivateKey:  应用私钥与  alipayPublicKey: 支付宝公钥在这里:点击查看

2.3 引入支付宝沙箱的配置代码
2.3.1 引入alipay的java配置AplipayConfig.java 
  1. package com.songqiao.waimai.alipay.common;
  2. import com.alipay.easysdk.factory.Factory;
  3. import com.alipay.easysdk.kernel.Config;
  4. import lombok.Data;
  5. import org.springframework.boot.context.properties.ConfigurationProperties;
  6. import org.springframework.stereotype.Component;
  7. import javax.annotation.PostConstruct;
  8. /**
  9. * @Author
  10. * @Date Created in 2023/1/13 15:06
  11. * @DESCRIPTION:
  12. * @Version V1.0
  13. */
  14. @Data
  15. @Component
  16. //读取yml文件中alipay 开头的配置
  17. @ConfigurationProperties(prefix = "alipay")
  18. public class AliPayConfig {
  19. private String appId;
  20. private String appPrivateKey;
  21. private String alipayPublicKey;
  22. //异步通知回调地址(可选)
  23. private String notifyUrl;
  24. //支付成功后的回调地址
  25. private String returnUrl;
  26. @PostConstruct
  27. public void init() {
  28. // 设置参数(全局只需设置一次)
  29. Config config = new Config();
  30. config.protocol = "https";
  31. config.gatewayHost = "openapi.alipaydev.com";
  32. config.signType = "RSA2";
  33. config.appId = this.appId;
  34. config.merchantPrivateKey = this.appPrivateKey;
  35. config.alipayPublicKey = this.alipayPublicKey;
  36. config.notifyUrl = this.notifyUrl;
  37. Factory.setOptions(config);
  38. System.out.println("=======支付宝SDK初始化成功=======");
  39. }
  40. }
2.3.2 在过滤器和拦截器中忽略掉alipay的系列端口

2.3.3 新建AliPayController.java,定义了支付接口支付回调接口:
  1. package com.songqiao.waimai.alipay.controller;
  2. import com.alipay.easysdk.factory.Factory;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.songqiao.waimai.alipay.common.AliPayConfig;
  5. import com.songqiao.waimai.alipay.payparameter.AliPay;
  6. import com.songqiao.waimai.common.BaseContext;
  7. import com.songqiao.waimai.common.R;
  8. import com.songqiao.waimai.entity.AddressBook;
  9. import com.songqiao.waimai.entity.Orders;
  10. import com.songqiao.waimai.mapper.AddressBookMapper;
  11. import com.songqiao.waimai.mapper.OrderMapper;
  12. import com.songqiao.waimai.service.impl.OrderServiceImpl;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.transaction.annotation.Transactional;
  15. import org.springframework.web.bind.annotation.GetMapping;
  16. import org.springframework.web.bind.annotation.PostMapping;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.RestController;
  19. import com.alipay.api.AlipayApiException;
  20. import com.alipay.api.AlipayClient;
  21. import com.alipay.api.DefaultAlipayClient;
  22. import com.alipay.api.request.AlipayTradePagePayRequest;
  23. import javax.annotation.Resource;
  24. import javax.servlet.http.HttpServletRequest;
  25. import javax.servlet.http.HttpServletResponse;
  26. import java.time.LocalDateTime;
  27. import java.util.Date;
  28. import java.util.HashMap;
  29. import java.util.Map;
  30. /**
  31. * @Author
  32. * @Date Created in 2023/5/5 15:23
  33. * @DESCRIPTION:
  34. * @Version V1.0
  35. */
  36. @RestController
  37. @RequestMapping("alipay")
  38. @Transactional(rollbackFor = Exception.class)
  39. public class AliPayController {
  40. @Resource
  41. AliPayConfig aliPayConfig;
  42. @Resource
  43. AddressBookMapper addressBookMapper;
  44. @Autowired
  45. OrderServiceImpl orderServiceImpl;
  46. private static final String GATEWAY_URL ="https://openapi-sandbox.dl.alipaydev.com/gateway.do";
  47. private static final String FORMAT ="JSON";
  48. private static final String CHARSET ="utf-8";
  49. private static final String SIGN_TYPE ="RSA2";
  50. @GetMapping("/pay") // 前端路径参数格式?subject=xxx&traceNo=xxx&totalAmount=xxx
  51. public void pay(AliPay aliPay, HttpServletResponse httpResponse) throws Exception {
  52. AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(),
  53. aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
  54. AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
  55. request.setNotifyUrl(aliPayConfig.getNotifyUrl());
  56. request.setReturnUrl(aliPayConfig.getReturnUrl());
  57. request.setBizContent("{\"out_trade_no\":\"" + aliPay.getTraceNo() + "\","
  58. + "\"total_amount\":\"" + aliPay.getTotalAmount() + "\","
  59. + "\"subject\":\"" + aliPay.getSubject() + "\","
  60. + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
  61. String form = "";
  62. try {
  63. // 调用SDK生成表单
  64. form = alipayClient.pageExecute(request).getBody();
  65. } catch (AlipayApiException e) {
  66. e.printStackTrace();
  67. }
  68. httpResponse.setContentType("text/html;charset=" + CHARSET);
  69. // 直接将完整的表单html输出到页面
  70. httpResponse.getWriter().write(form);
  71. httpResponse.getWriter().flush();
  72. httpResponse.getWriter().close();
  73. }
  74. @PostMapping("/notify") // 注意这里必须是POST接口
  75. public String payNotify(HttpServletRequest request) throws Exception {
  76. if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
  77. System.out.println("=========支付宝异步回调========");
  78. Map<String, String> params = new HashMap<>();
  79. Map<String, String[]> requestParams = request.getParameterMap();
  80. for (String name : requestParams.keySet()) {
  81. params.put(name, request.getParameter(name));
  82. }
  83. String tradeNo = params.get("out_trade_no");
  84. String gmtPayment = params.get("gmt_payment");
  85. String alipayTradeNo = params.get("trade_no");
  86. // 支付宝验签
  87. if (Factory.Payment.Common().verifyNotify(params)) {
  88. // 验签通过
  89. System.out.println("交易名称: " + params.get("subject"));
  90. System.out.println("交易状态: " + params.get("trade_status"));
  91. System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
  92. System.out.println("商户订单号: " + params.get("out_trade_no"));
  93. System.out.println("交易金额: " + params.get("total_amount"));
  94. System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
  95. System.out.println("买家付款时间: " + params.get("gmt_payment"));
  96. System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
  97. // 更新订单已支付的逻辑代码
  98. }
  99. }
  100. return "success";
  101. }
  102. }

 注意!在notify接口中的支付宝验签通过后,编写支付成功的逻辑。例如:修改订单状态、更新菜品销量、清空购物车等等。

2.3.4 编写AliPay.java  接收前端传来的参数
  1. package com.songqiao.waimai.alipay.payparameter;
  2. import lombok.Data;
  3. /**
  4. * @Author
  5. * @Date Created in 2024/1/13 15:26
  6. * @DESCRIPTION: alipay接口参数
  7. * @Version V1.0
  8. */
  9. @Data
  10. public class AliPay {
  11. //订单编号
  12. private String traceNo;
  13. //商品金额
  14. private double totalAmount;
  15. //商品名称
  16. private String subject;
  17. //订单追踪号,商户自己生成,可已不使用
  18. private String alipayTraceNo;
  19. }

 所有后端java代码已经over 你的代码结构应该是这样的:
 

        别忘了!咱们在application.yml中还有一个重要的参数 notifyUrl 没有配置,这个参数是支付成功后支付宝的回调函数访问本地系统的路径,需要以内网穿透的方式让支付宝访问本地系统。

3、使用natapp进行内网穿透

3.1 进入natapp官网注册账号,并进行实名认证、与支付宝账号进行绑定。

NATAPP-内网穿透 基于ngrok的国内高速内网映射工具natapp是基于ngrok的国内高速内网穿透专业服务商,独家彻底解决ngrok1.7内存泄漏问题.稳定拒绝掉线,适用于微信开发调试,本地架设演示服务器,外网可以访问,远程服务器,远程桌面,远程办公,游戏联机等icon-default.png?t=N7T8https://natapp.cn/

3.2 下载指定版本的natapp应用

我这里选用的是Windows 64位下载,下载并解压成功后的内容为:
3.2.1 运行natapp.exe

出现以下界面

3.2.2 配置natapp中的隧道

回到natapp官网,点击购买隧道->免费隧道->创建隧道并配置程序中的端口等信息


创建成功后点击我的隧道->点击配置->点击复制获取authtoken

 3.2.3 启动自己本机的web服务

在natapp.exe启动后的命令行输入natapp -authtoken=刚刚复制的token,就会与本机的8080端口映射成功!

出现如图所示状态后,那么恭喜你!外网即可访问你的本机的8080端口,支付宝api支付成功后即可完成回调!

3.3 配置application.yml中notifyUrl参数

把图中的代理地址填入即可完成全部后端的准备工作!咱们就可以去专心搞前端部分啦! 

4、支付宝沙箱支付前端Vue代码

调用后端接口并拼接get请求的参数,完成!

  1. async goToPaySuccess(){
  2. //在这里我选择了window.open(url,'_self')形式,也就是不跳转新的页面,在本页面直接跳转
  3. window.open("http://127.0.0.1:8080/alipay/pay?subject="+"邬先生东北菜,"+this.note+"&traceNo="+Math.floor(Math.random() * 900000) + 100000+"&totalAmount="+this.goodsPrice,'_self')
  4. },

5、启动项目并测试功能

点击支付按钮后跳转支付界面,为了避免被当做违规图片,我把二维码遮盖了。

注意!大坑!此时要求你登录的支付宝账号密码是支付宝沙箱的账号密码!不要混淆! 

支付宝沙箱账号密码在沙箱中查看!登录 - 支付宝欢迎登录支付宝,支付宝-全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验以及转账收款/水电煤缴费/信用卡还款等生活服务应用;为广大为从事电子商务的网站提供支付产品/支付服务的在线订购和技术支持等服务,帮助商家快速接入支付工具,高效、安全、快捷地开展电子商务。icon-default.png?t=N7T8https://open.alipay.com/develop/sandbox/account

 输入账号密码后即可进行付款~

确认付款后会有两种结果:1.付款成功界面 2.付款成功后跳转到你指定的页面(在前面的application.yml的配置中设置) 如果没有配置就会展示成功界面,配置了就会在几秒后跳转到你配置的界面中去!

 大功告成!

         创作不易,如果您喜欢这篇文章请点赞关注,如果在跟着博主实操的过程中出现了问题可以在评论区说明,我会第一时间回复你!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号