首先是依赖
com.alipay.sdk
alipay-sdk-java
关于支付宝的配置 也是你在第三方平台需要配置的
/**
- Copyright © 2018-2021
- All rights reserved, Designed By www.yixiang.co
*/
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;
/** 应用ID */
// @Column(name = “app_id”)
private String appId;
/** 编码 */
// @Column(name = “charset”)
private String charset;
/** 类型 固定格式json */
// @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 ResponseEntity<String> returnPage(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);
}
}