Java网站如何集成支付宝当面付,企业个人都能使用的支付(比较简单)

news2024/11/8 12:02:35

创建应用

这个得先去登录 - 支付宝创建应用

相关配置设置

maven配置

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

支付服务代码

/**
 * 支付宝支付
 * @author leell
 * @date 2023/7/21 16:39:58
 */
public interface AliPayService {
    /**
     * 预下单
     * @return 返回二维码链接
     */
    String createPrecreateTrade(AliPrecreateParam param) throws RuntimeException;

    /**
     * 检查支付状态
     * @param orderNo 订单号
     * @return 支付状态 true:已支付 false:未支付
     */
    boolean checkAlipayStatus(String orderNo) throws RuntimeException;

    /**
     * 取消支付
     * @param orderNo 订单号
     * @return 取消状态
     */
    boolean cancelPay(String orderNo) throws RuntimeException;
    /**
     * 退款
     * @param orderNo 订单号
     * @return 取消状态
     */
    boolean refundPay(String orderNo, BigDecimal money) throws RuntimeException;

    /**
     * 验证签名
     * @param params 参数
     * @return 状态
     */
    boolean rsaCheckV1(Map<String,String> params) throws RuntimeException;

    /**
     * 检查回调支付状态
     * @param params 参数
     * @return 状态
     * @throws RuntimeException 异常
     */
    boolean checkNotifyPayStatus(Map<String,String> params) throws RuntimeException;

    /**
     * 获取订单号
     * @param params 支付宝返回参数
     * @return 订单号
     */
    String getOrderNo(Map<String,String> params);
}
/**
 * 支付宝支付
 *
 * @author leell
 * @date 2023/7/21 16:46:16
 */
@Service
public class AliPayServiceImpl implements AliPayService {
    @Autowired
    private PayHelper payHelper;
    @Autowired
    private ConfigService configService;

