• 如何使用java调取支付宝沙箱实现模拟支付?


    最近做了一个基于springboot+thymeleaf的一个电商平台,涉及到缓存与支付的核心实现,关于缓存我们之前讲解过好多了比如redis的缓存性注解,秒杀功能的实现等等。

    今天主要的重点在于实现支付宝沙箱的调取!

    先看看内网穿透之后得到的支付页面:

    观察路由URL发现它是不是不在我们的本地端口上?没错它不是我们的内网,对于我们而言它是外网,对于它而言我们也是外网,从我们的外网想要访问到支付宝沙箱所在的内网,需要一定的权限或者内网穿透(采用隧道去访问)。

    所以这里会出现

     

    这样的错误码!

    怎么解决?去社区向支付宝开发者官方回复请求开放权限,其次对你的网段ip设置内网穿透协议。

    现在来上代码:(代码里会有注释)

    pojo层(订单实体类)

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. @Accessors(chain = true)
    5. public class Older {
    6. /**
    7. * 商户订单号,必填
    8. */
    9. private String out_trade_no;
    10. /**
    11. * 订单名称,必填
    12. */
    13. private String subject;
    14. /**
    15. * 付款金额,必填
    16. * 根据支付宝接口协议,必须使用下划线
    17. */
    18. private String total_amount;
    19. /**
    20. * 商品描述,可空
    21. */
    22. private String description;
    23. /**
    24. * 超时时间参数
    25. */
    26. private String timeout_express = "10m";
    27. /**
    28. * 产品编号
    29. */
    30. private String product_code = "FAST_INSTANT_TRADE_PAY";
    31. }

    不采用数据库所以不设置mapper或者dao层

    service层

    AliPayService接口与其实现类

    1. public interface AliPayService {
    2. String aliPay(Older older) throws AlipayApiException;
    3. }
    4. @Service
    5. public class AliPayServiceImpl implements AliPayService {
    6. @Autowired
    7. private Alipay alipay;
    8. @Override
    9. public String aliPay(Older older) throws AlipayApiException {
    10. return alipay.pay(older);
    11. }
    12. }

    controller层

    AlipayController

    1. @RestController
    2. public class PayController {
    3. @Autowired
    4. private AliPayService aliPayService;
    5. @RequestMapping("/order/form")
    6. public ModelAndView form(){
    7. return new ModelAndView("/pays/pay");
    8. }
    9. @PostMapping(value = "/order/alipay")
    10. public String alipay(String outTradeNo, String subject,
    11. String totalAmount, String description) throws AlipayApiException {
    12. Older older = new Older();
    13. older.setOut_trade_no(outTradeNo);
    14. older.setSubject(subject);
    15. older.setTotal_amount(totalAmount);
    16. older.setDescription(description);
    17. System.out.println(older);
    18. return aliPayService.aliPay(older);
    19. }
    20. @RequestMapping("/order/success")
    21. public ModelAndView success(){
    22. return new ModelAndView("/pays/success");
    23. }
    24. }

    config配置层

    组件AliPay

    1. @Component
    2. public class Alipay {
    3. @Autowired
    4. private AliPayConfig alipayConfig;
    5. public String pay(Older order) throws AlipayApiException {
    6. // 支付宝网关
    7. String serverUrl = alipayConfig.getGatewayUrl();
    8. // APPID
    9. String appId = alipayConfig.getAppId();
    10. // 商户私钥, 即PKCS8格式RSA2私钥
    11. String privateKey = alipayConfig.getPrivateKey();
    12. // 格式化为 json 格式
    13. String format = "json";
    14. // 字符编码格式
    15. String charset = alipayConfig.getCharset();
    16. // 支付宝公钥, 即对应APPID下的支付宝公钥
    17. String alipayPublicKey = alipayConfig.getPublicKey();
    18. // 签名方式
    19. String signType = alipayConfig.getSignType();
    20. // 页面跳转同步通知页面路径
    21. String returnUrl = alipayConfig.getReturnUrl();
    22. // 服务器异步通知页面路径
    23. String notifyUrl = alipayConfig.getNotifyUrl();
    24. // 1、获得初始化的AlipayClient
    25. AlipayClient alipayClient = new DefaultAlipayClient(
    26. serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
    27. // 2、设置请求参数
    28. AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
    29. // 页面跳转同步通知页面路径
    30. alipayRequest.setReturnUrl(returnUrl);
    31. // 服务器异步通知页面路径
    32. alipayRequest.setNotifyUrl(notifyUrl);
    33. // 封装参数(以json格式封装)
    34. alipayRequest.setBizContent(JSON.toJSONString(order));
    35. // 3、请求支付宝进行付款,并获取支付结果
    36. // 返回付款信息
    37. return alipayClient.pageExecute(alipayRequest).getBody();
    38. }
    39. }

    核心配置类AlipayConfig

    1. @Configuration
    2. @PropertySource("classpath:application-alipay.properties")
    3. @ConfigurationProperties(prefix = "alipay")
    4. @Data
    5. public class AliPayConfig {
    6. /**
    7. * APPID
    8. */
    9. private String appId;
    10. /**
    11. * 商户私钥, 即PKCS8格式RSA2私钥
    12. */
    13. private String privateKey;
    14. /**
    15. * 支付宝公钥
    16. */
    17. private String publicKey;
    18. /**
    19. * 服务器异步通知页面路径,需http://格式的完整路径
    20. * 踩坑:不能加?type=abc这类自定义参数
    21. */
    22. private String notifyUrl;
    23. /**
    24. * 页面跳转同步通知页面路径,需http://格式的完整路径
    25. * 踩坑:不能加?type=abc这类自定义参数
    26. */
    27. private String returnUrl;
    28. /**
    29. * 签名方式
    30. */
    31. private String signType;
    32. /**
    33. * 字符编码格式
    34. */
    35. private String charset;
    36. /**
    37. * 支付宝网关
    38. */
    39. private String gatewayUrl;
    40. // /**
    41. // * 日志打印地址
    42. // */
    43. // private String logPath;
    44. }

    跨域请求配置拦截器InterceptorConfig

    1. @Configuration
    2. public class InterceptorConfig implements WebMvcConfigurer {
    3. /*
    4. * 将跨域拦截器交给spring容器托管
    5. * @return: com.haust.online_class.interceptor.CorsInterceptor
    6. */
    7. @Bean
    8. public CorsInterceptor corsInterceptor() {
    9. return new CorsInterceptor();
    10. }
    11. @Override
    12. public void addInterceptors(InterceptorRegistry registry) {
    13. // 跨域拦截器注册(注意:跨域拦截器注册要放在最上方)
    14. registry.addInterceptor(corsInterceptor()).addPathPatterns("/**");
    15. WebMvcConfigurer.super.addInterceptors(registry);
    16. }
    17. }

    资源文件(重要!里面的信息是对应你沙箱里的信息)

    1. 沙箱appid
    2. alipay.appId:2021000120697782
    3. 支付宝应用私钥
    4. 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=
    5. 支付宝应用公钥
    6. alipay.publicKey:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAokCVOO+Q4k9QU14Q888ZW86BENfQwGrfQgP54GXEUkz3uNnmPjG1Z/Er3nncUhzsMC8A8C+d8WPsWj/XJQ/YnedUquy7131742qFwwBt/L0Xsx3MYqm8+Kyp3X7kMZMH5kPwtc95+d9iAZgkDHmYT90IZNsf0aXXiqCTO8iPLhDiMvb5xEHJn17TDaKFpRaCWuuAXHJ/NMtYjFvnZoz2HhlDhtVrkmN9ZR3Fk2juNH+LButcuefyc4qWnXCkX/PCyaOON1JtbxP1etgBKMmJJQ+bC0daeifVw5+TzvUUynVNjloPWCUPBfNbn3JQlGENP7RIHb1DR14GJpWl1Ig/5wIDAQAB
    7. 异步请求跳转地址
    8. alipay.notifyUrl:http://zxp4qs.natappfree.cc/order/alipay
    9. 请求结束回调地址(支付完毕跳转去哪里?)
    10. alipay.returnUrl:http://192.168.10.105:8080/User/login
    11. 算法类型
    12. alipay.signType:RSA2
    13. 编码格式
    14. alipay.charset:utf-8
    15. 支付宝网关
    16. alipay.gatewayUrl:https://openapi.alipaydev.com/gateway.do

    application.yml文件

    1. # 应用名称
    2. spring.application.name: pay
    3. # 应用服务 WEB 访问端口
    4. server.port: 8081
    5. spring:
    6. mvc:
    7. static-path-pattern: /static/**
    8. thymeleaf:
    9. #是否利用缓存
    10. cache: false
    11. mode: HTML5

    最后沙箱大家应该知道怎么开吧?其实就是简单去支付宝开发者社区注册一个,点击里面的管理中心去找沙箱应用,里面就会有这样的页面

    点击沙箱(资源文件里的信息就在这个地方!)

     

     OK!测试过,还不错!内网穿透可以搜索natapp官网,也可以在csdn学习相关的配置与使用方法!

     

  • 相关阅读:
    2022年0902Maven的依赖学习<第四课>
    Mybatis入门
    MybatisPlus 配置多数据源
    Java教程之String类的底层原理和版本演变
    计算机网络
    数字孪生技术最新八大应用实践方向
    高并发之网络IO模型
    软考是什么?-最全软考详解
    Linux防火墙之iptables(下)
    好物周刊#9:AI 学习必备资料
  • 原文地址:https://blog.csdn.net/m0_59588838/article/details/125423077