springboot 集成支付宝扫描支付

准备

       企业支付宝商家开通当面付、电脑支付产品,蚂蚁开发平台创建应用获取相关参数

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让前端转二维码,大功告成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值