【Java】轻松解决支付宝沙箱问题。

简介: 本文详细介绍了如何使用Java实现支付宝沙箱支付功能,涵盖从环境搭建到代码实现的全过程

 🎙告诉你:Java是世界上最美好的语言

💎比较擅长的领域:前端开发

是的,我需要您的:

🧡点赞❤️关注💙收藏💛

是我持续下去的动力!


目录

一.了解各种地址

1.1 沙箱地址

1.2 官方文档

1.3 gitee项目学习

二 . 支付宝沙箱信息

三. 配置内网步骤

3.1 购买隧道

3.2 配置隧道

3.3 复制authtoken

编辑3.4 配置config.ini

3.5 配置config.ini修改authtoken

3.6 拷贝到authtoken

3.7 运行

3.8 结果

四. 完整版sdk 依赖

五 . 在application.yml 里面进行配置

六. 配置文件AlipayConfig.java

七. 参数AliPay.java

八. AliPayController.java

九. 实现回调功能

十.页面调用  

十一. 效果图


一.了解各种地址

1.1 沙箱地址

https://open.alipay.com/develop/sandbox/app

1.2 官方文档

https://opendocs.alipay.com/open/270/01didh

1.3 gitee项目学习

alipay-demo: 使用支付宝沙箱实现支付功能 - Gitee.com

二 . 支付宝沙箱信息

image.gif 编辑

image.gif 编辑 natapp地址

官网:https://natapp.cn/

下载:https://pan.baidu.com/s/1L99Ibawylnck4b4c0NtmXg?pwd=685x

三. 配置内网步骤

3.1 购买隧道

image.gif 编辑

3.2 配置隧道

image.gif 编辑

3.3 复制authtoken

image.gif 编辑3.4 配置config.ini

image.gif 编辑

3.5 配置config.ini修改authtoken

image.gif 编辑

3.6 拷贝到authtoken

image.gif 编辑

3.7 运行

image.gif 编辑

3.8 结果

image.gif 编辑

四. 完整版sdk 依赖

<dependency>
           <groupId>com.alipay.sdk</groupId>
           <artifactId>alipay-sdk-java</artifactId>
           <version>4.22.110.ALL</version>
       </dependency>
       <dependency>
           <groupId>cn.hutool</groupId>
           <artifactId>hutool-all</artifactId>
           <version>5.7.20</version>
       </dependency>

image.gif

五 . 在application.yml 里面进行配置

