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

最近做了一个基于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学习相关的配置与使用方法!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForestSpringH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值