springboot 使用 weixin-java-pay 支付demo

springboot引入依赖

        <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-pay</artifactId><version>4.6.0</version></dependency>

配置

wx:pay:appId: *********mchId: ********apiV3Key: ********certSerialNo: ********privateKeyPath: classpath:apiclient_key.pem #apiclient_key.pem证书文件的绝对路径或者以classpath:开头的类路径privateCertPath: classpath:apiclient_cert.pem #apiclient_cert.pem证书文件的绝对路径或者以classpath:开头的类路径

引入证书
在这里插入图片描述

微信支付自动配置

package com.ruoyi.system.pay;import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** <pre>*  微信支付自动配置*  Created by BinaryWang on 2019/4/17.* </pre>** @author <a href="https://github.com/binarywang">Binary Wang</a>*/
@Configuration
@EnableConfigurationProperties(WxPayProperties.class)
@ConditionalOnClass(WxPayService.class)
@ConditionalOnProperty(prefix = "wx.pay", value = "enabled", matchIfMissing = true)
public class WxPayAutoConfiguration {private WxPayProperties properties;@Autowiredpublic WxPayAutoConfiguration(WxPayProperties properties) {this.properties = properties;}/*** 构造微信支付服务对象.** @return 微信支付service*/@Bean@ConditionalOnMissingBean(WxPayService.class)public WxPayService wxPayService() {final WxPayServiceImpl wxPayService = new WxPayServiceImpl();WxPayConfig payConfig = new WxPayConfig();payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId()));payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));payConfig.setUseSandboxEnv(this.properties.isUseSandboxEnv());//以下是apiv3以及支付分相关payConfig.setServiceId(StringUtils.trimToNull(this.properties.getServiceId()));payConfig.setPayScoreNotifyUrl(StringUtils.trimToNull(this.properties.getPayScoreNotifyUrl()));payConfig.setPrivateKeyPath(StringUtils.trimToNull(this.properties.getPrivateKeyPath()));payConfig.setPrivateCertPath(StringUtils.trimToNull(this.properties.getPrivateCertPath()));payConfig.setCertSerialNo(StringUtils.trimToNull(this.properties.getCertSerialNo()));payConfig.setApiV3Key(StringUtils.trimToNull(this.properties.getApiv3Key()));wxPayService.setConfig(payConfig);return wxPayService;}}
package com.ruoyi.system.pay;import org.springframework.boot.context.properties.ConfigurationProperties;/*** <pre>*  微信支付属性配置类* Created by Binary Wang on 2019/4/17.* </pre>** @author <a href="https://github.com/binarywang">Binary Wang</a>*/
@ConfigurationProperties(prefix = "wx.pay")
public class WxPayProperties {/*** 设置微信公众号或者小程序等的appid.*/private String appId;/*** 微信支付商户号.*/private String mchId;/*** 微信支付商户密钥.*/private String mchKey;/*** 服务商模式下的子商户公众账号ID,普通模式请不要配置,请在配置文件中将对应项删除.*/private String subAppId;/*** 服务商模式下的子商户号,普通模式请不要配置,最好是请在配置文件中将对应项删除.*/private String subMchId;/*** apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定.*/private String keyPath;/*** 微信支付分serviceId*/private String serviceId;/*** 证书序列号*/private String certSerialNo;/*** apiV3秘钥*/private String apiv3Key;/*** 微信支付分回调地址*/private String payScoreNotifyUrl;/*** apiv3 商户apiclient_key.pem*/private String privateKeyPath;/*** apiv3 商户apiclient_cert.pem*/private String privateCertPath;/*** 微信支付是否使用仿真测试环境.* 默认不使用*/private boolean useSandboxEnv;public String getAppId() {return appId;}public void setAppId(String appId) {this.appId = appId;}public String getMchId() {return mchId;}public void setMchId(String mchId) {this.mchId = mchId;}public String getMchKey() {return mchKey;}public void setMchKey(String mchKey) {this.mchKey = mchKey;}public String getSubAppId() {return subAppId;}public void setSubAppId(String subAppId) {this.subAppId = subAppId;}public String getSubMchId() {return subMchId;}public void setSubMchId(String subMchId) {this.subMchId = subMchId;}public String getKeyPath() {return keyPath;}public void setKeyPath(String keyPath) {this.keyPath = keyPath;}public String getServiceId() {return serviceId;}public void setServiceId(String serviceId) {this.serviceId = serviceId;}public String getCertSerialNo() {return certSerialNo;}public void setCertSerialNo(String certSerialNo) {this.certSerialNo = certSerialNo;}public String getApiv3Key() {return apiv3Key;}public void setApiv3Key(String apiv3Key) {this.apiv3Key = apiv3Key;}public String getPayScoreNotifyUrl() {return payScoreNotifyUrl;}public void setPayScoreNotifyUrl(String payScoreNotifyUrl) {this.payScoreNotifyUrl = payScoreNotifyUrl;}public String getPrivateKeyPath() {return privateKeyPath;}public void setPrivateKeyPath(String privateKeyPath) {this.privateKeyPath = privateKeyPath;}public String getPrivateCertPath() {return privateCertPath;}public void setPrivateCertPath(String privateCertPath) {this.privateCertPath = privateCertPath;}public boolean isUseSandboxEnv() {return useSandboxEnv;}public void setUseSandboxEnv(boolean useSandboxEnv) {this.useSandboxEnv = useSandboxEnv;}
}

