springboot使用com.github.binarywang包实现微信网页上的支付和退款

 更新时间:2024年05月27日 11:27:14   作者:layman0528  
最近做项目需要实现在pc端需要实现微信的支付,本文主要介绍了springboot使用com.github.binarywang包实现微信网页上的支付和退款,具有一定的参考价值,感兴趣的可以了解一下

前提

微信小程序中实现微信支付是从小程序中调去微信支付的界面直接进行支付,那么在pc端需要实现微信的支付呢,是需要出现一个二维码让用户使用扫码支付的。

注意:

需要实现pc端的微信支付,需要在微信商户平台开通native支付,并且下载并配置商户证书

在这里插入图片描述

在这里插入图片描述

设置好这些之后,直接看看在springboot 或者springclound 中如何实现。

maven依赖

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
       </dependency>

步骤

在yml中定义微信的商户号,密码等等

wxpay:
  appId: appId
  mchId: mchId
  mchKey: mchKey
  keyPath: /home/wxpay_cert/apiclient_cert.p12
  privateKeyPath: /home/wxpay_cert/apiclient_key.pem
  privateCertPath: /home/wxpay_cert/apiclient_cert.pem

  notifyUrl: notifyUrl
  refundNotifyUrl: refundNotifyUrl
  serialNo: serialNo

notifuyUrl 是 支付回调地址
refundNotifyUrl是 退款回调地址
这两个地址都必须是外网可访问的地址

新建WechatPayConfig类来读取yml文件的中信息

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties(prefix = "wxpay")
public class WechatPayConfig {
    private String appId;
    private String mchId;
    private String mchKey;
    private String keyPath;
    private String privateKeyPath;
    private String privateCertPath;
    private String notifyUrl;

    private String redUrl;
    private String refundNotifyUrl;

    private String serialNo;
}

获取ip地址帮助类

IpUtils

public class IpUtils
{
       public static String getIpAddr()
    {
        return getIpAddr(ServletUtils.getRequest());
    }
    }

ServletUtils (客户端工具类)

   public static HttpServletRequest getRequest()
    {
        try
        {
            return getRequestAttributes().getRequest();
        }
        catch (Exception e)
        {
            return null;
        }
    }
    
       public static ServletRequestAttributes getRequestAttributes()
    {
        try
        {
            RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
            return (ServletRequestAttributes) attributes;
        }
        catch (Exception e)
        {
            return null;
        }
    }

微信支付Service类

@Service
@ConditionalOnClass(WxPayService.class)
@EnableConfigurationProperties(WechatPayConfig.class)
@AllArgsConstructor
public class WechatPayService {
	 static Logger logger = LoggerFactory.getLogger(WechatPayService.class);
	 private WechatPayConfig wechatPayConfig;
	     public WxPayService wxPayService() {
        WxPayConfig payConfig = new WxPayConfig();
        payConfig.setAppId(wechatPayConfig.getAppId());
        payConfig.setMchId(wechatPayConfig.getMchId());
        payConfig.setMchKey(wechatPayConfig.getMchKey());
        payConfig.setApiV3Key(wechatPayConfig.getMchKey());
        payConfig.setKeyPath(wechatPayConfig.getKeyPath());
        payConfig.setUseSandboxEnv(false);

        logger.info("wechatPayConfig.getPrivateKeyPath():{}",wechatPayConfig.getPrivateKeyPath());
        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(payConfig); //微信配置信息
        return wxPayService;
    }
	
	//生成支付二维码
	//BookingInfo 是你订单表
	 public String generatePayQrCode(BookingInfo booking, String ip) {
        try {

       
            WxPayService wxPayService = wxPayService();
            WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
            orderRequest.setOutTradeNo(booking.getDisplayNo()); //订单号
            orderRequest.setTotalFee(BigDecimal.valueOf(booking.getDisplayPrice()).multiply(new BigDecimal(100)).intValue()); //金额,转换成分 ,至少支付1分钱
            orderRequest.setSpbillCreateIp(ip);
            orderRequest.setNotifyUrl(wechatPayConfig.getRedUrl());
            orderRequest.setBody("");
            orderRequest.setAttach("");
            orderRequest.setTradeType("NATIVE");//交易类型
            orderRequest.setProductId(booking.getId().toString());

            WxPayNativeOrderResult wxPayNativeOrderResult = (WxPayNativeOrderResult) wxPayService.createOrder(orderRequest);
            return wxPayNativeOrderResult.getCodeUrl();
        } catch (Exception e) {
            // 处理异常
            e.printStackTrace();
            return e.getMessage();
        }
    }
	
	//支付回调函数
	 public String payNotify(String xmlData) {
        try {
            WxPayService wxPayService = wxPayService();
            WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
            String orderId = notifyResult.getOutTradeNo();//拿到订单号获取订单
            logger.info("wechatPayConfig.rePayNotify():{}", xmlData);
          	
          	//处理的业务
          	//因为会重复调用,如果你这里是钱包这种,那么一定要判断是否支付过了


            return WxPayNotifyResponse.success("成功_" + orderInfo.getId());
        } catch (WxPayException e) {
            e.printStackTrace();
            return WxPayNotifyResponse.fail(e.getMessage());
        }
    }

