最近做了一个基于springboot+thymeleaf的一个电商平台,涉及到缓存与支付的核心实现,关于缓存我们之前讲解过好多了比如redis的缓存性注解,秒杀功能的实现等等。
今天主要的重点在于实现支付宝沙箱的调取!
先看看内网穿透之后得到的支付页面:
观察路由URL发现它是不是不在我们的本地端口上?没错它不是我们的内网,对于我们而言它是外网,对于它而言我们也是外网,从我们的外网想要访问到支付宝沙箱所在的内网,需要一定的权限或者内网穿透(采用隧道去访问)。
所以这里会出现
这样的错误码!
怎么解决?去社区向支付宝开发者官方回复请求开放权限,其次对你的网段ip设置内网穿透协议。
现在来上代码:(代码里会有注释)
pojo层(订单实体类)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Older {
/**
* 商户订单号,必填
*/
private String out_trade_no;
/**
* 订单名称,必填
*/
private String subject;
/**
* 付款金额,必填
* 根据支付宝接口协议,必须使用下划线
*/
private String total_amount;
/**
* 商品描述,可空
*/
private String description;
/**
* 超时时间参数
*/
private String timeout_express = "10m";
/**
* 产品编号
*/
private String product_code = "FAST_INSTANT_TRADE_PAY";
}
不采用数据库所以不设置mapper或者dao层
service层
AliPayService接口与其实现类
public interface AliPayService {
String aliPay(Older older) throws AlipayApiException;
}
@Service
public class AliPayServiceImpl implements AliPayService {
@Autowired
private Alipay alipay;
@Override
public String aliPay(Older older) throws AlipayApiException {
return alipay.pay(older);
}
}
controller层
AlipayController
@RestController
public class PayController {
@Autowired
private AliPayService aliPayService;
@RequestMapping("/order/form")
public ModelAndView form(){
return new ModelAndView("/pays/pay");
}
@PostMapping(value = "/order/alipay")
public String alipay(String outTradeNo, String subject,
String totalAmount, String description) throws AlipayApiException {
Older older = new Older();
older.setOut_trade_no(outTradeNo);
older.setSubject(subject);
older.setTotal_amount(totalAmount);
older.setDescription(description);
System.out.println(older);
return aliPayService.aliPay(older);
}
@RequestMapping("/order/success")
public ModelAndView success(){
return new ModelAndView("/pays/success");
}
}
config配置层
组件AliPay
@Component
public class Alipay {
@Autowired
private AliPayConfig alipayConfig;
public String pay(Older order) throws AlipayApiException {
// 支付宝网关
String serverUrl = alipayConfig.getGatewayUrl();
// APPID
String appId = alipayConfig.getAppId();
// 商户私钥, 即PKCS8格式RSA2私钥
String privateKey = alipayConfig.getPrivateKey();
// 格式化为 json 格式
String format = "json";
// 字符编码格式
String charset = alipayConfig.getCharset();
// 支付宝公钥, 即对应APPID下的支付宝公钥
String alipayPublicKey = alipayConfig.getPublicKey();
// 签名方式
String signType = alipayConfig.getSignType();
// 页面跳转同步通知页面路径
String returnUrl = alipayConfig.getReturnUrl();
// 服务器异步通知页面路径
String notifyUrl = alipayConfig.getNotifyUrl();
// 1、获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(
serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
// 2、设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
// 页面跳转同步通知页面路径
alipayRequest.setReturnUrl(returnUrl);
// 服务器异步通知页面路径
alipayRequest.setNotifyUrl(notifyUrl);
// 封装参数(以json格式封装)
alipayRequest.setBizContent(JSON.toJSONString(order));
// 3、请求支付宝进行付款,并获取支付结果
// 返回付款信息
return alipayClient.pageExecute(alipayRequest).getBody();
}
}
核心配置类AlipayConfig
@Configuration
@PropertySource("classpath:application-alipay.properties")
@ConfigurationProperties(prefix = "alipay")
@Data
public class AliPayConfig {
/**
* APPID
*/
private String appId;
/**
* 商户私钥, 即PKCS8格式RSA2私钥
*/
private String privateKey;
/**
* 支付宝公钥
*/
private String publicKey;
/**
* 服务器异步通知页面路径,需http://格式的完整路径
* 踩坑:不能加?type=abc这类自定义参数
*/
private String notifyUrl;
/**
* 页面跳转同步通知页面路径,需http://格式的完整路径
* 踩坑:不能加?type=abc这类自定义参数
*/
private String returnUrl;
/**
* 签名方式
*/
private String signType;
/**
* 字符编码格式
*/
private String charset;
/**
* 支付宝网关
*/
private String gatewayUrl;
// /**
// * 日志打印地址
// */
// private String logPath;
}
跨域请求配置拦截器InterceptorConfig
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
/*
* 将跨域拦截器交给spring容器托管
* @return: com.haust.online_class.interceptor.CorsInterceptor
*/
@Bean
public CorsInterceptor corsInterceptor() {
return new CorsInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 跨域拦截器注册(注意:跨域拦截器注册要放在最上方)
registry.addInterceptor(corsInterceptor()).addPathPatterns("/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
}
资源文件(重要!里面的信息是对应你沙箱里的信息)
沙箱appid
alipay.appId:2021000120697782
支付宝应用私钥
alipay.privateKey:MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHEbt5DRB+vz1n4mAdjDll/VpBxcoT0Ur/crZdNjH7tINW+t2LYUz4p0bNJLgrRWfzteBg5y1y1WoWnc+9f/Bx0QL/0k5S+Riwnd2K3k5oANqg3SLvGx2KRRx3K/npTi6Ye78vr6KxbW9+wvsareBO6ha7bS9ssKWeOapO6x1OWBEW32X+LIsLMNuc+GcZ0SGvo/m9R19DtMiuxqnAiSVHobRZZskyAHq4USg1+94m6Tc74UQtRJNwklKBsI8omZRLVzZwGLpIvr5Ory2UXjXcsh+0ATZA/aNC8SDidmR+dvd1QFMrmxsLe0K7I432tYlJnYjdt/Q+ncrGUER5MEMtAgMBAAECggEAeT1+hXMnqk3pRbWaxwsWfqkC+mUbNdy5MED81wCNrz1iY5H9iV4GpHAqinv6YMUFQWqxhOoeDqTofHKdhaEw6ElQIufY7HuyIN8jfMJ9qLeTh6/X6r7xLitJGOO9iSFni/IQNDK4nAD6gtNsaI9I+C0ByK2CU1Lg5v0mFX7QKIBtc0/zgcjgBWjmTnI+T95XMT3kS8yT2lRr3qF0RrruouO1WoR/D1z0ZzZmNUfwjq1T995mfACrphb/AxVUyCke9b7SG6PGCIgARXdUseT8UgBdBd9erBpD/NbR1lmNRVzxeZ6ZZkqCxva5Tdlt7LpfIkWsDGj1VmEW+QTadUoOAQKBgQDWLZDQIakRuVQkYjtIc2ZnSAlMKzBUu3qlTk5XCOAH4o3wGlfUMvB2zF/5vMdUgszPJMdCbuNVWkuQh70FUBvUZg2UlZNi+W/vEdoV0xwdj32HHjkQWEByBXhAu1y0qX05ADpB/7ntot3La4DkqJbc/VD39tLncjZC2mNg1YGprQKBgQChcaQX9TiaXrnsvuT6eByMfuGeJ15Pp9dg/RRCcOwPeXEefwMl8gL5YqZbF+C6Z20oul5iW/x72RaMdVJeLZpf9SwlPUr7MxCcZOjJv7pOefte2XeWE96S/RAXZJ1pUi27CMGgi17LZGwU0MmfnPaiHLavrVaqmZL+n6T3Q98vgQKBgECCCtrVOJHxCunGeGqS72XuKXa6j10F9qOxWSEXuDpHv05w8MEl8o0lc0bJ2BOZLcy6HBXjRi9f+eB3MbRW83renfqBrpmh3VfZPaFTK2Wv4TQAI1nL6uUsxpJgnESBxAiWC/Xy6vIrGrh5EaJNMNswpOF6gv1YxgUOt93jkKElAoGAaX4gg6cxPW34f8KdTS1/Oi8OrpF7BwHdsvqsal3vYo0wZYUJQZpKZzsXCR8pMaSzp5Fga1VAPo00NsPS9sdFwL4sAolynYJYsFkf4/TsgKsknm3rvp1tKw9BnIeadF/Gkhi+rXFkl/MezNtBZJLkdjndBh52KzP+4XLgENLA3AECgYEAnAeL70s4IxAD+BUc3bJiVtDCM3eXyg36ndwaEVx+BLV1kfaFAq8oB9sdsd9AUNQj3cr29Q1MBg9I7A01irpsAHC4aIhOa2HH7rg2LoeVHkFXEB5UsXmyRbJbI/tkpapbC1b/7najolf81J2XYYRFPPbE3PnFgZA1yBiWrgUSbQM=
支付宝应用公钥
alipay.publicKey:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAokCVOO+Q4k9QU14Q888ZW86BENfQwGrfQgP54GXEUkz3uNnmPjG1Z/Er3nncUhzsMC8A8C+d8WPsWj/XJQ/YnedUquy7131742qFwwBt/L0Xsx3MYqm8+Kyp3X7kMZMH5kPwtc95+d9iAZgkDHmYT90IZNsf0aXXiqCTO8iPLhDiMvb5xEHJn17TDaKFpRaCWuuAXHJ/NMtYjFvnZoz2HhlDhtVrkmN9ZR3Fk2juNH+LButcuefyc4qWnXCkX/PCyaOON1JtbxP1etgBKMmJJQ+bC0daeifVw5+TzvUUynVNjloPWCUPBfNbn3JQlGENP7RIHb1DR14GJpWl1Ig/5wIDAQAB
异步请求跳转地址
alipay.notifyUrl:http://zxp4qs.natappfree.cc/order/alipay
请求结束回调地址(支付完毕跳转去哪里?)
alipay.returnUrl:http://192.168.10.105:8080/User/login
算法类型
alipay.signType:RSA2
编码格式
alipay.charset:utf-8
支付宝网关
alipay.gatewayUrl:https://openapi.alipaydev.com/gateway.do
application.yml文件
# 应用名称
spring.application.name: pay
# 应用服务 WEB 访问端口
server.port: 8081
spring:
mvc:
static-path-pattern: /static/**
thymeleaf:
#是否利用缓存
cache: false
mode: HTML5
最后沙箱大家应该知道怎么开吧?其实就是简单去支付宝开发者社区注册一个,点击里面的管理中心去找沙箱应用,里面就会有这样的页面
点击沙箱(资源文件里的信息就在这个地方!)
OK!测试过,还不错!内网穿透可以搜索natapp官网,也可以在csdn学习相关的配置与使用方法!