目錄
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)查詢。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-403780.html
@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)!