    @Override
    public String createPrecreateTrade(AliPrecreateParam param) throws RuntimeException {
        try {
            AlipayClient alipayClient = payHelper.getAlipayClient();
            AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
            //异步接收地址,仅支持http/https,公网可访问
            request.setNotifyUrl(param.getNotifyUrl());

            JSONObject bizContent = new JSONObject();
            bizContent.put("out_trade_no", param.getOutTradeNo());
            bizContent.put("total_amount", param.getTotalAmount());
            bizContent.put("subject", param.getSubject());
            request.setBizContent(bizContent.toString());
            AlipayTradePrecreateResponse response = alipayClient.execute(request);
            AssertUtil.isTrue(response.isSuccess(), response.getMsg());
            return response.getQrCode();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean checkAlipayStatus(String orderNo) throws RuntimeException {
        try {
            AlipayClient alipayClient = payHelper.getAlipayClient();
            AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
            JSONObject bizContent = new JSONObject();
            bizContent.put("out_trade_no", orderNo);
            bizContent.put("query_options", new String[]{"trade_settle_info"});
            request.setBizContent(bizContent.toString());
            AlipayTradeQueryResponse response = alipayClient.execute(request);
            JSONObject tradeResponse = JSONObject.parseObject(response.getBody()).getJSONObject("alipay_trade_query_response");
            String result = tradeResponse.getString("trade_status");
            return "TRADE_SUCCESS".equals(result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean cancelPay(String orderNo) throws RuntimeException {
        try {
            AlipayClient alipayClient = payHelper.getAlipayClient();
            AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
            JSONObject bizContent = new JSONObject();
            bizContent.put("out_trade_no", orderNo);
            request.setBizContent(bizContent.toString());
            AlipayTradeCancelResponse response = alipayClient.execute(request);
            return response.isSuccess();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean refundPay(String orderNo, BigDecimal money) throws RuntimeException {
        try {
            AlipayClient alipayClient = payHelper.getAlipayClient();
            AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
            JSONObject bizContent = new JSONObject();
            bizContent.put("refund_amount", money);
            bizContent.put("out_trade_no", orderNo);
            request.setBizContent(bizContent.toString());
            AlipayTradeRefundResponse response = alipayClient.execute(request);
            return response.isSuccess();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean rsaCheckV1(Map<String, String> params) throws RuntimeException {
        try {
            String alipayPublicKey = configService.getValue("pay_alipay_public_key");
            String charset = configService.getValue("pay_alipay_charset");
            String signType = configService.getValue("pay_alipay_signType");

            return AlipaySignature.rsaCheckV1(params, alipayPublicKey, charset, signType);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean checkNotifyPayStatus(Map<String, String> params) throws RuntimeException {
        // 取得支付宝POST过来的异步通知参数,进行验签
        // 注意:调用SDK验证签名需要使用支付宝公钥,不要使用自己生成的RSA公私钥对
        boolean verifyResult = this.rsaCheckV1(params);
        if (verifyResult) {
            // 验签通过
            String tradeStatus = params.get("trade_status");
            return "TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus);
        }
        return false;
    }

    @Override
    public String getOrderNo(Map<String, String> params) {
        // 处理交易成功的逻辑
        return params.get("out_trade_no");
    }
}

支付宝相关配置参数

我的后台服务采用的都是参数配置型,并没有放到yaml文件中。上面的appid primarykey和publickey signtype按照支付宝官网上找到自己的,对于特定的publickey和primarykey可以下载支付宝证书生成工具本地生成,然后同步到支付宝

当面付线上案例:

模板码-网站源码,源码下载,模板插件,商业源码平台 (mubanma.com)

惠集会-专业的宠物用品在线购物平台 (huijihui.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1164726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:Docker-yum安装(2)

yum在线安装 我这里使用的是centos7默认仓库 如果没有了&#xff0c;可以去下面这个链接下载回来 KALItarro/default-yum: centos7-默认yum仓库 (github.com)https://github.com/KALItarro/default-yum wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.…

【Git企业开发】第三节.Git的合并冲突

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Git企业级开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff0…

海外问卷调查现在还可以做吗?

可以做&#xff0c;海外问卷调查是一个稳定长期的互联网创业项目。 大家好&#xff0c;我是橙河&#xff0c;这篇文章讲一讲海外问卷调查现在还可以做吗&#xff1f; 海外问卷调查&#xff0c;简单来说&#xff0c;就是外国的商业公司对外发放的付费调查问卷&#xff0c;按照…

1,2,3,4,5 专家正上路

早在20世纪70年代&#xff0c;德雷福斯兄弟(Hubert Dreyfus和Stuart Dreyfus)就开始研究人类如何获取和掌握技能&#xff0c;他们考察了日常生活中常见的各项技能活动&#xff0c;如开车、下棋、体育运动等&#xff0c;提出了德雷福斯模型。它是种构建理论&#xff0c;概括了从…

第十六章 隐马尔科夫模型

文章目录 简介概念随机变量与随机过程马尔可夫链隐含马尔可夫模型两个基本假设三个基本问题 算法观测序列生成算法概率计算算法前向概率与后向概率前向算法后向算法小结 概率与期望 学习问题监督学习方法Baum-Welch算法 预测算法近似算法(MAP)维特比算法(Viterbi) 简介 动态贝叶…

java--this关键字

1.this是什么 this就是一个变量&#xff0c;可以用在方法中&#xff0c;来拿到当前对象(这个this就相当于你的车钥匙&#xff0c;当你在把车停到了车库&#xff0c;然后你发现找不到你的车的时候&#xff0c;就会按一下车钥匙&#xff0c;让你的车叫一下&#xff0c;你就会晓得…

《现代C++语言核心特性解析》笔记(一)

一、新基础类型&#xff08;C11&#xff5e;C20&#xff09; C基础类型回顾一览表 1. 整数类型 long long 我们知道long通常表示一个32位整型&#xff0c;而long long则是用来表示一个64位的整型。不得不说&#xff0c;这种命名方式简单粗暴。不仅写法冗余&#xff0c;而且表…

若依笔记(四):代码生成器

已知使用MyBatisPlus代码生成器可以自动生成Entity、Mapper、Service、Controller代码&#xff0c;前提是数据库中有数据表&#xff0c;生成pojo类以及对于该数据表的增删改查命令的代码&#xff0c;若依更进一步能选择表后生成代码、预览、下载&#xff0c;同时可以生产前端代…

构建强大的Web应用之Django详解

引言&#xff1a; Django是一个功能强大且灵活的Python Web框架&#xff0c;它提供了一套完整的工具和功能&#xff0c;帮助开发者快速构建高效的Web应用。本篇文章将带您逐步了解Django的基本概念和使用方法&#xff0c;并通过实际的代码案例&#xff0c;帮助您从零开始构建自…

【docker】安装xxl-job-admin调配中心

1.安装数据库&#xff08;注意版本号&#xff0c;这里选择版本2.3.1&#xff09; 1.1下载代码&#xff0c;并切换到2.3.1分支 1.2 打开并运行xxl-job/doc/db/tables_xxl_job.sql 2.编写docker-compose.yaml&#xff0c;并运行 1. docker-compose.yaml 2.将yaml放入Linux系…

滑模控制问题总结

设计切换函数/滑模面S&#xff08;x&#xff09; 线性&#xff1a; 滑模面参数确定方法&#xff1a;Hurwitz 保证多项式为Hurwitz&#xff0c;即特征值在左半平面。 主要适用于速度和精度要求都不高的非线性系统 非线性 《滑模变结构控制理论研究综述》 终端滑模控制&#xff1…

Redis事务管道

文章目录 Redis事务1.简介&#xff08;1&#xff09;什么是事务&#xff08;2&#xff09;Redis事务的特点 2.实操案例&#xff08;0&#xff09;事务命令&#xff08;1&#xff09;正常执行&#xff08;2&#xff09;放弃事务&#xff08;3&#xff09;全体连坐&#xff08;4&…

tiki靶机攻略

tiki靶机攻略 扫描 渗透 访问robots.txt 发现目录&#xff0c;访问一下 再次扫描/tiki/目录&#xff0c;然后发现changelog下又tiki的版本信息 kali漏洞搜索&#xff0c;找到一个符合版本的 python3 48927.py 10.4.7.159执行过后&#xff0c;显示不需要密码即可登录 随后bp登…

gd32f470zgt6最小系统 上哪找到

gd32f470zgt6最小系统 上哪找到

Docker 学习路线 2:底层技术

了解驱动Docker的核心技术将让您更深入地了解Docker的工作原理&#xff0c;并有助于您更有效地使用该平台。 Linux容器&#xff08;LXC&#xff09; Linux容器&#xff08;LXC&#xff09;是Docker的基础。 LXC是一种轻量级的虚拟化解决方案&#xff0c;允许多个隔离的Linux系…

VS Code 开发Java之代码导航和代码编辑

快速导航 VS Code提供了一些功能可以在Java开发时快速导航。 代码导航 大纲视图&#xff08;Outline view&#xff09;&#xff1a; 方便地导航当前文件中的成员项目视图&#xff08;Projects view&#xff09;&#xff1a; 项目的详细概述Java编辑器&#xff1a; 支持调用层…

模电学习路径

交流通路实质 列出电路方程1&#xff0c;方程1对时刻t做微分 所得方程1‘ 即为 交流通路 方程1对时刻t做微分&#xff1a;两个不同时刻的方程1相减&#xff0c;并 令两时刻差为 无穷小 微分 改成 差 模电学习路径&#xff1a; 理论 《电路原理》清华大学 于歆杰 朱桂萍 陆文…

3D模型格式转换工具HOOPS Exchange:如何将3D PDF转换为STEP格式?

3D CAD数据在制造、工程和设计等各个领域都扮演着重要的角色。为了促进不同软件应用程序之间的协作和互操作性&#xff0c;它通常以不同的格式进行交换。 HOOPS Exchange是一个强大的软件开发工具包&#xff0c;提供了处理和将3D CAD数据从一种格式转换为另一种格式的解决方案…

WoShop跨境电商源码:告别繁琐,一键实现批量发货

随着全球电子商务的飞速发展&#xff0c;越来越多的商家开始进军跨境电商领域。然而&#xff0c;搭建一个成功的跨境电商平台需要考虑众多因素&#xff0c;如订单处理、物流配送、支付结算等。在这个过程中&#xff0c;WoShop跨境电商源码因其强大的功能和简易的操作&#xff0…

NOIP2023模拟9联测30 金牌

题目大意 有一棵 n n n个顶点的树&#xff0c;这棵树上长度为 d d d的简单路径的价值为 2 d 2^d 2d。 有 q q q次询问&#xff0c;每次给出两个正整数 x , y x,y x,y&#xff0c;请你回答所有通过顶点 x x x和 y y y的简单路径的价值之和&#xff0c;输出答案模 998244353 99…