Java对接支付宝全过程详解

Java对接支付宝全过程详解

支付宝是中国最流行的支付平台之一,本文将详细介绍如何使用Java对接支付宝支付功能,包括环境准备、SDK配置、支付流程实现以及常见问题解决方案。

1. 准备工作

1.1 申请支付宝开放平台账号

在开始开发前,需要完成以下准备工作:

  1. 注册支付宝开放平台账号:https://open.alipay.com

  2. 创建应用并获取必要的参数:

  3. APPID

  4. 应用私钥(RSA2)

  5. 支付宝公钥

  6. 支付宝网关地址

1.2 引入支付宝SDK

在Maven项目中添加支付宝SDK依赖:

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

2. 配置支付宝参数

创建配置类来管理支付宝相关参数:

package com.example.alipay.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AlipayConfig {
   
   
    // 应用ID,您的APPID
    @Value("${alipay.app-id}")
    private String appId;
    
    // 商户私钥,您的PKCS8格式RSA2私钥
    @Value("${alipay.merchant-private-key}")
    private String merchantPrivateKey;
    
    // 支付宝公钥
    @Value("${alipay.alipay-public-key}")
    private String alipayPublicKey;
    
    // 服务器异步通知页面路径,需http://格式的完整路径
    @Value("${alipay.notify-url}")
    private String notifyUrl;
    
    // 页面跳转同步通知页面路径,需http://格式的完整路径
    @Value("${alipay.return-url}")
    private String returnUrl;
    
    // 签名方式
    private String signType = "RSA2";
    
    // 字符编码格式
    private String charset = "utf-8";
    
    // 支付宝网关
    private String gatewayUrl = "https://openapi.alipay.com/gateway.do";
    
    // 支付宝网关
    @Value("${alipay.gateway-url:https://openapi.alipay.com/gateway.do}")
    public void setGatewayUrl(String gatewayUrl) {
   
   
        this.gatewayUrl = gatewayUrl;
    }
    
    // getter方法
    public String getAppId() {
   
   
        return appId;
    }
    
    public String getMerchantPrivateKey() {
   
   
        return merchantPrivateKey;
    }
    
    public String getAlipayPublicKey() {
   
   
        return alipayPublicKey;
    }
    
    public String getNotifyUrl() {
   
   
        return notifyUrl;
    }
    
    public String getReturnUrl() {
   
   
        return returnUrl;
    }
    
    public String getSignType() {
   
   
        return signType;
    }
    
    public String getCharset() {
   
   
        return charset;
    }
    
    public String getGatewayUrl() {
   
   
        return gatewayUrl;
    }
}

application.propertiesapplication.yml中配置相关参数:

# 支付宝配置
alipay.app-id=2021000000000000
alipay.merchant-private-key=MIIEvQIBADANBgkqhkiG9w0BAQEF...
alipay.alipay-public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ...
alipay.notify-url=http://your-domain.com/api/pay/alipay/notify
alipay.return-url=http://your-domain.com/api/pay/alipay/return
# 沙箱环境使用
# alipay.gateway-url=https://openapi.alipaydev.com/gateway.do

3. 创建支付宝服务类

package com.example.alipay.service;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.example.alipay.config.AlipayConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class AlipayService {
   
   

    private final AlipayConfig alipayConfig;
    private final AlipayClient alipayClient;

    @Autowired
    public AlipayService(AlipayConfig alipayConfig) {
   
   
        this.alipayConfig = alipayConfig;
        this.alipayClient = new DefaultAlipayClient(
                alipayConfig.getGatewayUrl(),
                alipayConfig.getAppId(),
                alipayConfig.getMerchantPrivateKey(),
                "json",
                alipayConfig.getCharset(),
                alipayConfig.getAlipayPublicKey(),
                alipayConfig.getSignType());
    }

    /**
     * 生成支付宝PC端支付表单
     *
     * @param outTradeNo  商户订单号
     * @param totalAmount 订单金额
     * @param subject     订单标题
     * @param body        订单描述
     * @return 支付表单HTML
     */
    public String createPagePayForm(String outTradeNo, String totalAmount, String subject, String body) throws AlipayApiException {
   
   
        // 创建API对应的request
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        // 设置回调地址
        alipayRequest.setReturnUrl(alipayConfig.getReturnUrl());
        alipayRequest.setNotifyUrl(alipayConfig.getNotifyUrl());

        // 填充业务参数
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();
        model.setOutTradeNo(outTradeNo);
        model.setTotalAmount(totalAmount);
        model.setSubject(subject);
        model.setBody(body);
        model.setProductCode("FAST_INSTANT_TRADE_PAY");
        alipayRequest.setBizModel(model);

        // 调用SDK生成表单
        return alipayClient.pageExecute(alipayRequest).getBody();
    }

    /**
     * 查询订单状态
     *
     * @param outTradeNo 商户订单号
     * @return 查询结果
     */
    public AlipayTradeQueryResponse queryOrder(String outTradeNo) throws AlipayApiException {
   
   
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        AlipayTradeQueryModel model = new AlipayTradeQueryModel();
        model.setOutTradeNo(outTradeNo);
        request.setBizModel(model);
        return alipayClient.execute(request);
    }

    /**
     * 退款
     *
     * @param outTradeNo   商户订单号
     * @param refundAmount 退款金额
     * @param refundReason 退款原因
     * @param outRequestNo 退款请求号
     * @return 退款结果
     */
    public AlipayTradeRefundResponse refund(String outTradeNo, String refundAmount, String refundReason, String outRequestNo) throws AlipayApiException {
   
   
        AlipayTr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qzw1210

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

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

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

打赏作者

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

抵扣说明:

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

余额充值