	//退款订单请求
	//RefundInfo 退款的订单,这里单笔订单,如果是多笔,你可以构建list 要循环执行
	//RefundInfo 中需要包括 支付订单的订单号、支付金额、退款的订单号、退款金额
	  public String redRefundPay(RefundInfo refund){
        try {
            if (refund == null) {
                return "订单获取失败";
            }
            WxPayService wxPayService = wxPayService();
            WxPayRefundRequest orderRequest = new WxPayRefundRequest();
            orderRequest.setOutTradeNo(refund.getDisplayNo());
            orderRequest.setNotifyUrl(wechatPayConfig.getRefundNotifyUrl());
            orderRequest.setTotalFee(BigDecimal.valueOf(refund.getDisplaySum()).multiply(new BigDecimal(100)).intValue());
            orderRequest.setRefundFee(BigDecimal.valueOf(refund.getDisplayPrice()).multiply(new BigDecimal(100)).intValue());
            orderRequest.setOutRefundNo(memberRedRefund.getDisplayNo());

            WxPayRefundResult wxPayRefundResult = wxPayService.refund(orderRequest);

            if ("SUCCESS".equals(wxPayRefundResult.getReturnCode())
                    && "SUCCESS".equals(wxPayRefundResult.getResultCode())) {
                /**
                 * 系统内部业务逻辑
                 */
               
                logger.info("wechatPayConfig.redRefundNotify():{}", refund.toString());
                
                return "退款中";
            }
            return "退款失败";


        } catch (Exception e) {
            // 处理异常
            e.printStackTrace();
            return e.getMessage();
        }
    }

	//退款回调函数
	 public String redRefundNotify(String xmlData) {
        try {
            WxPayService wxPayService = wxPayService();
            WxPayRefundNotifyResult notifyResult = wxPayService.parseRefundNotifyResult(xmlData);
            String orderId = notifyResult.getReqInfo().getOutRefundNo();//拿到订单号获取订单

            logger.info("wechatPayConfig.redRefundNotify():{}", xmlData);
            //编写自己的业务处理逻辑


            return WxPayNotifyResponse.success("成功_" + orderInfo.getId());
        } catch (WxPayException e) {
            e.printStackTrace();
            return WxPayNotifyResponse.fail(e.getMessage());
        }
    }
}

到此这篇关于springboot使用com.github.binarywang包实现微信网页上的支付和退款的文章就介绍到这了,更多相关springboot微信支付和退款内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • spring mvc 使用kaptcha配置生成验证码实例

    spring mvc 使用kaptcha配置生成验证码实例

    本篇文章主要介绍了spring mvc 使用kaptcha生成验证码实例,详细的介绍了使用Kaptcha 生成验证码的步骤,有兴趣的可以了解一下
    2017-04-04
  • Java Synchronized的偏向锁详细分析

    Java Synchronized的偏向锁详细分析

    synchronized作为Java程序员最常用同步工具,很多人却对它的用法和实现原理一知半解,以至于还有不少人认为synchronized是重量级锁,性能较差,尽量少用。但不可否认的是synchronized依然是并发首选工具,本文就来详细讲讲
    2023-04-04
  • Java 数组迭代你会用吗

    Java 数组迭代你会用吗

    Java 数组是我们学习或工作中常用到的数据结构,我们会经常写数组迭代的代码,本文介绍三种数组迭代的方式,感兴趣的可以了解一下
    2021-09-09
  • springboot实现读取nacos配置文件

    springboot实现读取nacos配置文件

    这篇文章主要介绍了springboot实现读取nacos配置文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Go Java 算法之迷你语法分析器示例详解

    Go Java 算法之迷你语法分析器示例详解

    这篇文章主要为大家介绍了Go Java 算法之迷你语法分析器示例详解,
    有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Mybatis-plus新版本分页失效PaginationInterceptor过时的问题

    Mybatis-plus新版本分页失效PaginationInterceptor过时的问题

    这篇文章主要介绍了Mybatis-plus新版本分页失效,PaginationInterceptor过时问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 超详细介绍idea中java程序打jar包的两种方式

    超详细介绍idea中java程序打jar包的两种方式

    这篇文章主要介绍了超详细介绍idea中java程序打jar包的两种方式一种是可直接执行的runnable jar文件,另一种是包含多个主类,运行时需要指定主类全类名的jar包,感兴趣的可以了解一下
    2020-07-07
  • spring MVC cors跨域实现源码解析

    spring MVC cors跨域实现源码解析

    本文主要介绍了spring MVC cors跨域实现源码解析。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java中集合遍历的方法示例代码展示

    Java中集合遍历的方法示例代码展示

    在 Java 编程中,集合(Collection)是用于存储和操作一组对象的重要工具,无论是数组、列表(List)、集合(Set),还是映射(Map),它们都提供了在不同场景下灵活使用的数据结构,这篇文章主要介绍了Java中集合遍历的方法示例代码展示,需要的朋友可以参考下
    2024-08-08
  • 15道非常经典的Java面试题 附详细答案

    15道非常经典的Java面试题 附详细答案

    这篇文章主要为大家推荐了15道非常经典的Java面试题,附详细答案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10

最新评论