微信支付(weixin-java-pay)

2023-11-04

1. 项目依赖

增加pom.xml文件中增加依赖包。weixin-java-pay是GitHub开源的一个微信支付工具包

<dependency>
	<groupId>com.github.binarywang</groupId>
	<artifactId>weixin-java-pay</artifactId>
	<version>3.0.0</version>
</dependency>
复制代码

2. contorller代码

package com.xxx.sub.controller;

import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayBillBaseResult;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.github.binarywang.wxpay.util.SignUtils;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConfig;
import com.github.wxpay.sdk.WXPayUtil;
import com.google.gson.Gson;
import com.xxx.sub.entity.SubWorkerInfoEntity;
import com.xxx.sub.entity.SysPayInfoEntity;
import com.xxx.sub.service.SubWorkerInfoServiceI;
import com.xxx.sub.service.SysPayInfoServiceI;
import com.xxx.sub.util.SubCodeUtil;
import com.sun.star.bridge.oleautomation.Decimal;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.jeecgframework.core.common.controller.BaseController;
import org.jeecgframework.core.util.PropertiesUtil;
import org.jeecgframework.jwt.util.ResponseMessage;
import org.jeecgframework.jwt.util.Result;
import org.jeecgframework.p3.core.util.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.*;

/**
 * @Title: Controller
 * @Description: 微信支付
 * @author onlineGenerator
 * @date 2018-02-07 17:45:09
 * @version V1.0
 *
 */
@Api(value="wxPayController",description="微信支付",tags="RESTWxPayController")
@Controller
@RequestMapping("/wxPayController")
public class RESTWxPayController extends BaseController {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(RESTWxPayController.class);
	@Autowired
	WXPayConfig config;
	@Autowired
	private SubWorkerInfoServiceI subWorkerInfoService;

	/**
	 * 产生订单接口
	 * @param payType 支付类型
	 * @param id 支付信息id
	 * @return
	 * @throws WxPayException
	 */
	@RequestMapping(value = "/generatePay/{payType}/{id}",method = RequestMethod.POST)
	@ResponseBody
	@ApiOperation(value="微信统一下单接口1")
	public ResponseMessage<?> generatePay2(@ApiParam(required=true) @PathVariable(value="payType") String payType,@ApiParam(required=true) @PathVariable(value="id") String id) throws WxPayException {
		String tradeNo = SubCodeUtil.getNum();
		String busId = "123131313";
		Integer fee = 1;
		WxPayUnifiedOrderRequest.WxPayUnifiedOrderRequestBuilder builder = WxPayUnifiedOrderRequest.newBuilder();
		WxPayUnifiedOrderRequest request  = builder.body(payType)
				.totalFee(fee).outTradeNo(tradeNo)
				.productId("1000000123")
				.spbillCreateIp("0.0.0.0")
				.tradeType("APP").build();
		request.setSignType("MD5");
		WxPayService wxPayService = getWxPayService();
		WxPayAppOrderResult o = wxPayService.createOrder(request);
		System.out.println(o.toString());
		// 存储支付信息到数据库
		SysPayInfoEntity payInfoEntity = new SysPayInfoEntity();
		payInfoEntity.setBusId(Integer.valueOf(id));
		payInfoEntity.setBusType(payType);
		payInfoEntity.setBusCode(busId);
		payInfoEntity.setCreateTime(new Date());
		payInfoEntity.setOrderNo(tradeNo);
		payInfoEntity.setPayState(0);//支付状态:0未支付1支付成功2支付失败3退款成功
		payInfoEntity.setPayType("wxPay");
		payInfoEntity.setOrderDetail(new Gson().toJson(0));
		try {
			sysPayInfoServiceI.save(payInfoEntity);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Result.success(o);
	}

	/**
	 * 接收支付返回的消息
	 * @param
	 */
	@RequestMapping(value="/parseOrderNotifyResult",method = RequestMethod.POST)
	@ApiOperation(value="接收支付返回的消息")
	@ResponseBody
	public String parseOrderNotifyResult(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("============支付回调开始");
		try {
			String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
			WxPayService wxPayService = getWxPayService();
			WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(xmlResult);
			System.out.println(result.toString());
			// 结果正确
			String orderId = result.getOutTradeNo();
			String tradeNo = result.getTransactionId();
			//String totalFee = WxPayBaseResult.feeToYuan(result.getTotalFee());
			//自己处理订单的业务逻辑,需要判断订单是否已经支付过,否则可能会重复调用
			System.out.println("============支付回调结束");
			return WxPayNotifyResponse.success("处理成功!");
		} catch (Exception e) {
			logger.error("微信回调结果异常,异常原因{}" + e.getMessage());
			return WxPayNotifyResponse.fail(e.getMessage());
		}
	}

	/**
	 * 加载配置文件,生成微信payservice对象
	 * @return
	 */
	private WxPayService getWxPayService() {
		PropertiesUtil util = new PropertiesUtil("wx.properties");
		WxPayConfig payConfig = new WxPayConfig();
		payConfig.setAppId(util.readProperty("appid"));
		payConfig.setMchId(util.readProperty("mchid"));
		payConfig.setMchKey(util.readProperty("mchkey"));
		payConfig.setNotifyUrl(util.readProperty("notifyurl"));
		WxPayService wxPayService = new WxPayServiceImpl();
		wxPayService.setConfig(payConfig);
		return wxPayService;
	}

}
复制代码

3. service、entity代码省略

service就是业务操作、entity主要是存储支付订单信息的实体

4. util

package com.nyis.sub.util;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 流水号生成
 */

public class SubCodeUtil {
    
