准备
企业支付宝商家开通当面付、电脑支付产品,蚂蚁开发平台创建应用获取相关参数
appId,privateKey,publicKey等参数。
1.集成SDK
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.39.144.ALL</version>
</dependency>
2. Yaml配置文件,参数配置
alipay:
appId: xxxxxxxxx 替换你申请应用appid
notifyUrl: xxxxxxxxxxxxx 回调地址 该处根据情况可写可不写
privateKey: xxxxx 替换为你申请应用私钥
publicKey: xxxxx 替换为你申请应用公约
3.支付宝支付工具类
public class AlipayService {
@Value("${alipay.appId}")
private String appId;
@Value("${alipay.privateKey}")
private String privateKey;
@Value("${alipay.publicKey}")
private String publicKey;
public String pay(String orderNo,BigDecimal amount,String notifyUrl,String title) {
// 构造请求参数
AlipayClient client = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
appId, privateKey, "json", "utf-8", publicKey, "RSA2");
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
// 异步通知
request.setNotifyUrl(notifyUrl);
//String orderNo= TouUtil.getOrderNo();
//request.setBizContent("{\"out_trade_no\":\"" + orderNo + "\",\"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
//"\"total_amount\":\"" + amount + "\",\"subject\":\"商品\"}");
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo(orderNo);
model.setTotalAmount(String.valueOf(amount));
model.setSubject(title);
request.setBizModel(model);
// 发起支付请求
try {
AlipayTradePrecreateResponse response = client.execute(request);
if (response.isSuccess()) {
//插入记录
// 获取二维码链接
String qrCode = response.getQrCode();
// 返回或展示二维码链接
return qrCode;
} else {
throw new SystemException("创建预支付交易单失败:" + response.getSubMsg());
}
//return client.pageExecute(request).getBody();
} catch (AlipayApiException e) {
throw new RuntimeException(e);
}
}
}
4. service层,支付类调用
payUrl=alipayService.pay(moneyDto.getOrderNo(),moneyDto.getPrice(),notifyUrl,"文档购买");
5. 支付成功后处理逻辑
@RestController
@RequestMapping("/api/notify/")
public class NotifyController {
private final static Logger logger= LoggerFactory.getLogger(NotifyController.class);
@Value("${alipay.publicKey}")
private String publicKey;
@Autowired
private TnlMoneyMapper moneyMapper;
@Autowired
private TnlChargeMapper chargeMapper;
@Autowired
private UserMapper userMapper;
//文档购买
@RequestMapping("fileBuy")
public String alipayNotify(HttpServletRequest request) throws AlipayApiException {
// 解析支付宝回调请求参数
Map<String, String> params = parseAliXml(request);
// 验证支付宝回调请求签名
boolean verifyResult = AlipaySignature.rsaCheckV1(params, publicKey, "utf-8", "RSA2");
if (verifyResult) {
// 处理支付宝回调请求
String outTradeNo = params.get("out_trade_no");
String tradeNo = params.get("trade_no");
String totalAmount = params.get("total_amount");
logger.info("文档购买回调 {}",outTradeNo);
//查询购买记录
LambdaQueryWrapper<TnlChargeDto>wrapper=new LambdaQueryWrapper<>();
wrapper.eq(TnlChargeDto::getOrderNo,outTradeNo);
wrapper.eq(TnlChargeDto::getStatus,0);
TnlChargeDto chargeDto=chargeMapper.selectOne(wrapper);
if(ObjectUtil.isNotEmpty(chargeDto)){
chargeDto.setStatus(1);
chargeMapper.update(chargeDto,wrapper);
//余额记录更新
LambdaQueryWrapper<TnlMoneyDto>wrapper2=new LambdaQueryWrapper<>();
wrapper2.eq(TnlMoneyDto::getOrderNo,outTradeNo);
TnlMoneyDto moneyDto2=moneyMapper.selectOne(wrapper2);
moneyDto2.setStatus(1);
moneyMapper.update(moneyDto2,wrapper2);
}
return "success";
} else {
return "fail";
}
}
}
6. 支付宝支付参数工具
private Map<String, String> parseAliXml(HttpServletRequest request) {
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
String[] values = requestParams.get(name);
StringBuilder valueStr = new StringBuilder();
for (int i = 0; i < values.length; i++) {
valueStr.append((i == values.length - 1) ? values[i] : values[i] + ",");
}
params.put(name, valueStr.toString());
}
return params;
}
7. 测试结果
{
"code": 200,
"msg": "操作成功",
"data": {
"orderNo": "202410260909518307",
"qrUrl": "https://qr.alipay.com/bax04786vowh4rmrehpr55b8"
}
}
qrUrl让前端转二维码,大功告成。