alipay:
appId: 9021000142654289
appPrivateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCBXHmjB4B6iUR+sQ9i7U1G17HByH1wmmwFKqCw3hajIKubVJwj6i5aaRzcjoeChJiMHqcCNs+2i9ZcLfMEcC2/my29VA/9XnGjpB21ZzdRMTxRKc95bL3nUpbR+ROej+cUUQcr1NV4dNm1giIFippi4TpCJtHYBztyBXZno4HJe/dq6POdGFTgzXeVxExAm8cL4t1GRVSzi7hRV70Xq14BKffRJErpzSg+x4l4qAnc2CcinP9H7aUxPdfMxVXku1wQjm1ExSbg4YNK0FoSqsR+NO2v97TwoBNKUXAw+Z/OyRXvn9pmB+0KysCSfZDJY+2TM41MdNzbDI+xWwmI7fVRAgMBAAECggEAYuH9WNFzNDeZU/6kdEpQt8ZI6ogG2vwvdgOPsaMSSr++bY3PjOSFajbPCQkqLGqO8Qy9PMQJItDhmrTE/q+BSOWloQOQ9WwsEZpx2yh68GViZeg/3+FviFNpVje+94Woba9CfA7E3r7za/t9Zh78xHjFv6tM3IUqu43RZIdnvksRxxctzFotsMDsoHy62O6I9bV4u2TkS8/unp4LXuYYOlcZK4eJGijjnEaePx7riI0WsBSJXK9fbvOlRuzjPjSkrO47f5zvmpXffq96+6NNrWhMk7FdpGM9JpPu09uTQNMkU2ceBULJllgGKoQ0vjm/CipoL/JTtvWcZoBjTt79AQKBgQD1C6nkbwrNl5I4x5RF98l1rv+mIBswXdepJBQefPLd6KfnMqfLwHfyqwAtMsySyiuQQ2Ctpa/7MTDaeXGWxrab6JL0uUwmbeMqqaZ1Oxlwu7K5pY5efO0szrmvIBX0bS6HckBsgItwgYcxx80hD4wy7/PXTtm2rUjV4vwsLbFwvQKBgQCHJOdNdxu0MymZEIgGgDV8mAKe0fX6jN8tReRQiUw1sG1cZmSuFbMVqc1wW3ULG4rTOkMjg18f/ieKeeiA1sM+Y+ZVO/S2lClNUq0n6aVkrl1G8srfyM9DpHgAo0YTZveoiefibV9NjrvZWL2FtTCekq85P8fF5XA6hV9jCu7yJQKBgDgOQv8Op9oAImL6xOB8noldTv4huhaGYR9AMZoH20cIQeCRpfDmRoostA2i4UlzFiQaRbNzg55i0looDeP/8SYZPgTdnp3r5VuNE5cdveQcC/aL+NWEnnzxjWiSXnNbxpkVecdYYI2ME/E/U52MgPXmDlHip8syOMc09ZrlmQHBAoGABsWeoY8aYElACF9/sXOzOm8TkonK3ac5d7dM3YxDuV0B3eNzoBWOR8Oee8bZcpkKt9LvklP+7Ed8C8BYGjyow/OVkyfR92QtPaaq7pkSpJzoJ6n66IPTfvw61y1XUZmTR2rBp+L7J5PDbfy4Yn7V1Nxc022SwSPiH8yXHwtpNdECgYBQrifFMVEBzIhi2rYzGEFYmwPIivFM49i7En1OxjjI6EdjkgehVfF2+Tq1XbhMEmIuHluitjwqVSt5jW/VJo3IQ68e2PK8DFG3hHCIHYsq+C3MvzplhWKYDapLKx1ySQTOY1Yokk7Lycp72MqOyOHVJjp/YkTZOQb4kr51+MVXlw==
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAialzjLbre28XpAcAlAhbq3dKvK02gnuHqK1uKXtqh/RuJgoO1rZ8gcw5fUD0qgBba4kWO6y/6or8Xsie1OLc5b2AiBK9LTbn3LRSaCwSPPoQOXq1fDOfbWeD8bFDlNDLLTV+LVRnwMuBJE0vPJGU1jCWy5G0YoIvoGaQcSHlFMq0bD3QBf7qi/OSXwbfpu40jKclvnaSOnn1ylHVFJhHgyzZNOHwaDvAk0F6RwIwakQdRQqfMLeoeQKHIUQcQvKtQkXohbY8AUb1lKWllYy6ge5AKlCMq9diMeftCDLvsubq4Aug1/hhgcyK5El3ERaFnADgUKCqyd3sHPp4IL+x8QIDAQAB
notifyUrl: http://qmqvmt.natappfree.cc/alipay/notify
returnUrl: http://localhost:8888/return

image.gif

image.gif 编辑

六. 配置文件AlipayConfig.java

只需要获取配置alipay的参数即可

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "alipay") //读取 配置值
public class AliPayConfig {
   private String appId; // appID
   private String appPrivateKey; // 应用私钥
   private String alipayPublicKey; // 支付宝公钥
   private String notifyUrl; // 支付成功后支付宝异步通知的接口地址
   private String returnUrl; // 支付成功之后返回的路径
  
   public String getReturnUrl() {
       return returnUrl;
  }
   public void setReturnUrl(String returnUrl) {
       this.returnUrl = returnUrl;
  }
   public String getAppId() {
       return appId;
  }
   public void setAppId(String appId) {
       this.appId = appId;
  }
   public String getAppPrivateKey() {
       return appPrivateKey;
  }
   public void setAppPrivateKey(String appPrivateKey) {
       this.appPrivateKey = appPrivateKey;
  }
   public String getAlipayPublicKey() {
       return alipayPublicKey;
  }
   public void setAlipayPublicKey(String alipayPublicKey) {
       this.alipayPublicKey = alipayPublicKey;
  }
   public String getNotifyUrl() {
       return notifyUrl;
  }
   public void setNotifyUrl(String notifyUrl) {
       this.notifyUrl = notifyUrl;
  }
}

