Files
Arbitrate-Backend/pay/src/main/java/com/ruoyi/ali/AlipayElegentValid.java
T
2023-09-09 16:50:34 +08:00

125 lines
4.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.ruoyi.ali;
import com.alipay.api.internal.util.AlipaySignature;
import com.ruoyi.annotation.TradePlatform;
import com.ruoyi.constant.Platform;
import com.ruoyi.core.ElegentValid;
import com.ruoyi.dto.ValidResponse;
import com.ruoyi.exceptions.TradeException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@Service
@TradePlatform(Platform.ALI)
@Slf4j
public class AlipayElegentValid implements ElegentValid {
@Autowired
private AlipayConfig alipayConfig;
/**
* 订单回调结果通知验签
* 参考代码: https://opendocs.alipay.com/open/194/103296?ref=api 异步返回结果的验签
* @param httpEntity
* @param httpRequest
* @return
*/
@Override
public ValidResponse validPay(HttpEntity<String> httpEntity, HttpServletRequest httpRequest) throws TradeException {
ValidResponse validResponse=new ValidResponse();
try {
Map<String, String> params = getParams(httpRequest);
//获取支付宝POST过来反馈信息,将异步通知中收到的待验证所有参数都存放到map中
//String body = httpEntity.getBody();
//调用SDK验证签名
//公钥验签示例代码
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getPublicKey(), "utf-8", alipayConfig.getSignType());
if (signVerified) {
validResponse.setValid(true);
validResponse.setOrderSn((String) params.get("out_trade_no"));
return validResponse;
} else {
validResponse.setValid(false);
validResponse.setOrderSn( (String) params.get("out_trade_no") );
return validResponse;
}
}catch (Exception e){
e.printStackTrace();
throw new TradeException("验签异常");
}
}
/**
* 退款结果通知验签
* 参考官网 https://opendocs.alipay.com/support/01ravh
* @param httpEntity
* @param httpRequest
* @return
* @throws TradeException
*/
@Override
public ValidResponse validRefund(HttpEntity<String> httpEntity, HttpServletRequest httpRequest) throws TradeException {
ValidResponse validResponse=new ValidResponse();
try {
//获取支付宝POST过来反馈信息,将异步通知中收到的待验证所有参数都存放到map中
Map<String, String> params = getParams(httpRequest);
//调用SDK验证签名
//公钥验签示例代码
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getPublicKey(), "utf-8", alipayConfig.getSignType());
if (signVerified) {
validResponse.setValid(true);
validResponse.setOrderSn( (String) params.get("out_trade_no") );
return validResponse;
} else {
validResponse.setValid(false);
validResponse.setOrderSn( (String) params.get("out_trade_no") );
return validResponse;
}
}catch (Exception e){
e.printStackTrace();
validResponse.setValid(false);
return validResponse;
}
}
private Map<String,String> getParams(HttpServletRequest httpServletRequest){
Map<String,String> params = new HashMap< String , String >();
Map requestParams = httpServletRequest.getParameterMap();
for(Iterator iter = requestParams.keySet().iterator(); iter.hasNext();){
String name = (String)iter.next();
String[] values = (String [])requestParams.get(name);
String valueStr = "";
for(int i = 0;i < values.length;i ++ ){
valueStr = (i==values.length-1)?valueStr + values [i]:valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put (name,valueStr);
}
log.info("params:{}",params);
return params;
}
@Override
public String successResult() {
return AlipayConstant.SUCCESS;
}
@Override
public String failResult() {
return AlipayConstant.FAIL;
}
}