跳至主要內容

Springboot整合支付宝模拟支付

holic-x...大约 5 分钟碎片化碎片化

Springboot整合支付宝模拟支付

整合步骤说明

【1】注册支付宝账号开发者平台,创建web应用并配置

【2】创建springboot项目与支付宝沙箱整合,前后端配置

【3】使用natapp进行内网穿透(配置回调url映射路径)

【4】项目测试配置

支付宝账号开发者平台配置

支付宝账号开发者平台open in new window =》网页/移动应用open in new window =》创建应用

image-20240409123818764

应用创建完成,找到沙箱open in new window确认配置并启用公钥模式,启用后卡查看对应的应用私钥、应用公钥、支付宝公钥信息(对应项目中配置填充)

image-20240409124729138

项目构建&配置

创建springboot项目,引入支付宝相关依赖

<!--引入支付宝支付 -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-easysdk</artifactId>
            <version>2.2.1</version>
        </dependency>

        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.22.113.ALL</version>
        </dependency>

配置yml沙箱参数

#支付宝
alipay:
  appId: 
  appPrivateKey: 
  alipayPublicKey: 
  notifyUrl: 
  returnUrl: 
  • appId: 沙箱中的应用id
  • appPrivateKey: 应用私钥
  • alipayPublicKey: 支付宝公钥
  • notifyUrl: 调用支付宝支付接口后产生的回调,需要内网穿透(内网穿透地址+controller路径)
  • returnUrl: 支付成功后的页面跳转,设置成项目中的成功支付界面(可不填)

后端代码逻辑编写(启动端口8081与natapp映射一致)

// 代码结构
config
	- AliPayConfig.class
controller
	- AliPayController.class
entity
	- AliPay.class
    
// 项目配置
application.yml    
# 应用服务 WEB 访问端口
server:
  port: 8081

# 支付宝相关配置
alipay:
  appId: 应用ID
  appPrivateKey: 应用秘钥
  alipayPublicKey: 支付宝公钥
  notifyUrl: 调用支付宝接口之后产生的回调
  returnUrl: 支付成功后页面跳转url(默认是成功支付界面,可不填)
@Data
@Component
// 读取yml文件中alipay 开头的配置
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {
    private String appId;
    private String appPrivateKey;
    private String alipayPublicKey;
    //异步通知回调地址(可选)
    private String notifyUrl;
    //支付成功后的回调地址
    private String returnUrl;

    @PostConstruct
    public void init() {
        // 设置参数(全局只需设置一次)
        Config config = new Config();
        config.protocol = "https";
        config.gatewayHost = "openapi.alipaydev.com";
        config.signType = "RSA2";
        config.appId = this.appId;
        config.merchantPrivateKey = this.appPrivateKey;
        config.alipayPublicKey = this.alipayPublicKey;
        config.notifyUrl = this.notifyUrl;
        Factory.setOptions(config);
        System.out.println("=======支付宝SDK初始化成功=======");
    }

}

​ 此处需注意,如果后端做了权限校验拦截,则相应需要对支付宝跳转接口进行放行,不然拦截需要验证(registry.excludePathPatterns("/alipay/**");

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
        super.addResourceHandlers(registry);
    }

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(jwtInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login", "/user/register", "/**/export", "/**/import", "/file/**")
                .excludePathPatterns("/swagger**/**", "/webjars/**", "/v3/**", "/doc.html")
                .excludePathPatterns("/alipay/**");
        super.addInterceptors(registry);
    }

    @Bean
    public JwtInterceptor jwtInterceptor() {
        return new JwtInterceptor();
    }

}

http://127.0.0.1:9090/alipay/pay?subject=zhang&activityApplyId=68902&tourFee=100

natapp内网穿透

内网穿透配置

natapp应用open in new window:内网穿透,先注册账号并通过支付宝实名认证,下载软件到本地

image-20240409131320437

​ 购买隧道(可选择免费),随后在【我的隧道】选项卡查看信息,选择【配置】查看对应的authtoken

image-20240409134753492

启用本地web服务,测试网络是否打通

​ 在natapp.exe启动后的命令行输入natapp -authtoken=刚刚复制的token,就会与本机的8080端口(可自行配置)映射成功,外网即可访问本机的8080端口,支付宝api支付成功后即可完成回调,随后修改application.yml中的notifyUrl参数(设置为转发的Forwarding地址:内网穿透映射URL+接口地址(例如alipay/notify))

image-20240409133839732

前端代码配置

​ 前端设定:调用后端接口并拼接请求参数(vue项目配置修改参考思路:添加按钮,随后触发按钮事件跳转模拟支付)

async goToPaySuccess(){
    // 选择了window.open(url,'_self')形式,也就是不跳转新的页面,在本页面直接跳转
    window.open("http://127.0.0.1:8080/alipay/pay?subject="+"xxx先生,"+"缴纳费用"+"&traceNo="+Math.floor(Math.random() * 900000) + 100000+"&totalAmount="+100,'_self')
 },

项目启动测试

​ 点击支付按钮跳转支付界面,随后模拟付款回调:模拟登录=》模拟缴纳团费=》支付密码确认付款=》确认缴费信息=》自动跳转

​ 登录的支付宝账号密码是支付宝沙箱的账号密码,需要在对应位置查看支付宝沙箱账号信息open in new window

​ 随后输入密码模拟付款即可

​ 确认付款后会有两种结果:1.付款成功界面 2.付款成功后跳转到指定的页面(在application.yml的配置中设置) 如果没有配置就会展示成功界面,配置则自动跳转

image-20240409134653070

常见问题

常见问题:可参考支付宝技术支持帮助中心open in new window

请求业务参数需要按照支付宝指定规则定义(即符合支付宝接口要求),例如一些支付请求的参数必须按照约定定义,否则就会抛出相应的错误码提示。例如一下自定义参数无法正确传递或被错误地使用,而修改后的参数 “subject”、“traceNo” 和 “totalAmount” 符合支付宝的要求(例如定义了一个total_fee参数,用于接收付费信息,但是它不被认可,因为支付宝要求金额参数为totalAmount必须定义,所以将total_fee视为额外定义的业务参数,而支付宝要求定义的却没有传递导致出错)

​ 虽然测试接口调试断点其是正常接收的,但是不符合支付宝接口的参数标准因而报错

image-20240409183103636

支付宝支付流程成功但是没有跳转业务逻辑

​ 检查回调接口配置是否正常,natapp重启会自动分配url映射,可能会改变,需要相应调整转发映射的路径

image-20240410194138752

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3