当前位置: 首页 > article >正文

springboot 集成支付宝扫描支付

准备

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

appId,privateKey,publicKey等参数。

集成SDK

        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.39.144.ALL</version>
        </dependency>

支付实现

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

回调函数

@RequestMapping("chargeBuy")
    public String alipayNotifyNo(HttpServletRequest request) throws AlipayApiException {
        // 解析支付宝回调请求参数
        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());
        }
        logger.info("会员充值回调 {}",requestParams);
        // 验证支付宝回调请求签名
        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<TnlMoneyDto>wrapper=new LambdaQueryWrapper<>();
            wrapper.eq(TnlMoneyDto::getOrderNo,outTradeNo);
            wrapper.eq(TnlMoneyDto::getStatus,0);
            TnlMoneyDto moneyDto=moneyMapper.selectOne(wrapper);
            if(ObjectUtil.isNotEmpty(moneyDto)){
                moneyDto.setStatus(1);
                moneyMapper.update(moneyDto,wrapper);
                //等级处理
                LambdaQueryWrapper<UserDto>queryWrapper=new LambdaQueryWrapper<>();
                queryWrapper.eq(UserDto::getId,moneyDto.getUId());
                UserDto userDto=userMapper.selectOne(queryWrapper);
                BigDecimal money= NumberUtil.add(userDto.getScore(), Convert.toBigDecimal(totalAmount));
                userDto.setScore(money);
                userMapper.update(userDto,queryWrapper);
            }
            // ...
            return "success";
        } else {
            return "fail";
        }
    }

测试结果

{
	"code": 200,
	"msg": "操作成功",
	"data": {
		"orderNo": "202410260909518307",
		"qrUrl": "https://qr.alipay.com/bax04786vowh4rmrehpr55b8"
	}
}

qrUrl让前端转二维码,大功告成。


http://www.kler.cn/news/367023.html

相关文章:

  • Kaggle 数据集dogs-vs-cats的错误
  • 高级SQL技巧掌握
  • 视频美颜平台的搭建指南:基于直播美颜SDK的完整解决方案
  • C++研发笔记8——C语言程序设计初阶学习笔记6
  • 论文略读:Not all Layers of LLMs are Necessary during Inference
  • C#的自定义Tip窗体 - 开源研究系列文章
  • 微博舆情数据分析(一)pandas + matplotlib 作图
  • 基于图像拼接算法及实现
  • 数据结构——插入排序
  • 数字图像处理(c++)-图像读取或者显示
  • 使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】
  • 【跨平台】ReactNative 入门初探
  • 「Qt Widget中文示例指南」如何实现半透明背景?
  • Android跨进程通信
  • Python中,lambda函数的用法是什么?
  • 基于Python+Django的气象数据分析与可视化系统
  • hive修改表操作与array类型
  • 详解Apache版本、新功能和技术前景
  • 【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机
  • SQLI LABS | Less-11 POST-Error Based-Single quotes-String
  • 机器学习认知包
  • 【Linux系统】进程的创建与程序计数器(PC指针)
  • windows DLL技术-DLL的更新和安全性
  • C++研发笔记8——C语言程序设计初阶学习笔记6
  • 028_Comma_Separated_List_in_Matlab中的逗号分割列表
  • electron 中 app 的 getName、setName 方法