支付demo

package com.ruoyi.system.pay;import com.alibaba.fastjson.JSON;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.util.ResourcesUtils;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import me.chanjar.weixin.common.util.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;/*** 参数配置 信息操作处理* * @author ruoyi*/
@RestController
@RequestMapping("/pay")
public class SysPayController extends BaseController
{@Autowiredprivate WxPayService wxPayService;/*** 微信小程序支付*/@GetMapping("/demo")public AjaxResult demo() throws WxPayException {String outTradeNo = RandomUtils.getRandomStr();String notifyUrl = "https://api.qq.com/";System.out.println("outTradeNo = " + outTradeNo);WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();request.setOutTradeNo(outTradeNo);request.setNotifyUrl(notifyUrl);request.setDescription("test");WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();payer.setOpenid("oQfWg**********p60Kcw5s");request.setPayer(payer);//构建金额信息WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();//设置币种信息amount.setCurrency(WxPayConstants.CurrencyType.CNY);//设置金额amount.setTotal(BaseWxPayRequest.yuan2Fen(BigDecimal.ONE));request.setAmount(amount);WxPayUnifiedOrderV3Result.JsapiResult result = this.wxPayService.createOrderV3(TradeTypeEnum.JSAPI, request);System.out.println(JSON.toJSONString(result));return success();}/*** 关闭订单* @return* @throws WxPayException*/@GetMapping("/close")public AjaxResult close() throws WxPayException {this.wxPayService.closeOrderV3("tradeNo000001");return success();}
}

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

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

相关文章

剧本杀门店预约小程序,在线一键预约体验

剧本杀作为集社交、角色扮演、休闲娱乐为一体的游戏&#xff0c;吸引了年轻人的目光。当下&#xff0c;随着市场的发展&#xff0c;剧本杀行业正面临挑战&#xff0c;对于门店来说&#xff0c;如何找到新的发展方向&#xff0c;在市场中脱颖而出是重中之重&#xff01; 线上线…

SpringBoot技术:闲一品交易的新机遇

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;闲一品交易平台当然也不能排除在外。闲一品交易平台是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&…

柔性数组的使用

1.只有一个malloc的情况 //柔性数组的使用 #include<stdio.h> #include<stdlib.h> #include<errno.h> struct s {int i;int a[]; }; int main() {struct s* ps (struct s*)malloc(sizeof(struct s) 20 * sizeof(int));if (ps NULL){perror("malloc&…

从0到1,用Rust轻松制作电子书

我之前简单提到过用 Rust 做电子书&#xff0c;今天分享下如何用Rust做电子书。制作电子书其实用途广泛&#xff0c;不仅可以用于技术文档&#xff08;对技术人来说非常方便&#xff09;&#xff0c;也可以制作用户手册、笔记、教程等&#xff0c;还可以应用于文学创作。 如果…

计算机毕业设计django+大模型租房推荐系统 租房可视化 租房大屏可视化 租房爬虫 spark 58同城租房爬虫 房源推荐系统

开题报告&#xff1a;《Django大模型租房推荐系统》 一、研究背景与意义 随着城市化进程的加快&#xff0c;房屋租赁市场日益繁荣。然而&#xff0c;传统的房屋租赁方式存在信息不对称、交易流程繁琐等问题&#xff0c;给租户和房主带来了诸多不便。因此&#xff0c;开发一套…

ubuntu进程相关操作

进程相关操作 1.查看进程top/htop top 命令输出解释 在 top 命令中&#xff0c;字段通常表示如下&#xff1a; USER&#xff1a;进程的所有者。PR&#xff1a;优先级。NI&#xff1a;nice 值&#xff08;优先级调整&#xff09;。VIRT&#xff1a;进程使用的虚拟内存总量。…

如何在算家云搭建LongWriter(长文创作)

一、 LongWriter 简介 在自然语言处理领域&#xff0c;随着对长文本处理需求的不断增加&#xff0c;能够高效生成长文本的语言模型变得至关重要。LongWriter 的推出正是为了打破传统语言模型在生成超长文本时的限制。LongWriter-glm4-9b 是基于glm-4-9b进行训练的&#xff0c;…

C语言串口接收GPS数据

要在C语言中接收GPS数据&#xff0c;需要使用串口通信来与GPS设备进行数据交互。一个简单的串口通信代码主要包含了以下几个部分&#xff1a; 1.标准库头文件 stdio.h&#xff1a;包含输入输出函数&#xff0c;如 printf string.h&#xff1a;包含字符串处理函数&#xff0c…

【天线&空中农业】蜜蜂检测系统源码&数据集全套:改进yolo11-ASF

改进yolo11-dysample等200全套创新点大全&#xff1a;蜜蜂检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.30 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可…

NavVis LX系列产品典型应用—现有住宅装修改造-沪敖3D

现有住宅装修改造项目的 数据捕捉和测量技术 当Jay Ure着手翻新和美化自己的新家时&#xff0c;他敏锐地发现这是现场测试NavVis VLX的绝佳机会。 为了全面评估&#xff0c;他聘请了一位工程师&#xff0c;采用传统的全站仪技术进行地形测绘。之后&#xff0c;他用移动扫描设…

点评项目-12-好友关注

好友关注主要有三个功能&#xff1a; 1.关注和取关 2.共同关注 3.关注推送 关注和取关 涉及到的表&#xff0c;中间表&#xff1a;tb_follow,是博主 User 和粉丝 User 的中间表 请求一&#xff0c;查询是否关注了该用户&#xff1a; 请求路径&#xff1a;follow/or/not/…

Android 在github网站下载项目:各种很慢怎么办?比如gradle下载慢;访问github慢;依赖下载慢

目录 访问github慢gradle下载慢依赖下载慢 前言 大家好&#xff0c;我是前期后期&#xff0c;在网上冲浪的一名程序员。 为什么要看这篇文章呢&#xff1f;问题是什么&#xff1f; 我们在Github上面看到一些好的项目的时候&#xff0c;想下载下来研究学习一下。但经常遇到各…

阿里面试:为什么MySQL不建议使用Delete删除数据?

MySQL有建议过不要使用他们家的DELETE吗&#xff1f;在MySQL 8.0的官方文档里没有找到不建议使用DELETE的文字。 DELETE VS NOT DELETE&#xff0c;这是由来已久的问题 时间回到2009的8月30号。大佬Ayende Rahien——也被称为Oren Eini&#xff0c;Hibernating Rhinos公司的C…

机器学习中的嵌入是什么?

一、说明 嵌入是真实世界对象的数字表示&#xff0c;机器学习&#xff08;ML&#xff09;和人工智能&#xff08;AI&#xff09;系统利用它来像人类一样理解复杂的知识领域。例如&#xff0c;计算算法了解 2 和 3 之间的差为 1&#xff0c;这表明与 2 和 100 相比&#xff0c;2…

Python | Leetcode Python题解之第517题超级洗衣机

题目&#xff1a; 题解&#xff1a; class Solution:def findMinMoves(self, machines: List[int]) -> int:tot sum(machines)n len(machines)if tot % n:return -1avg tot // nans, s 0, 0for num in machines:num - avgs numans max(ans, abs(s), num)return ans

若依框架部署到服务器后头像资源访问404

排错过程 第一开始以为是代理出问题了 官网给出的解决方案 第一种是用代理后端接口&#xff0c;第二种是重写路径直接访问静态文件 接口通过捕获profile开头的路径/profile/avatar…&#xff0c;转为/home…/avatar找到我们在该路径下的文件 但是我想了一下&#xff0c;我ngin…

《手写Spring渐进式源码实践》实践笔记(第十二章 aop融入bean生命周期)

提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 第十二章 将AOP融入Bean生命周期背景目标设计实现代码结构类图实现步骤 测试事先准备自定义拦截方法Spring.xml 配置AOP测试用例测试结果&#xff1a; 总结 第十二章…

Three.js 快速入门构建你的第一个 3D 应用

![ 开发领域&#xff1a;前端开发 | AI 应用 | Web3D | 元宇宙 技术栈&#xff1a;JavaScript、React、Three.js、WebGL、Go 经验经验&#xff1a;6年 前端开发经验&#xff0c;专注于图形渲染和AI技术 开源项目&#xff1a;github 晓智元宇宙、数字孪生引擎、前端面试题 大家好…

C#界面设计--9--fatal error C1083: 无法打开包括文件:“jruparse.h”: No such file or directory

1、VS2008-编译时报错“fatal error C1083: 无法打开包括文件:“jruparse.h”: No such file or directory” 2、问题出现的原因及解决方法 1、如果要引入的这些,h文件跟.cpp在同一个目录下&#xff0c;就不会出现这种问题&#xff0c;检査在工程的include目录下是不是真的存…

算法:排序

排序算法 1. 简单排序1.1 直接插入排序1.2 冒泡排序1.3 简单选择排序 2. 希尔排序3. 快速排序4. 堆排序5. 归并排序 将文件的内容按照某种规则进行排列。 排序算法的稳定判定&#xff1a;若在待排序的一个序列中&#xff0c; R i R_i Ri​和 R j R_j Rj​的关键码相同&#xf…