springboot集成第三方支付接入(APP支付、支付宝、IJPay)

第三方支付接入(APP支付、支付宝、IJPay)

一、使用工具

IJPay:https://javen205.gitee.io/ijpay/guide/

支付宝sdk:https://opendocs.alipay.com/open/270/106291

内网穿透工具:https://natapp.cn/

二、代码展示

沙箱以及证书生成可以参考【使用工具】中的网址,以下是默认配置好的情况

2.1 导入IJPay依赖

pom.xml

<properties>
    <!--第三方支付依赖版本-->
    <ijapy.version>2.8.0</ijapy.version>
</properties>
<dependencies>
    <!--支付相关-->
    <dependency>
        <groupId>com.github.javen205</groupId>
        <artifactId>IJPay-AliPay</artifactId>
        <version>${ijapy.version}</version>
    </dependency>

    <!-- 核心包,必须引入! -->
    <dependency>
        <groupId>com.github.javen205</groupId>
        <artifactId>IJPay-Core</artifactId>
        <version>${ijapy.version}</version>
    </dependency>
</dependencies>

2.2 创建需要用的实体类

PayWayInfoEntity

import lombok.*;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;

import java.io.Serializable;

/**
 * @author hollow
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(callSuper = true)
@SuperBuilder
@Accessors(chain = true)
public class PayWayInfoEntity implements Serializable {

    private static final long serialVersionUID = 493664191798244071L;

    /**
     * 应用编号
     */
    private String appId;

    /**
     * 应用私钥
     */
    private String privateKey;

    /**
     * 支付宝公钥,
     * 通过应用公钥上传到支付宝开放平台换取支付宝公钥
     * (如果是证书模式,公钥与私钥在CSR目录)。
     */
    private String publicKey;

    /**
     * 应用公钥证书 (证书模式必须)
     */
    private String appCertPath;

    /**
     * 支付宝公钥证书 (证书模式必须)
     */
    private String aliPayCertPath;

    /**
     * 支付宝根证书 (证书模式必须)
     */
    private String aliPayRootCertPath;

    /**
     * 支付宝支付网关
     */
    private String serverUrl;

    /**
     * 外网访问项目的域名,支付通知中会使用
     */
    private String domain;

    /**
     * 支付描述信息
     */
    private String body;
}

证书模式必须代表着你用公钥模式不必须~,这里只讲公钥模式

2.3 编写接口

RpcTcPayService

public interface RpcTcPayService {
    /**
     * app支付
     * @param payParams
     * @return
     */
    String appPay(PayParams payParams);
}

RpcTcPayServiceImpl

@Slf4j
@Component
@Service(timeout = 10000, interfaceClass = RpcTcPayService.class, filter = {"authFilter", "requestFilter"})
public class RpcTcPayServiceImpl implements RpcTcPayService {

    @Override
    public String appPay(PayParams payParams) {
        String price = payParams.getPayPrice();
        String orderNo = payParams.getOrderNo();
        String domain = payParams.getCallbackUrl();
        String body = payParams.getBody();
        String payWayId = payParams.getPayWayId();

        //暂时制作假数据 如果是多数据源可从数据库中获取
        PayWayInfoEntity payWayInfoEntity = new PayWayInfoEntity();
        payWayInfoEntity.setAppId("id")
            .setPrivateKey("私钥")
            .setPublicKey("公钥")
            .setAppCertPath("应用公钥证书")
            .setAliPayCertPath("")
            .setAliPayRootCertPath("")
            .setServerUrl("沙箱/正式url")
            .setDomain(domain)
            .setBody(body);
        this.setConfig(payWayInfoEntity);

        try {
            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
            model.setBody(payWayInfoEntity.getBody());
            model.setSubject(payWayInfoEntity.getBody());
            // 商户网站 唯一 订单号0
            model.setOutTradeNo(orderNo);
            // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:5m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m
            model.setTimeoutExpress("30m");
            // 订单总金额,单位为元,精确到小数点后两位
            model.setTotalAmount(price);
            String orderInfo = AliPayApi.appPayToResponse(model, payWayInfoEntity.getDomain()).getBody();
            log.info("支付宝支付参数 {}", orderInfo);
            return orderInfo;
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return "失败";
    }

    /**
     * 设置配置
     *
     * @param payWayInfoEntity
     */
    private void setConfig(PayWayInfoEntity payWayInfoEntity) {
        AliPayApiConfig aliPayApiConfig;
        try {
            aliPayApiConfig = AliPayApiConfigKit.getApiConfig(payWayInfoEntity.getAppId());
        } catch (Exception e) {
            aliPayApiConfig = AliPayApiConfig.builder()
                .setAppId(payWayInfoEntity.getAppId())
                .setAliPayPublicKey(payWayInfoEntity.getPublicKey())
                .setAppCertPath(payWayInfoEntity.getAppCertPath())
                .setAliPayCertPath(payWayInfoEntity.getAliPayCertPath())
                .setAliPayRootCertPath(payWayInfoEntity.getAliPayRootCertPath())
                .setCharset(CharsetTypeEnums.UTF_8.getType())
                .setPrivateKey(payWayInfoEntity.getPrivateKey())
                .setServiceUrl(payWayInfoEntity.getServerUrl())
                .setSignType(SignTypeEnums.RSA2.getType())
                // 普通公钥方式
                .build();
        }
        AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayApiConfig);
    }

PayParams这个传入参数类,可以根据传出的值自行定义,不一定要有,看代码中具体使用到的地方

这里给贴出来

PayParams

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 支付相关
 *
 * @author hollow
 */

@Data
@Accessors(chain = true)
public class PayParams {

