最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot使用com.github.binarywang包實(shí)現(xiàn)微信網(wǎng)頁上的支付和退款

 更新時間:2024年05月27日 11:27:14   作者:layman0528  
最近做項(xiàng)目需要實(shí)現(xiàn)在pc端需要實(shí)現(xiàn)微信的支付,本文主要介紹了springboot使用com.github.binarywang包實(shí)現(xiàn)微信網(wǎng)頁上的支付和退款,具有一定的參考價值,感興趣的可以了解一下

前提

微信小程序中實(shí)現(xiàn)微信支付是從小程序中調(diào)去微信支付的界面直接進(jìn)行支付,那么在pc端需要實(shí)現(xiàn)微信的支付呢,是需要出現(xiàn)一個二維碼讓用戶使用掃碼支付的。

注意:

需要實(shí)現(xiàn)pc端的微信支付,需要在微信商戶平臺開通native支付,并且下載并配置商戶證書

在這里插入圖片描述

在這里插入圖片描述

設(shè)置好這些之后,直接看看在springboot 或者springclound 中如何實(shí)現(xiàn)。

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 是 支付回調(diào)地址
refundNotifyUrl是 退款回調(diào)地址
這兩個地址都必須是外網(wǎng)可訪問的地址

新建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()); //金額,轉(zhuǎn)換成分 ,至少支付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();
        }
    }
	
	//支付回調(diào)函數(shù)
	 public String payNotify(String xmlData) {
        try {
            WxPayService wxPayService = wxPayService();
            WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
            String orderId = notifyResult.getOutTradeNo();//拿到訂單號獲取訂單
            logger.info("wechatPayConfig.rePayNotify():{}", xmlData);
          	
          	//處理的業(yè)務(wù)
          	//因?yàn)闀貜?fù)調(diào)用,如果你這里是錢包這種,那么一定要判斷是否支付過了


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

	//退款訂單請求
	//RefundInfo 退款的訂單,這里單筆訂單,如果是多筆,你可以構(gòu)建list 要循環(huán)執(zhí)行
	//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())) {
                /**
                 * 系統(tǒng)內(nèi)部業(yè)務(wù)邏輯
                 */
               
                logger.info("wechatPayConfig.redRefundNotify():{}", refund.toString());
                
                return "退款中";
            }
            return "退款失敗";


        } catch (Exception e) {
            // 處理異常
            e.printStackTrace();
            return e.getMessage();
        }
    }

	//退款回調(diào)函數(shù)
	 public String redRefundNotify(String xmlData) {
        try {
            WxPayService wxPayService = wxPayService();
            WxPayRefundNotifyResult notifyResult = wxPayService.parseRefundNotifyResult(xmlData);
            String orderId = notifyResult.getReqInfo().getOutRefundNo();//拿到訂單號獲取訂單

            logger.info("wechatPayConfig.redRefundNotify():{}", xmlData);
            //編寫自己的業(yè)務(wù)處理邏輯


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

到此這篇關(guān)于springboot使用com.github.binarywang包實(shí)現(xiàn)微信網(wǎng)頁上的支付和退款的文章就介紹到這了,更多相關(guān)springboot微信支付和退款內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • SpringEvents與異步事件驅(qū)動案例詳解

    SpringEvents與異步事件驅(qū)動案例詳解

    本文深入探討了SpringBoot中的事件驅(qū)動架構(gòu),特別是通過Spring事件機(jī)制實(shí)現(xiàn)組件解耦和系統(tǒng)擴(kuò)展性增強(qiáng),介紹了事件的發(fā)布者、事件本身、事件監(jiān)聽器和事件處理器的概念,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 如何在springboot中配置和使用mybatis-plus

    如何在springboot中配置和使用mybatis-plus

    這篇文章主要給大家介紹了關(guān)于如何在springboot中配置和使用mybatis-plus的相關(guān)資料,MyBatis?Plus是MyBatis的增強(qiáng)版,旨在提供更多便捷的特性,減少開發(fā)工作,同時保留了MyBatis的靈活性和強(qiáng)大性能,需要的朋友可以參考下
    2023-11-11
  • Java程序包裝成桌面應(yīng)用程序方式

    Java程序包裝成桌面應(yīng)用程序方式

    這篇文章主要介紹了Java程序包裝成桌面應(yīng)用程序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java多線程基礎(chǔ)——Lock類

    Java多線程基礎(chǔ)——Lock類

    Lock類是Java類來提供的功能,豐富的api使得Lock類的同步功能比synchronized的同步更強(qiáng)大。本文對此進(jìn)行詳細(xì)介紹,下面跟著小編一起來看下吧
    2017-02-02
  • java實(shí)現(xiàn)圖片裁切的工具類實(shí)例

    java實(shí)現(xiàn)圖片裁切的工具類實(shí)例

    這篇文章主要介紹了java實(shí)現(xiàn)圖片裁切的工具類實(shí)例,涉及Java針對圖片的讀取、修改等相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Java非靜態(tài)成員變量之死循環(huán)(詳解)

    Java非靜態(tài)成員變量之死循環(huán)(詳解)

    下面小編就為大家?guī)硪黄狫ava非靜態(tài)成員變量之死循環(huán)(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 為什么mybatis中的SqlSession一定要關(guān)閉

    為什么mybatis中的SqlSession一定要關(guān)閉

    這篇文章主要介紹了為什么mybatis中的SqlSession一定要關(guān)閉,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中什么是類加載及類加載的過程

    Java中什么是類加載及類加載的過程

    Java類加載是JVM將類文件加載至內(nèi)存,分加載、連接(驗(yàn)證/準(zhǔn)備/解析)和初始化三階段,本文給大家介紹Java中什么是類加載及類加載的過程,感興趣的朋友一起看看吧
    2025-06-06
  • 淺談一下Java中的堆和棧

    淺談一下Java中的堆和棧

    這篇文章主要介紹了一下Java中的堆和棧,Java數(shù)據(jù)類型在執(zhí)行過程中存儲在兩種不同形式的內(nèi)存中:棧和堆,它們通常由運(yùn)行Java虛擬機(jī)(JVM)的底層平臺維護(hù),需要的朋友可以參考下
    2023-04-04
  • java中利用List的subList方法實(shí)現(xiàn)對List分頁(簡單易學(xué))

    java中利用List的subList方法實(shí)現(xiàn)對List分頁(簡單易學(xué))

    本篇文章主要介紹了java中l(wèi)ist數(shù)據(jù)拆分為sublist實(shí)現(xiàn)頁面分頁的簡單代碼,具有一定的參考價值,有需要的可以了解一下。
    2016-11-11

最新評論

新巴尔虎右旗| 哈尔滨市| 门源| 寿光市| 锡林郭勒盟| 环江| 阳朔县| 伊川县| 罗平县| 左云县| 信宜市| 淳化县| 增城市| 简阳市| 辛集市| 德惠市| 尤溪县| 汝州市| 青岛市| 定陶县| 新昌县| 汝南县| 温泉县| 讷河市| 陵川县| 黔东| 镇安县| 新化县| 汉寿县| 泰顺县| 阳原县| 渭源县| 石河子市| 玛沁县| 桓台县| 北宁市| 泾源县| 焉耆| 刚察县| 郧西县| 汉沽区|