    /**
     * 获取现在时间
     * @return返回字符串格式yyyyMMddHHmmss
     */
    public static String getStringDate() {
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        String dateString = formatter.format(currentTime);
        System.out.println("TIME:::"+dateString);
        return dateString;
    }

    /**
     * 由年月日时分秒+3位随机数
     * 生成流水号
     * @return
     */
    public static String getNum(){
        String t = getStringDate();
        int x=(int)(Math.random()*900)+100;
        String serial = t + x;
        return serial;
    }

}

复制代码

转载于:https://juejin.im/post/5ae19366518825671f2f79a1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信支付(weixin-java-pay) 的相关文章

随机推荐

  • 经纬度换算数值_经纬度换算

    1 经纬度和弧度的转换 转换方法 角度转弧度为 180 角度 弧度变角度为180 弧度 经度分东经和西经 从0 经线向东内到180 为东容经 用字母E表示 从0 经线向西到180 为西经 用字母W表示经度的变化规律是东经向东度数越来越大 西
  • VBA:按照Excel工作表中的名称列自动汇总多个工作薄中对应sheet中所需要的数据

    需求如下 B列为产品名为合并单元格 C列为供应商名 G H列为金额数据 数据源放在同一个文件夹内 B列产品名来源于工作薄名称中间的字符串 C列供应商名来源于工作薄中的sheet名 G H列金额数据来源于工作薄中sheet中固定单元格P25
  • c++函数指针

    1 声明函数指针 double cal int prototype double pf int 指针pf指向的函数 输入参数为int 返回值为double pf cal 指针赋值 2 指针作为函数的参数传递 void estimate in
  • Pytorch Tensor的索引与切片

    1 Pytorch风格的索引 根据Tensor的shape 从前往后索引 依次在每个维度上做索引 示例代码 import torch a torch rand 4 3 28 28 print a 0 shape 取到第一个维度 print
  • svg格式文件转换为png图片文件

    快要下班的时候 领导突然找我 发给我一个页面 说觉得这个页面的图标感觉不错 想把它做成图片放在项目里 我打开网页 用f12一看 用的是svg 这个我也不知道咋处理啊 但是遇到事情我们先不要慌 先在网上找找有没有解决办法 一顿搜索之下 我找到
  • 1. TensorRT量化的定义及意义