image.gif

七. 参数AliPay.java

import lombok.Data;
@Data
public class AliPay {
   private String traceNo; // 我们自己生成的订单编号
   private double totalAmount;// 订单的总金额
   private String subject; // 支付的名称
   private String alipayTraceNo;
   public String getTraceNo() {
       return traceNo;
  }
   public void setTraceNo(String traceNo) {
       this.traceNo = traceNo;
  }
   public double getTotalAmount() {
       return totalAmount;
  }
   public void setTotalAmount(double totalAmount) {
       this.totalAmount = totalAmount;
  }
   public String getSubject() {
       return subject;
  }
   public void setSubject(String subject) {
       this.subject = subject;
  }
   public String getAlipayTraceNo() {
       return alipayTraceNo;
  }
   public void setAlipayTraceNo(String alipayTraceNo) {
       this.alipayTraceNo = alipayTraceNo;
  }
}

image.gif

八. AliPayController.java

注意看注释!

package com.kyh.controller;
import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.kyh.common.AliPayConfig;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//import javax.annotation.Resource; //jdk17不能用
//import javax.servlet.http.HttpServletRequest; //jdk17不能用
//import javax.servlet.http.HttpServletResponse; //jdk17不能用
import jakarta.annotation.Resource; // 17用 jakarta
import jakarta.servlet.http.HttpServletRequest; //用jakarta
import jakarta.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
// xjlugv6874@sandbox.com
// 9428521.24 - 30 = 9428491.24 + 30 = 9428521.24
@RestController
@RequestMapping("/alipay")
public class AliPayController {
   private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do"; //   支付宝网关地址,需要改成自己的网关,每个人不一样
   private static final String FORMAT = "JSON"; //   返回格式
   private static final String CHARSET = "UTF-8"; // 编码
   //签名方式
   private static final String SIGN_TYPE = "RSA2"; // 签名方式 密钥
   @Resource
   private AliPayConfig aliPayConfig;
   @GetMapping("/pay") // &subject=xxx&traceNo=xxx&totalAmount=xxx
   public void pay(AliPay aliPay, HttpServletResponse httpResponse) throws Exception {
        // alipay 接受传来的数据
       System.out.println(aliPayConfig.getAppId()+" "+ aliPayConfig.getAppPrivateKey());
       System.out.println(aliPayConfig.getAlipayPublicKey());
       // 测试输出
       
       // 1. 创建Client,通用SDK提供的Client,负责调用支付宝的API
       AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(),
               aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
       // 2. 创建 Request并设置Request参数
       AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();  // 发送请求的 Request类
       request.setNotifyUrl(aliPayConfig.getNotifyUrl()); // 支付成功后支付宝异步通知的接口地址
       request.setReturnUrl(aliPayConfig.getReturnUrl()); // 支付成功后跳转的页面 AliPayController.java的pay接口设置回调的url:request.setReturnUrl(aliPayConfig.getReturnUrl());
       JSONObject bizContent = new JSONObject();
       System.out.println(aliPay.getSubject()+" "+aliPay.getTraceNo()+" "+aliPay.getTotalAmount());
       bizContent.set("out_trade_no", aliPay.getTraceNo());  // 我们自己生成的订单编号
       bizContent.set("total_amount", aliPay.getTotalAmount()); // 订单的总金额
       bizContent.set("subject", aliPay.getSubject());   // 支付的名称
       bizContent.set("product_code", "FAST_INSTANT_TRADE_PAY");  // 固定配置
       request.setBizContent(bizContent.toString());
       // 执行请求,拿到响应的结果,返回给浏览器
       String form = "";
       try {
           form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单
      } catch (AlipayApiException e) {
           e.printStackTrace();
      }
       System.out.println("form="+form);
       httpResponse.setContentType("text/html;charset=" + CHARSET);
       httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面
       httpResponse.getWriter().flush();
       httpResponse.getWriter().close();
  }
   @PostMapping("/notify")  // 注意这里必须是POST接口
   public String payNotify(HttpServletRequest request) throws Exception {
       System.out.println("支付宝发出异步");
       if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
           System.out.println("=========支付宝异步回调========");
           Map<String, String> params = new HashMap<>();
           Map<String, String[]> requestParams = request.getParameterMap();
           for (String name : requestParams.keySet()) {
               params.put(name, request.getParameter(name));
               // System.out.println(name + " = " + request.getParameter(name));
          }
           String outTradeNo = params.get("out_trade_no");
           String gmtPayment = params.get("gmt_payment");
           String alipayTradeNo = params.get("trade_no");
           String sign = params.get("sign");
           String content = AlipaySignature.getSignCheckContentV1(params);
           boolean checkSignature = AlipaySignature.rsa256CheckContent(content, sign, aliPayConfig.getAlipayPublicKey(), "UTF-8"); // 验证签名
           // 支付宝验签
           if (checkSignature) {
               // 验签通过
               System.out.println("交易名称: " + params.get("subject"));
               System.out.println("交易状态: " + params.get("trade_status"));
               System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
               System.out.println("商户订单号: " + params.get("out_trade_no"));
               System.out.println("交易金额: " + params.get("total_amount"));
               System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
               System.out.println("买家付款时间: " + params.get("gmt_payment"));
               System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
               // 查询订单
//               update 表 修改DAO的数据
          }
      }
       return "success";
  }
}

