0
点赞
收藏
分享

微信扫一扫

支付宝支付

书呆鱼 2022-04-25 阅读 180
java

首先是依赖

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);
    }
}
举报

相关推荐

0 条评论