    /**
     * order only id
     */
    private String orderNo;

    /**
     * receive pay money
     */
    private String payPrice;

    /**
     * use pay type
     */
    private String payWayId;

    /**
     * 回调数据
     */
    private String callbackUrl;

    /**
     * 主体信息
     */
    private String body;
}

2.4 编写测试类

    @Test
    void appPay() {
        String randomTradeNo = StringUtils.getOutTradeNo();
        PayParams payParams = new PayParams();
        payParams.setPayPrice("520")
                .setOrderNo(randomTradeNo)
                .setCallbackUrl("")
                .setBody("hollow test");
        String str = rpcTcPayService.appPay(payParams);
        System.out.println(str);
    }

这里的工具类大家可以自己写一下,就是生成随即订单号(唯一)

测试完毕后会返回一段String,将这个传给前端就完成了支付。关于之后的验签操作大家可以多参考IJPay的demo

gitee地址:https://gitee.com/javen205/IJPay/tree/master/IJPay-Demo-SpringBoot

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 首先,在支付宝开放平台上注册并创建一个应用,获取应用的AppID、商户私钥和支付宝公钥。 2. 在SpringBoot项目中,使用支付宝SDK集成支付宝支付功能。具体步骤如下: (1)引入支付宝SDK依赖: ```xml <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.3.0.ALL</version> </dependency> ``` (2)配置支付宝相关参数: ```properties alipay.app-id=应用的AppID alipay.private-key=商户私钥 alipay.public-key=支付宝公钥 alipay.gateway-url=https://openapi.alipay.com/gateway.do alipay.timeout=30m ``` (3)编写支付宝支付接口: ```java @RestController @RequestMapping("/api/pay") public class AlipayController { @Autowired private AlipayService alipayService; @PostMapping("/alipay") public String alipay(@RequestBody AlipayRequest request) { return alipayService.pay(request); } } ``` (4)在AlipayService中实现支付宝支付功能: ```java @Service public class AlipayServiceImpl implements AlipayService { @Autowired private AlipayClient alipayClient; @Override public String pay(AlipayRequest request) { AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest(); alipayRequest.setBizContent(request.getBizContent()); alipayRequest.setNotifyUrl(request.getNotifyUrl()); try { AlipayTradeAppPayResponse response = alipayClient.sdkExecute(alipayRequest); return response.getBody(); } catch (Exception e) { e.printStackTrace(); return null; } } } ``` 3. 在Vue项目中,使用支付宝SDK集成支付宝支付功能。具体步骤如下: (1)引入支付宝SDK: ```html <script src="https://g.alicdn.com/aliyun/alipay-sdk/15.7.1/alipay.min.js"></script> ``` (2)调用支付宝支付接口: ```javascript let params = { body: '测试商品', subject: '测试商品', outTradeNo: '20150320010101001', timeoutExpress: '30m', totalAmount: '0.01', productCode: 'QUICK_MSECURITY_PAY' }; alipay.pay(params, function(result){ // 支付成功 }, function(error){ // 支付失败 }); ``` 注意:支付宝支付需要在移动端进行,因此Vue项目需要使用Cordova或其他移动端框架打包成移动端应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值