最近做了一个基于springboot+thymeleaf的一个电商平台,涉及到缓存与支付的核心实现,关于缓存我们之前讲解过好多了比如redis的缓存性注解,秒杀功能的实现等等。
今天主要的重点在于实现支付宝沙箱的调取!
先看看内网穿透之后得到的支付页面:
观察路由URL发现它是不是不在我们的本地端口上?没错它不是我们的内网,对于我们而言它是外网,对于它而言我们也是外网,从我们的外网想要访问到支付宝沙箱所在的内网,需要一定的权限或者内网穿透(采用隧道去访问)。
所以这里会出现
这样的错误码!
怎么解决?去社区向支付宝开发者官方回复请求开放权限,其次对你的网段ip设置内网穿透协议。
现在来上代码:(代码里会有注释)
- @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层
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);
- }
- }
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");
- }
- }
组件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学习相关的配置与使用方法!