国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java微信支付v3系列——6.微信支付查詢訂單API

這篇具有很好參考價(jià)值的文章主要介紹了java微信支付v3系列——6.微信支付查詢訂單API。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

java微信支付v3系列——1.微信支付準(zhǔn)備工作
java微信支付v3系列——2.微信支付基本配置
java微信支付v3系列——3.訂單創(chuàng)建準(zhǔn)備操作
java微信支付v3系列——4.創(chuàng)建訂單的封裝及使用
java微信支付v3系列——5.微信支付成功回調(diào)
java微信支付v3系列——6.微信支付查詢訂單API
java微信支付v3系列——7.微信支付之申請(qǐng)退款
java微信支付v3系列——8.微信支付之退款成功回調(diào)
java微信支付v3系列——9.微信支付之商家轉(zhuǎn)賬API

正文

什么時(shí)候會(huì)用到這個(gè)API?常規(guī)情況下,回調(diào)接口已經(jīng)足夠我們使用,用戶支付成功后,微信會(huì)自動(dòng)調(diào)用我們的回調(diào)接口進(jìn)行回調(diào),那么還需要這個(gè)API嗎?

使用場(chǎng)景:微信服務(wù)器故障,我們的服務(wù)器故障,服務(wù)器端正在進(jìn)行更新導(dǎo)致用戶付款后端沒(méi)有及時(shí)接收到微信的回調(diào)請(qǐng)求,那么此時(shí)我們就可以讓用戶點(diǎn)擊按鈕“更新支付狀態(tài)”,此時(shí)再來(lái)調(diào)用這個(gè)API。

來(lái)看一下下面的java對(duì)象,是不是很熟悉?沒(méi)錯(cuò),這個(gè)接口的返回?cái)?shù)據(jù)和回調(diào)接口是一樣的,我們直接拿來(lái)復(fù)用一下。

@Data
@Slf4j
public class WxchatCallbackSuccessData {

    /**
     * 商戶訂單號(hào)
     */
    private String orderId;

    /**
     * 微信支付系統(tǒng)生成的訂單號(hào)
     */
    private String transactionId;

    /**
     * 交易狀態(tài)
     * SUCCESS:支付成功
     * REFUND:轉(zhuǎn)入退款
     * NOTPAY:未支付
     * CLOSED:已關(guān)閉
     * REVOKED:已撤銷(付款碼支付)
     * USERPAYING:用戶支付中(付款碼支付)
     * PAYERROR:支付失敗(其他原因,如銀行返回失敗)
     */
    private String tradestate;

    /**
     * 支付完成時(shí)間
     */
    private Date successTime;

    /**
     * 交易類型
     * JSAPI:公眾號(hào)支付
     * NATIVE:掃碼支付
     * APP:APP支付
     * MICROPAY:付款碼支付
     * MWEB:H5支付
     * FACEPAY:刷臉支付
     */
    private String 	tradetype;

    /**
     * 訂單總金額
     */
    private BigDecimal totalMoney;


    public Date getSuccessTime() {
        return successTime;
    }

    public void setSuccessTime(String successTime) {
        // Hutool工具包的方法,自動(dòng)識(shí)別一些常用格式的日期字符串
        this.successTime = DateUtil.parse(successTime);
    }
}

解析響應(yīng)數(shù)據(jù)

和回調(diào)接口不同的是,我們的解析響應(yīng)數(shù)據(jù)返回的不是Map集合,而是一個(gè)直接的對(duì)象,請(qǐng)求和創(chuàng)建微信訂單的請(qǐng)求一樣,我們往后放一放。

@Slf4j
public class WxPayRefundUtil {

