1.支付宝沙箱是支付宝提供的一个模拟环境,它允许开发者在不会影响到真实支付宝账户和资金的情况下,测试支付宝的各种接口和功能。
首先展示一些支付效果,这里是一个订单页面,在点击支付按钮之后实现支付宝模拟支付。
点击之后跳出支付宝支付框,在这里登录自己的支付宝沙箱账号和自己的支付密码。
之后跳到另一个页面,输入自己的支付密码
输入完支付密码后支付完成的效果如下
之后跳回到自己的订单页面,可以发现订单状态更变为已支付。
以上就是完整的沙箱的完整演示效果,接下来带你手把手实现这样的功能。
1.首先我们要注册属于自己的沙箱账号并且在springboot中配置,登录 - 支付宝,这个网址可以注册自己的沙箱账号。
2.配置沙箱环境(springboot),在pom.xml中添加相关依赖
<!-- 支付宝沙箱-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.35.79.ALL</version>
</dependency>
<!-- cn-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.14</version>
</dependency>
3.在application.yml中配置支付宝(Alipay)的SDK配置,用于与支付宝的API进行交互。
appId
: 这是支付宝分配给开发者的应用ID,用于标识接入支付宝的应用。appPrivateKey
: 应用私钥,用于生成签名和验证支付宝返回的签名,确保数据传输的安全性。alipayPublicKey
: 支付宝的公钥,开发者用它来验证支付宝服务器发送的签名数据。notifyUrl
: 这是支付宝服务器在交易完成后向您的服务器发送通知的URL。这个URL必须提供可访问的公网地址,支付宝才能成功发送通知。
appId:使用自己的支付宝
appPrivateKey私钥:
alipayPublicKey公钥:
然后就是在配置文件中创建配置类AliPayConfig.java
package com.example.demo.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix ="alipay")
public class AliPayConfig {
private String appId;
private String appPrivateKey; // 属性名与getters/setters保持一致
private String alipayPublicKey;
private String notifyUrl; // 属性名与Java命名规范一致
// appId 的 getters 和 setters
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
// appPrivateKey 的 getters 和 setters
public String getAppPrivateKey() {
return appPrivateKey;
}
public void setAppPrivateKey(String appPrivateKey) {
this.appPrivateKey = appPrivateKey;
}
// alipayPublickey 的 getters 和 setters
public String getAlipayPublicKey() {
return alipayPublicKey;
}
public void setAlipayPublicKey(String alipayPublicKey) {
this.alipayPublicKey = alipayPublicKey;
}
// notifyUrl 的 getters 和 setters
public String getNotifyUrl() {
return notifyUrl;
}
public void setNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
}
}
4.创建AliPayController
package com.example.demo.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.example.demo.config.AliPayConfig;
import com.example.demo.entity.Orders;
import com.example.demo.service.OrdersService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/alipay")
public class AlipayController {
// 支付宝沙箱网关地址
// private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
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;
@Resource
private OrdersService ordersService;
private static final Logger logger = LoggerFactory.getLogger(AlipayController.class);
@GetMapping("/pay")
public void pay( @RequestParam String trackingNumber, HttpServletResponse httpResponse) throws Exception{
Orders orders = ordersService.getOrdersByTrackingNumber(trackingNumber);
if (orders == null){
return;
}
//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.setNotifyUrl(alipayConfig.getNotifyUrl());
JSONObject bizContent=new JSONObject();
bizContent.set("out_trade_no",orders.getTrackingNumber());
bizContent.set("total_amount",orders.getTotalAmount());
bizContent.set("subject",orders.getProductsJson());
bizContent.set("product_code","FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
request.setReturnUrl("http://localhost:8080/front/Order");
String form="";
try {
form=alipayClient.pageExecute(request).getBody();
}catch (AlipayApiException e){
e.printStackTrace();
}
httpResponse.setContentType("text/html;charset=" +CHARSET);
httpResponse.getWriter().write(form);
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
@PostMapping("/notify")
public void payNotify(HttpServletRequest request) throws Exception{
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));
}
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"));
String trackingNumber =params.get("out_trade_no");
// String payment =params.get("gmt_payment");
String alipayTradeNo =params.get("trade_no");
Orders orders=ordersService.getOrdersByTrackingNumber(trackingNumber);
orders.setPayStatus("已支付");
// orders.setOrderDate(payment);
//
ordersService.updateOrder(orders);
}
}
}
}
5.然后就是在前端自己去调用这两个方法
6.下载一个内网穿透NATAPP,NATAPP是一个内网穿透工具,它允许用户将内网中的服务映射到公网上,使得外部可以访问。下载完成后创建一个start.bat文件,编辑内容将authtoken换成自己的。
每次支付时要记得启动start.bat文件更换一些内网穿透的网址到自己的application文件中
版权归原作者 例外833 所有, 如有侵权,请联系我们删除。