首先是依赖
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);
}
}
异步回调用 拿到三方平台返回的结果
/**
* 支付宝支付回调
*/
@RequestMapping(value = "/requestAliPay")
@ResponseBody
public String requestAliPay(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, AlipayApiException, UnknownHostException {
// 获取支付宝GET过来反馈信息
System.out.println("支付宝回调");
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> 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, "支付失败");
}
}
最后结束
1万+

被折叠的 条评论
为什么被折叠?