	/**
	  * 解析響應(yīng)數(shù)據(jù)
	  * @param response 發(fā)送請(qǐng)求成功后,返回的數(shù)據(jù)
	  * @return 微信返回的參數(shù)
	  */
	private static WxchatCallbackSuccessData resolverResponse(CloseableHttpResponse response) {
	    try {
	        // 1.獲取請(qǐng)求碼
	        int statusCode = response.getStatusLine().getStatusCode();
	        // 2.獲取返回值 String 格式
	        final String bodyAsString = EntityUtils.toString(response.getEntity());
	
	        Gson gson = new Gson();
	        if (statusCode == 200) {
	            // 3.如果請(qǐng)求成功則解析成Map對(duì)象返回
	            HashMap<String, String> resultMap = gson.fromJson(bodyAsString, HashMap.class);
	
	            // 4.封裝成我們需要的數(shù)據(jù)
	            WxchatCallbackSuccessData callbackData = new WxchatCallbackSuccessData();
	            callbackData.setSuccessTime(String.valueOf(resultMap.get("success_time")));
	            callbackData.setOrderId(String.valueOf(resultMap.get("out_trade_no")));
	            callbackData.setTransactionId(String.valueOf(resultMap.get("transaction_id")));
	            callbackData.setTradestate(String.valueOf(resultMap.get("trade_state")));
	            callbackData.setTradetype(String.valueOf(resultMap.get("trade_type")));
	            String amount = String.valueOf(resultMap.get("amount"));
	            HashMap<String,Object> amountMap = gson.fromJson(amount, HashMap.class);
	            String total = String.valueOf(amountMap.get("total"));
	            callbackData.setTotalMoney(new BigDecimal(total).movePointLeft(2));
	            return callbackData;
	        } else {
	            if (StringUtils.isNoneBlank(bodyAsString)) {
	                log.error("微信支付請(qǐng)求失敗,提示信息:{}", bodyAsString);
	                // 4.請(qǐng)求碼顯示失敗,則嘗試獲取提示信息
	                HashMap<String, String> resultMap = gson.fromJson(bodyAsString, HashMap.class);
	                throw new DefaultException(resultMap.get("message"));
	            }
	            log.error("微信支付請(qǐng)求失敗,未查詢到原因,提示信息:{}", response);
	            // 其他異常,微信也沒(méi)有返回?cái)?shù)據(jù),這就需要具體排查了
	            throw new IOException("request failed");
	        }
	    } catch (Exception e) {
	        e.printStackTrace();
	        throw new DefaultException(e.getMessage());
	    } finally {
	        try {
	            response.close();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }
	}
}

發(fā)送查詢微信訂單請(qǐng)求

這樣有兩個(gè)請(qǐng)求,只是url不同,其余部分是一樣的,一個(gè)是根據(jù)微信支付訂單號(hào)查詢,另一個(gè)是根據(jù)商戶訂單號(hào)查詢。

@Slf4j
public class WxPaySearchOrderUtil {


    /**
     * 根據(jù)微信支付系統(tǒng)生成的訂單號(hào)查詢訂單詳情
     * @param wxPayConfig 微信支付配置信息
     * @param transactionId 微信支付系統(tǒng)生成的訂單號(hào)
     * @param wxPayClient 微信支付客戶端請(qǐng)求對(duì)象
     * @return 微信訂單對(duì)象
     */
    public static WxchatCallbackSuccessData searchByTransactionId(WxPayConfig wxPayConfig, String transactionId, CloseableHttpClient wxPayClient) {
        // 1.請(qǐng)求路徑和對(duì)象
        String url = wxPayConfig.getDomain().concat("/v3/pay/transactions/id/").concat(transactionId).concat("?mchid=").concat(wxPayConfig.getMchId());
        HttpGet httpGet = new HttpGet(url);
        httpGet.setHeader("Accept", "application/json");

        // 2.完成簽名并執(zhí)行請(qǐng)求
        CloseableHttpResponse response = null;
        try {
            response = wxPayClient.execute(httpGet);
        } catch (IOException e) {
            e.printStackTrace();
            throw new DefaultException("微信支付請(qǐng)求失敗");
        }

        // 3.解析返回的數(shù)據(jù)
        WxchatCallbackSuccessData callbackData = resolverResponse(response);
        log.info("callbackData:{}",callbackData);
        return callbackData;
    }

    /**
     * 根據(jù)微信支付系統(tǒng)生成的訂單號(hào)查詢訂單詳情
     * @param wxPayConfig 微信支付配置信息
     * @param orderId 我們自己的訂單id
     * @param wxPayClient 微信支付客戶端請(qǐng)求對(duì)象
     * @return 微信訂單對(duì)象
     */
    public static WxchatCallbackSuccessData searchByOrderId(WxPayConfig wxPayConfig, String orderId, CloseableHttpClient wxPayClient) {
        // 1.請(qǐng)求路徑和對(duì)象
        String url = wxPayConfig.getDomain().concat("/v3/pay/transactions/out-trade-no/").concat(orderId).concat("?mchid=").concat(wxPayConfig.getMchId());
        HttpGet httpGet = new HttpGet(url);
        httpGet.setHeader("Accept", "application/json");

        // 2.完成簽名并執(zhí)行請(qǐng)求
        CloseableHttpResponse response = null;
        try {
            response = wxPayClient.execute(httpGet);
        } catch (IOException e) {
            e.printStackTrace();
            throw new DefaultException("微信支付請(qǐng)求失敗");
        }

        // 3.解析返回的數(shù)據(jù)
        WxchatCallbackSuccessData callbackData = resolverResponse(response);
        log.info("callbackData:{}",callbackData);
        return callbackData;
    }