    前言 手写AI推出的全新TensorRT模型量化课程 链接 TensorRT下的模型量化 课程大纲如下 1 量化的定义及意义 1 1 什么是量化 定义 量化 Quantization 是指将高精度浮点数 如float32 表示为低精度整数
  • warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

    下面的文章详细介绍了这个warning的来源和解决方法 也可以关闭优化 当然关闭优化并不是最终解决方法 down vote accepted First off let s examine why you get the aliasing
  • Linux 问题排查及性能调优

    总目录 一 问题场景 1 CPU问题 2 内存问题 3 iowait问题 二 性能优化简介 三 Linux 问题排查顺序 前言 监控大盘 第一步 平均负载 第二步 cpu核 第三步 内存 第四步 磁盘 第五步 带宽 第六步 具体应用 第七步
  • Redis知识整理一:基础知识

    什么是Redis Redis是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 并提供多种语言的API Redis缓存数据库特点 1 Redis支持数据的持久化 可以将内存中的数据保存在磁
  • 使用Yii查询CodeStriker

    公司使用的质量管理系统 评审活动 缺陷跟踪和文档库 中 需要与CodeStriker互动 开发如下类实现基本功能 View Code 1
  • adb shell 中直接激活界面命令

    adb root adb remount adb shell am start a android settings WIFI SETTINGS am activityManager a action n 包名 包名 activity ad
  • Selenium成长之路-03使用IDLE编写第一个自动化脚本

    windows用户 在电脑的开始菜单搜索IDLE 并启动ILDE python GUI 编译器 接下来我们就进入编译的环节了 1 导入webdriver包 from selenium import webdriver 2 初始化一个火狐浏览
  • mac支持的硬盘格式 什么硬盘格式是mac和win支持的

    大部分硬盘在默认出厂前都会设定好一个固定的磁盘格式 如果该格式与用户电脑所使用的系统不兼容 就无法正确地进行硬盘读写甚至硬盘识别 对于Mac系统和Windows系统而言 它们都有自己支持的某些硬盘格式 什么是Mac支持的硬盘格式 什么硬盘格
  • 如何关闭电脑防火墙

    开始 控制面板 WINDOWS防火墙 打开或关闭WINDOWS防火墙 关闭WINDOWS防火墙 不推荐 效果截图
  • C++ 中的变量定义

    变量定义就是告诉编译器在何处创建变量的存储 以及如何创建变量的存储 变量定义指定一个数据类型 并包含了该类型的一个或多个变量的列表 如下所示 type variable list 在这里 type 必须是一个有效的 C 数据类型 可以是 c
  • 有源医疗器械电磁兼容EMC的测试标准、测试项目以及测试方法

    目录 有源医疗器械电磁兼容的测试标准 测试项目以及测试方法 一 什么是电磁兼容 1 1电磁兼容概念 1 2电磁兼容三要素 1 3为什么要做电磁兼容 1 4电磁兼容测试项目 二 电磁兼容标准 2 1基础标准 2 2通用标准 2 3产品族标准
  • WPF 图表控件LiveCharts的应用——室内监控可视化

    需求 为了实现一个完整软件系统 必须具备一些基本的数据呈现控件 例如曲线图 柱状图 饼图等 本次的业务需求为 利用LiveCharts展示后台模拟的温度变化 像Winform里面 微软为我们提供了比较完整的Chart控件 但是在WPF组件中
  • C++知识讲解(一)

    目录 1 1 进入 C 1 1 1 main 函数 1 1 2 C 注释 1 1 3 C 预处理器和 iostream 文件 1 1 4 头文件名 1 1 5 名称空间 1 1 6 使用 cout 进行 C 输出 1 endl 控制符 2
  • [Python系列-22]:Python之人工智能 - 基本工具 - 6- 绘制二元函数的三维曲面图

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenB 本文网址 https blog csdn net HiWangWenBing article details 119859493 目录 第1章 ma
  • 微信支付(weixin-java-pay)

    1 项目依赖 增加pom xml文件中增加依赖包 weixin java pay是GitHub开源的一个微信支付工具包