java-支付寶電腦支付二

前期配置準備可參考該鏈接文檔:https://blog.csdn.net/weixin_42739916/article/details/104320830
 

1、設置支付寶環境參數,並導入支付SDK依賴

//支付寶環境參數設置
ali.pay.appId=AppID
ali.pay.appPrivateKey=應用私鑰
ali.pay.publicKey=支付寶公鑰
ali.pay.returnUrl=回調地址
ali.pay.notifyUrl=異步地址
ali.pay.gateway=網關(測試和正式環境的網關不同,需要注意)
ali.pay.signType=RSA2
ali.pay.charset=UTF-8
ali.pay.format=json
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.8.10.ALL</version>
</dependency>

2、請求實體類

package com.ganguomob.dev.dsprwpt.ui.dto.request.api.alipay;

import lombok.Data;

import java.math.BigDecimal;

/**
 * @author: create by luotj
 * date: 2019-12-25 18:39
 **/
@Data
public class AliPayRequest {

    //支付金額
    private BigDecimal totalAmount;

    //客戶支付編碼
    private String outTradeNo;

    //訂單名稱
    private String subject;

    //商品描述
    private String body;

    //充值記錄id
    private Long rechargeId;

    //支付方式:1.支付寶
    private Integer type;
}

3、校驗數據公共方法

    //校驗數據
    private void checkPayParamsValid(AliPayRequest params) {

        //訂單編碼不能爲空
        if (Strings.isBlank(params.getOutTradeNo())) {
            throw new RuntimeException(ErrorMessage.ALIPAY_ORDER_NUMBER_CAN_NOT_BE_BLANK);
        }
        //商品信息不能爲空
        if (Strings.isBlank(params.getBody())) {
            throw new RuntimeException(ErrorMessage.ALIPAY_PRODUCT_DES_CAN_NOT_BE_BLANK);
        }
        //訂單名稱不能爲空
        if (Strings.isBlank(params.getSubject())) {
            throw new RuntimeException(ErrorMessage.ALIPAY_SUBJECT_CAN_NOT_BE_BLANK);
        }
        //支付價格必須大於0
        if (params.getTotalAmount().compareTo(BigDecimal.ZERO) <= 0) {
            throw new RuntimeException(ErrorMessage.ALIPAY_TOTAL_FEE_MUST_GT_ZERO);
        }
    }

4、Controller層發起請求


5、Service層生成預支付,並返回信息給前端生成支付二維碼

package com.ganguomob.dev.dsprwpt.service.api.user;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import com.ganguomob.dev.dsprwpt.ui.dto.request.api.alipay.AliPayRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class UserServiceImpl{

@Value("${ali.pay.appId}")
private String appId;

@Value("${ali.pay.appPrivateKey}")
private String privateKey;

@Value("${ali.pay.publicKey}")
private String aliKey;

@Value("${ali.pay.returnUrl}")
private String returnUrl;

@Value("${ali.pay.notifyUrl}")
private String notifyUrl;

@Value("${ali.pay.gateway}")
private String gateWay;

@Value("${ali.pay.signType}")
private String signType;

@Value("${ali.pay.charset}")
private String charset;

@Value("${ali.pay.format}")
private String format;


//生成預支付邏輯方法
public String alipayPreCreate(AliPayRequest aliPayRequest) {
        log.info("預支付生成二維碼");
        //校驗數據
        checkPayParamsValid(aliPayRequest);
        //創建客戶端 
        AlipayClient alipayClient = new DefaultAlipayClient(gateWay, appId, privateKey, format,charset, aliKey, signType);
        //SDK中的請求實體類
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

        //判斷訂單號是否爲空
        Map<String, Object> paramMap = new HashMap<>();
        if (aliPayRequest.getOutTradeNo().isEmpty()) {
            paramMap.put("type", "2");
            paramMap.put("data", "訂單號不能爲空");
            return null;
        }
        //設置異步、回調地址
        request.setNotifyUrl(notifyUrl);
        request.setReturnUrl(returnUrl);

        //設置主要參數,參數說明參考文檔
        paramMap.put("timeout_express", "5m");
        paramMap.put("out_trade_no", aliPayRequest.getOutTradeNo());
        paramMap.put("total_amount", aliPayRequest.getTotalAmount().doubleValue());
        paramMap.put("subject", aliPayRequest.getSubject());
        //將數據轉換爲json數據,並設置到request中
        ObjectMapper mapper = new ObjectMapper();
        String qrCode = null;
        try {
            //發起預支付請求
            String bizContent = mapper.writeValueAsString(paramMap);
            request.setBizContent(bizContent);
            AlipayTradePrecreateResponse precreateResponse = alipayClient.execute(request);
            //獲取支付二維碼內容
            qrCode = precreateResponse.getQrCode();
        } catch (AlipayApiException e) {
            log.error("AlipayApiException,錯誤信息:{},ErrMsg:{},msg:{}",
                    e.getErrCode(), e.getErrMsg(), e.getMessage());
        } catch (JsonProcessingException e) {
            log.error("轉換數據失敗,錯誤信息:{}", e.getMessage());
        }
        //返回支付二維碼內容(前段根據該內容生成支付二維碼)
        return qrCode;
    }

    //校驗數據
    private void checkPayParamsValid(AliPayRequest params) {

        //訂單編碼不能爲空
        if (Strings.isBlank(params.getOutTradeNo())) {
            throw new RuntimeException("訂單編碼不能爲空");
        }
        //商品信息不能爲空
        if (Strings.isBlank(params.getBody())) {
            throw new RuntimeException("商品信息不能爲空");
        }
        //訂單名稱不能爲空
        if (Strings.isBlank(params.getSubject())) {
            throw new RuntimeException("訂單名稱不能爲空");
        }
        //支付價格必須大於0
        if (params.getTotalAmount().compareTo(BigDecimal.ZERO) <= 0) {
            throw new RuntimeException("支付價格必須大於0");
        }
    }
}

//待更新

發佈了58 篇原創文章 · 獲贊 18 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章