    /**
     * 解析響應(yīng)數(shù)據(jù)
     * @param response 發(fā)送請(qǐng)求成功后,返回的數(shù)據(jù)
     * @return 微信返回的參數(shù)
     */
    private static WxchatCallbackSuccessData resolverResponse(CloseableHttpResponse response) {
        try {
            // 1.獲取請(qǐng)求碼
            int statusCode = response.getStatusLine().getStatusCode();
            // 2.獲取返回值 String 格式
            final String bodyAsString = EntityUtils.toString(response.getEntity());

            Gson gson = new Gson();
            if (statusCode == 200) {
                // 3.如果請(qǐng)求成功則解析成Map對(duì)象返回
                HashMap<String, String> resultMap = gson.fromJson(bodyAsString, HashMap.class);

                // 4.封裝成我們需要的數(shù)據(jù)
                WxchatCallbackSuccessData callbackData = new WxchatCallbackSuccessData();
                callbackData.setSuccessTime(String.valueOf(resultMap.get("success_time")));
                callbackData.setOrderId(String.valueOf(resultMap.get("out_trade_no")));
                callbackData.setTransactionId(String.valueOf(resultMap.get("transaction_id")));
                callbackData.setTradestate(String.valueOf(resultMap.get("trade_state")));
                callbackData.setTradetype(String.valueOf(resultMap.get("trade_type")));
                String amount = String.valueOf(resultMap.get("amount"));
                HashMap<String,Object> amountMap = gson.fromJson(amount, HashMap.class);
                String total = String.valueOf(amountMap.get("total"));
                callbackData.setTotalMoney(new BigDecimal(total).movePointLeft(2));
                return callbackData;
            } else {
                if (StringUtils.isNoneBlank(bodyAsString)) {
                    log.error("微信支付請(qǐng)求失敗,提示信息:{}", bodyAsString);
                    // 4.請(qǐng)求碼顯示失敗,則嘗試獲取提示信息
                    HashMap<String, String> resultMap = gson.fromJson(bodyAsString, HashMap.class);
                    throw new DefaultException(resultMap.get("message"));
                }
                log.error("微信支付請(qǐng)求失敗,未查詢到原因,提示信息:{}", response);
                // 其他異常,微信也沒(méi)有返回?cái)?shù)據(jù),這就需要具體排查了
                throw new IOException("request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new DefaultException(e.getMessage());
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

使用方法

使用方法就更簡(jiǎn)單了,基本上是無(wú)腦使用。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-403780.html

@Autowired
private WxPayConfig wxPayConfig;

@Autowired
private CloseableHttpClient wxPayClient;  

@ApiOperation("根據(jù)微信訂單號(hào)查詢訂單")
@PostMapping("/search/order/transaction/{transactionId}")
public WxchatCallbackSuccessData searchByTransactionId(@PathVariable String transactionId) {
    return  WxPaySearchOrderUtil.searchByTransactionId(wxPayConfig,transactionId,wxPayClient);
}

@ApiOperation("根據(jù)商戶訂單號(hào)查詢")
@PostMapping("/search/order/{orderId}")
public WxchatCallbackSuccessData searchByOrderId(@PathVariable String orderId) {
    return  WxPaySearchOrderUtil.searchByOrderId(wxPayConfig,orderId,wxPayClient);
}

到了這里,關(guān)于java微信支付v3系列——6.微信支付查詢訂單API的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Java】微信小程序V3支付(后臺(tái))

    【Java】微信小程序V3支付(后臺(tái))

    目錄 ????????相關(guān)官網(wǎng)文檔 ????????1.需要的參數(shù) ????????2.引入庫(kù) ????????3.用到的工具類 ????????4.支付下單實(shí)現(xiàn) ????????5.支付回調(diào) 接入前準(zhǔn)備-小程序支付 | 微信支付商戶平臺(tái)文檔中心 微信支付-JSAPI下單 獲取平臺(tái)證書(shū)列表-文檔中心-微信支付商戶平

    2024年02月12日
    瀏覽(52)
  • Java實(shí)現(xiàn)微信小程序V3支付
  • 小程序微信支付V3版本Java集成

    相較于之前的微信支付API,主要區(qū)別是: 遵循統(tǒng)一的REST的設(shè)計(jì)風(fēng)格 使用JSON作為數(shù)據(jù)交互的格式,不再使用XML 使用基于非對(duì)稱密鑰的SHA256-RSA的數(shù)字簽名算法,不再使用MD5或HMAC-SHA256 不再要求攜帶HTTPS客戶端證書(shū)(僅需攜帶證書(shū)序列號(hào)) 使用AES-256-GCM,對(duì)回調(diào)中的關(guān)鍵信息進(jìn)

    2024年02月11日
    瀏覽(20)
  • Java實(shí)現(xiàn)微信小程序V3支付 (完整demo)
  • weixin-java-pay對(duì)接微信V3支付記錄

    https://github.com/binarywang/weixin-java-pay-demo 這個(gè)demo里, 沒(méi)有v3版本的配置, 這里記錄一下 v3支付, 相對(duì)之前的版本來(lái)說(shuō), 更為安全, 也相對(duì)繁瑣一些, 而且請(qǐng)求和響應(yīng)都使用了json格式的數(shù)據(jù) 1. 配置 發(fā)起支付所需的配置有三個(gè)證書(shū)文件, 在商戶后臺(tái)申請(qǐng) apiclient_cert.p12 apiclient_key.pem ap

    2024年02月11日
    瀏覽(24)
  • 微信支付開(kāi)發(fā) 認(rèn)清微信支付v2和v3

    微信支付開(kāi)發(fā) 認(rèn)清微信支付v2和v3

    2014年9月10號(hào)之前申請(qǐng)的為v2版(舊版本),之后申請(qǐng)的為v3版。 V2版中的參數(shù)有 AppID AppSecret 支付專用簽名串PaySignKey 商戶號(hào)PartnerID 初始密鑰PartnerKey 并且包含一個(gè)證書(shū)文件: 安全證書(shū) V3版中的參數(shù)有 AppID AppSecret 商戶號(hào)PartnerID 初始密鑰PartnerKey 商戶號(hào)MCHID 申請(qǐng)編號(hào) 商戶平臺(tái)登

    2023年04月08日
    瀏覽(30)
  • 03、SpringBoot + 微信支付 ---- 創(chuàng)建訂單、保存二維碼url、顯示訂單列表

    03、SpringBoot + 微信支付 ---- 創(chuàng)建訂單、保存二維碼url、顯示訂單列表

    1-1:需求: 之前的下單,只是獲取支付二維碼,但是并沒(méi)有將訂單存到數(shù)據(jù)庫(kù) 需求1:點(diǎn)擊確認(rèn)支付后,創(chuàng)建商品的訂單存到數(shù)據(jù)庫(kù) 需求2:每次確認(rèn)支付之前,要判斷這個(gè)人是否存在已下單未支付的訂單,有的話就不用再創(chuàng)建訂單了,把他的訂單查詢出來(lái)給他就行。 1-2:代

    2024年02月05日
    瀏覽(23)
  • SpringBoot整合微信小程序支付V3(支付、退款)

    微信支付開(kāi)發(fā)前,需要先獲取商家信息,包括商戶號(hào)、AppId、證書(shū)和密鑰。 獲取商戶號(hào) 微信商戶平臺(tái) 申請(qǐng)成為商戶 = 提交資料 = 簽署協(xié)議 = 獲取商戶號(hào) 獲取AppID 微信公眾平臺(tái) 注冊(cè)服務(wù)號(hào) = 服務(wù)號(hào)認(rèn)證 = 獲取APPID = 綁定商戶號(hào) 申請(qǐng)商戶證書(shū) 登錄商戶平臺(tái) = 選擇 賬戶中心 = 安

    2024年02月08日
    瀏覽(50)
  • SpringBoot 整合微信小程序微信支付V3 jsapi (支付、退款)

    SpringBoot 整合微信小程序微信支付V3 jsapi (支付、退款)

    最近的一個(gè)微信小程序項(xiàng)目里有用到微信支付,網(wǎng)上找的資料都是特別亂,看起來(lái)特別懵,結(jié)合了好多文章的內(nèi)容,終于做了出來(lái),可能我的這個(gè)博文看起來(lái)也是特別亂,但是是可以直接C走簡(jiǎn)單改一改就可以用的。(支付成功回調(diào),和退款回調(diào)因?yàn)樽蛱靹傇诎⒗锷暾?qǐng)的域名還

    2024年04月25日
    瀏覽(23)
  • java對(duì)接微信支付api3心得(小白易懂)

    java對(duì)接微信支付api3心得(小白易懂)

    ????????公司做的項(xiàng)目中,需要支付功能,因?yàn)樽龅奈⑿判〕绦蝽?xiàng)目,所以直接就用微信支付了,以前我也對(duì)接過(guò)微信支付,但以前沒(méi)有java的sdk,并且還是用的xml報(bào)文,我們還得解析xml才行,所以麻煩的很,這次對(duì)接突然發(fā)現(xiàn),微信已經(jīng)提供了好多中語(yǔ)言的sdk,其中也包

    2024年02月03日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包