image.gif

九. 实现回调功能

  • 加配置(前端支付页面的地址):alipay.returnUrl=http://localhost:8080/orders
  • AlipayConfig.java 加一个属性:returnUrl
  • AliPayController.java的pay接口设置回调的url:request.setReturnUrl(aliPayConfig.getReturnUrl());

十.页面调用  

window.open('http://localhost:9090/alipay/pay?traceNo=' + row.orderNo + "&totalAmount=" + row.price + '&subject=' + row.name)

以上即全部的内容,配置完之后就可以实现了!!!

十一. 效果图

image.gif 编辑


🎙告诉你:Java是世界上最美好的语言

💎比较擅长的领域:前端开发

是的,我需要您的:

🧡点赞❤️关注💙收藏💛

是我持续下去的动力!


相关文章
|
13天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
阿里云与企业共筑容器供应链安全
171328 12
|
16天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150294 32
|
24天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201959 14
对话 | ECS如何构筑企业上云的第一道安全防线
|
6天前
|
存储 人工智能 安全
对话|无影如何助力企业构建办公安全防护体系
阿里云无影助力企业构建办公安全防护体系
1251 8
|
1天前
|
机器学习/深度学习 自然语言处理 PyTorch
深入剖析Transformer架构中的多头注意力机制
多头注意力机制(Multi-Head Attention)是Transformer模型中的核心组件,通过并行运行多个独立的注意力机制,捕捉输入序列中不同子空间的语义关联。每个“头”独立处理Query、Key和Value矩阵,经过缩放点积注意力运算后,所有头的输出被拼接并通过线性层融合,最终生成更全面的表示。多头注意力不仅增强了模型对复杂依赖关系的理解,还在自然语言处理任务如机器翻译和阅读理解中表现出色。通过多头自注意力机制,模型在同一序列内部进行多角度的注意力计算,进一步提升了表达能力和泛化性能。
|
6天前
|
人工智能 自然语言处理 程序员
通义灵码2.0全新升级,AI程序员全面开放使用
通义灵码2.0来了,成为全球首个同时上线JetBrains和VSCode的AI 程序员产品!立即下载更新最新插件使用。
1262 23
|
8天前
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
|
6天前
|
消息中间件 人工智能 运维
1月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
506 21
1月更文特别场——寻找用云高手,分享云&AI实践
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
|
12天前
|
人工智能 自然语言处理 API
阿里云百炼xWaytoAGI共学课DAY1 - 必须了解的企业级AI应用开发知识点
本课程旨在介绍阿里云百炼大模型平台的核心功能和应用场景,帮助开发者和技术小白快速上手,体验AI的强大能力,并探索企业级AI应用开发的可能性。

热门文章

最新文章