首先是依赖
com.alipay.sdk
alipay-sdk-java
关于支付宝的配置 也是你在第三方平台需要配置的
package co.yixiang.tools.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
@Data
@TableName(“alipay_config”)
public class AlipayConfig implements Serializable {
@TableId
// @Column(name = “id”)
private Long id;
// @Column(name = “app_id”)
private String appId;
// @Column(name = “charset”)
private String charset;
// @Column(name = “format”)
private String format;
// @Column(name = “gateway_url”)
private String gatewayUrl;
// @Column(name = “notify_url”)
private String notifyUrl;
// @Column(name = “private_key”)
private String privateKey;
// @Column(name = “public_key”)
private String publicKey;
// @Column(name = “return_url”)
private String returnUrl;
// @Column(name = “sign_type”)
private String signType;
// @Column(name = “sys_service_provider_id”)
private String sysServiceProviderId;
}
其次是我们需要 进行的 前端传过过来的 对象接受
包括价格 商品详细 订单号等等
public ResponseEntity toPayAsPc(@Validated@RequestBody TradeVo trade) throws Exception{
//获取到我们的支付宝配置
AlipayConfig aliPay = alipayService.find();
//这是设置一个唯一的支付编号和订单编号不同
trade.setOutTradeNo(alipayUtils.getOrderCode());
//这里是获得二维码链接 将配置和 订单甩里面去
String payUrl = alipayService.toPayAsPc(aliPay,trade);
return ResponseEntity.ok(payUrl);
}
public String toPayAsPc(AlipayConfig alipay, TradeVo trade) throws Exception {
if(alipay.getId() == null){
throw new BadRequestException("请先添加相应配置,再操作");
}
AlipayClient alipayClient = new DefaultAlipayClient(alipay.getGatewayUrl(), alipay.getAppId(), alipay.getPrivateKey(), alipay.getFormat(), alipay.getCharset(), alipay.getPublicKey(), alipay.getSignType());
// 创建API对应的request(电脑网页版)
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
// 订单完成后返回的页面和异步通知地址
request.setReturnUrl(alipay.getReturnUrl());
request.setNotifyUrl(alipay.getNotifyUrl());
// 填充订单参数
request.setBizContent("{" +
" "out_trade_no":""+trade.getOutTradeNo()+""," +
" "product_code":"FAST_INSTANT_TRADE_PAY"," +
" "total_amount":"+trade.getTotalAmount()+"," +
" "subject":""+trade.getSubject()+""," +
" "body":""+trade.getBody()+""," +
" "extend_params":{" +
" "sys_service_provider_id":""+alipay.getSysServiceProviderId()+""" +
" }"+
" }");//填充业务参数
// 调用SDK生成表单, 通过GET方式,口可以获取url
return alipayClient.pageExecute(request, "GET").getBody();
}
验证签名 看哈有没人恶意修改
public ResponseEntityreturnPage(HttpServletRequest request, HttpServletResponse response){ AlipayConfig alipay = alipayService.find(); response.setContentType("text/html;charset=" + alipay.getCharset()); //内容验签,防止黑客篡改参数 if(alipayUtils.rsaCheck(request,alipay)){ //商户订单号 String outTradeNo = new String(request.getParameter("out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); //支付宝交易号 String tradeNo = new String(request.getParameter("trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); System.out.println("商户订单号"+outTradeNo+" "+"第三方交易号"+tradeNo); // 根据业务需要返回数据,这里统一返回OK return new ResponseEntity<>("payment successful",HttpStatus.OK); }else{ // 根据业务需要返回数据 return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } }
异步回调用 拿到三方平台返回的结果
@RequestMapping(value = "/requestAliPay")
@ResponseBody
public String requestAliPay(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, AlipayApiException, UnknownHostException {
// 获取支付宝GET过来反馈信息
System.out.println("支付宝回调");
Map params = new HashMap();
Map requestParams = request.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("utf-8"), "utf-8");
params.put(name, valueStr);
}
String ALIPAY_PUBLIC_KEY = Global.getConfig("shop.pay.ALIPAY_PUBLIC_KEY");
boolean signVerified = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "utf-8", "RSA2"); // 调用SDK验证签名
//验证签名通过
if(signVerified){
// 商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 付款金额
String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");
System.out.println("商户订单号="+out_trade_no);
System.out.println("支付宝交易号="+trade_no);
System.out.println("付款金额="+total_amount);
//在这里处理自己的业务
return renderResult(Global.TRUE, "支付成功");
}else{
return renderResult(Global.FALSE, "支付失败");
}
}
最后结束



