前期配置準備可參考該鏈接文檔: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");
}
}
}