2024 微信支付公钥 JAVA完整代码参考

需要用到的链接:

微信支付公钥使用介绍 - 平台证书 | 微信支付商户文档中心

GitHub - wechatpay-apiv3/wechatpay-java: 微信支付 APIv3 的官方 Java Library

谨记 如果有疑问 多看几遍 wechatpay-java的readme 和 example

 

创建预支付

 @Overridepublic ResultBean<OrderPaymentVO> payment(OrderPaymentParam orderPaymentParam, String platform) {log.info("===== 生成预支付订单,参数:{},platform:{}", orderPaymentParam, platform);// 初始化商户配置//  用于公钥//Config config =//        new RSAPublicKeyConfig.Builder()//                .merchantId(merchantId)//                .privateKeyFromPath(privateKeyPath)//                .publicKeyFromPath(publicKeyPath)//                .publicKeyId(publicKeyId)//                .merchantSerialNumber(merchantSerialNumber)//                .apiV3Key(apiV3Key)//                .build();//  用于秘钥 会自动下载证书 - 暂时不适用// Config config =//        new RSAAutoCertificateConfig.Builder()//                .merchantId(merchantId)//                .privateKeyFromPath(privateKeyPath)//                .merchantSerialNumber(merchantSerialNumber)//                .apiV3Key(apiV3Key)//                .build();Config config =new RSAConfig.Builder().merchantId(merchantId).privateKeyFromPath(privateKeyPath).merchantSerialNumber(merchantSerialNumber).wechatPayCertificatesFromPath(wechatPayCertificatePath).build();// 初始化服务//service = new JsapiService.Builder().config(config).build();JsapiServiceExtension service = new JsapiServiceExtension.Builder().config(config).build();//调用微信支付接口,生成预支付交易单PrepayRequest request = new PrepayRequest();// 设置支付者Payer payer = new Payer();payer.setOpenid(openId);request.setPayer(payer);//设置金额Amount amount = new Amount();amount.setCurrency("CNY");amount.setTotal(payInfo.getAmount().multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP).intValue());request.setAmount(amount);// appidrequest.setAppid(mircoAppid);request.setDescription(payInfo.getSubject());request.setOutTradeNo(orderPaymentParam.getApplyId());request.setMchid(merchantId);request.setNotifyUrl(notifyUrl);// 发起请求PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);//构造数据给微信小程序,用于调起微信支付JSONObject jo = new JSONObject();jo.put("timeStamp", response.getTimeStamp());jo.put("nonceStr", response.getNonceStr());jo.put("package", response.getPackageVal());jo.put("signType", response.getSignType());jo.put("paySign", response.getPaySign());OrderPaymentVO vo = jo.toJavaObject(OrderPaymentVO.class);vo.setPackageStr(jo.getString("package"));log.info("===== 生成预支付交易单:{}", vo);return new ResultBean<>(vo);}

支付回调

public void paySuccessNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {String body = readData(request);log.info(request.toString());String wechatpayNonce = request.getHeader("Wechatpay-Nonce");String wechatSignature = request.getHeader("Wechatpay-Signature");String wechatTimestamp = request.getHeader("Wechatpay-Timestamp");String wechatPaySerial = request.getHeader("Wechatpay-Serial");RequestParam requestParam = new RequestParam.Builder().serialNumber(wechatPaySerial).nonce(wechatpayNonce).signature(wechatSignature).timestamp(wechatTimestamp).body(body).build();// 这是秘钥 可下载证书的 这个有点危险,因为下载证书后其他平台可能不一定能用//NotificationConfig config = new RSAAutoCertificateConfig.Builder()//        .merchantId(merchantId)//        .privateKeyFromPath(privateKeyPath)//        .merchantSerialNumber(merchantSerialNumber)//        .apiV3Key(apiV3Key)//        .build();// 这是在使用原来不变的情况下的代码// 请使用 RSAAutoCertificateConfig,开发者应尽快迁移,我们将在未来某个时间移除这段废弃的代码。NotificationConfig config = new RSANotificationConfig.Builder().apiV3Key(apiV3Key).certificatesFromPath(wechatPayCertificatePath).build();//NotificationConfig config =//        new RSAConfig.Builder()//                .merchantId(merchantId)//                .privateKeyFromPath(privateKeyPath)//                .merchantSerialNumber(merchantSerialNumber)//                .wechatPayCertificatesFromPath(wechatPayCertificatePath)//                .build();// 这是使用公钥的//NotificationConfig config = new RSAPublicKeyConfig.Builder()//.merchantId(merchantId)//.publicKeyFromPath(publicKeyPath)//.publicKeyId(publicKeyId)//.privateKeyFromPath(privateKeyPath)//.merchantSerialNumber(merchantSerialNumber)//.apiV3Key(apiV3Key)//.build();NotificationParser parser = new NotificationParser(config);try {// 以支付通知回调为例,验签、解密并转换成 TransactionTransaction transaction = parser.parse(requestParam, Transaction.class);//String tradeState = jsonObject.getString("trade_state");if (transaction.getTradeState()== Transaction.TradeStateEnum.SUCCESS) {//String outTradeNo = jsonObject.getString("out_trade_no");//商户平台订单号String outTradeNo = transaction.getOutTradeNo();//商户平台订单号String transactionId = transaction.getTransactionId();//微信支付交易号TransactionPayer payer = transaction.getPayer();String openId = payer.getOpenid();//订单金额//JSONObject amount = JSON.parseObject(jsonObject.getString("amount"));//JSONObject amount = JSON.parseObject(transaction.getAmount());TransactionAmount amount = transaction.getAmount();//总金额//String total = amount.getString("total");Integer total =amount.getTotal();//用户支付金额Integer payerTotal = amount.getPayerTotal();/// 自己的逻辑ResponseEntity.status(HttpStatus.OK);} else {log.info("==== update income fail : " + outTradeNo);}}}} catch (ValidationException e) {// 签名验证失败,返回 401 UNAUTHORIZED 状态码log.error("sign verification failed", e);ResponseEntity.status(HttpStatus.UNAUTHORIZED);}}

注意事项:

1. 对于不清楚的,看看官方库的 examplate

2. 本地测试  记得使用端口转发

3. 多看文档

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

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

相关文章

CondaError: Run ‘conda init‘ before ‘conda activate‘解决办法

已经执行了conda init&#xff0c;但是还是会报错CondaError: Run ‘conda init’ before ‘conda activate’ 原因&#xff1a;权限不够 解决办法&#xff1a;以管理员身份运行cmd&#xff0c;然后进入要操作的文件夹下&#xff0c;重新执行 conda init 和 conda activate 就可…

边缘计算与推理算力:智能时代的加速引擎

在数据量爆炸性增长的今天&#xff0c;边缘计算与推理算力正成为推动智能应用的关键力量。智能家居、自动驾驶、工业4.0等领域正在逐步从传统的云端计算转向边缘计算&#xff0c;而推理算力的加入&#xff0c;为边缘计算提供了更强的数据处理能力和实时决策能力。本文将探讨边缘…

【Python TensorFlow】进阶指南(续篇二)

在前面的文章中&#xff0c;我们详细探讨了TensorFlow在实际应用中的高级功能和技术细节。本篇将继续深入探讨一些前沿话题&#xff0c;包括但不限于分布式训练、混合精度训练、神经架构搜索&#xff08;NAS&#xff09;、模型微调以及在实际项目中的最佳实践等&#xff0c;帮助…

JAVA后端生成图片滑块验证码 springboot+js完整案例

前言 现在大部分网部都是图片滑块验证码&#xff0c;这个得要与后端联动起来才是确保接口安全性 通过我们系统在发送手机短息时都会选进行滑块验证&#xff0c;但是我们要保证发送短息接口的全安&#xff0c;具体路思如下 那么这个滑块的必须是与后端交互才能保证安全性&…

机器学习—高级优化方法

梯度下降是机器学习中广泛应用的优化算法&#xff0c;像线性回归和逻辑回归以及神经网络的早期实现&#xff0c;现在有一些其他的优化算法&#xff0c;为了最小化成本函数&#xff0c;甚至比梯度下降的效果更好&#xff0c;这种算法可以用来帮助训练神经网络&#xff0c;比梯度…

【Vue3】知识汇总,附详细定义和源码详解,后续出微信小程序项目(3)

快速跳转&#xff1a; 我的个人博客主页&#x1f449;&#xff1a;Reuuse博客 新开专栏&#x1f449;&#xff1a;Vue3专栏 参考文献&#x1f449;&#xff1a;uniapp官网 免费图标&#x1f449;&#xff1a;阿里巴巴矢量图标库 ❀ 感谢支持&#xff01;☀ 前情提要 &#x…

模型减肥秘籍:模型压缩技术 CNN基础

这里是Datawhale的组队学习活动&#xff0c;主要介绍的是模型压缩技术。后续将以CNN网络为基础点&#xff0c;带领大家领略模型压缩的魅力。首先是回顾一下一些关于CNN的基础知识。 参考链接&#xff1a; 模型减肥秘籍&#xff1a;模型压缩技术-课程详情 | Datawhale datawh…

Ollama的安装以及大模型下载教程

简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它帮助用户快速在本地运行大模型。通过简单的安装指令&#xff0c;用户可以执行一条命令就在本地运行开源大型语言模型&#xff0c; Ollama极大地简化了在Docker容器内部署和管理LLM的过程&#xff0c;使得用户能够快…

Mysql前言

文章目录 Mysql 数据库简介SQL 基础语法什么是 SQL语句SQL 的作用SQL 语句的分类SQL 通用语法查询状态 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Mysql专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月12日18点20分 SQL是数据库…

Spring Boot编程训练系统:设计与实现要点

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 管理员对用户信息修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 题库资源管理 系统管理员可以对题库资源信息进行添加&#xff0c;修改&#xff0c;删除以及查询操作。具体界面如…

Xcode 16 使用 pod 命令报错解决方案

原文请点击这个跳转 一、问题现象&#xff1a; 有人会遇到 Xcode 升级到 16 后&#xff0c;新建应用然后使用 pod init 命令会报错如下&#xff1a; Stack Ruby : ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-darwin23]RubyGems : 3.5.22Host : macOS 15.0 (24A335…

hive中windows子句的使用

概述 1&#xff0c;windows子句是对窗口的结果做更细粒度的划分 2、windows子句中有两种方式 rows &#xff1a;按照相邻的几行进行开窗 range&#xff1a;按照某个值的范围进行开窗 使用方式 (rows | range) between (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING…

Unet++改进24:添加DualConv||轻量级深度神经网络的双卷积核

本文内容:添加DualConv 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 卷积神经网络(CNN)架构通常对内存和计算要求很高,这使得它们在硬件资源有限的嵌入式系统中不可行。 我们提出了双卷积核(DualConv)来构建轻量级深度神经网络。DualConv结合3 3和1…

【Vue3】知识汇总,附详细定义和源码详解,后续出微信小程序项目(4)

快速跳转&#xff1a; 我的个人博客主页&#x1f449;&#xff1a;Reuuse博客 新开专栏&#x1f449;&#xff1a;Vue3专栏 参考文献&#x1f449;&#xff1a;uniapp官网 免费图标&#x1f449;&#xff1a;阿里巴巴矢量图标库 ❀ 感谢支持&#xff01;☀ 前情提要 &#x…

微信小程序_小程序视图与逻辑_day3

一、目标 A. 能够知道如何实现页面之间的导航跳转 B. 能够知道如何实现下拉刷新效果 C. 能够知道如何实现上拉加载更多效果 D. 能够知道小程序中常用的生命周期 二、目录 A. 页面导航 B. 页面事件 C. 生命周期 D. WXS脚本 E. 案例-本地生活&#xff08;列表页面&#xff09;…

springboot社团服务系统的设计与实现,计算机毕业设计项目源码316,计算机毕设程序(LW+开题报告、中期报告、任务书等全套方案)

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套社团服务系统有管理员&#x…

Linux服务管理-kerberos

Kerberos 官网文档‘&#xff1a;Kerberos&#xff1a;网络身份验证协议 (mit.edu) 基本概念&#xff1a;Kerberos基本概念及原理汇总-腾讯云开发者社区-腾讯云 (tencent.com) kerberos概述 Kerberos是一种计算机网络认证协议&#xff0c;由麻省理工学院&#xff08;MIT&#x…

区块链技术在游戏行业的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在游戏行业的应用 区块链技术在游戏行业的应用 区块链技术在游戏行业的应用 引言 区块链技术概述 定义与原理 发展历程…

MooseFS (MFS) 分布式对象存储

一、MFS 优越特性 Free (GPL): 通用文件系统&#xff0c;开源免费。在线扩容: 体系架构具有极强的可伸缩性&#xff0c;支持在线扩容。部署简单。高可用性: 支持设置任意文件冗余(数据分区)程度&#xff0c;提供比RAID10更高的冗余级别&#xff0c;同时不会影响读写性能&#…

【常见问题解答】远程桌面无法复制粘贴的解决方法

提示:文中提出了“远程桌面无法复制粘贴文件到本地”问题的三种解决方法,其中“方法 3:重启 RDP 剪贴板监视程序”亲测有效。 目录 一、问题描述二、解决方法1.方法1:设置远程桌面连接(1)打开远程桌面连接,点击【显示选项】(2)勾选“剪贴板”,并点击【详细信息】(3)…