目录

java微信支付v3系列——1.微信支付准备工作
java微信支付v3系列——2.微信支付基本配置
java微信支付v3系列——3.订单创建准备操作
java微信支付v3系列——4.创建订单的封装及使用
java微信支付v3系列——5.微信支付成功回调
java微信支付v3系列——6.微信支付查询订单API
java微信支付v3系列——7.微信支付之申请退款
java微信支付v3系列——8.微信支付之退款成功回调
java微信支付v3系列——9.微信支付之商家转账API

正文

什么时候会用到这个API?常规情况下,回调接口已经足够我们使用,用户支付成功后,微信会自动调用我们的回调接口进行回调,那么还需要这个API吗?

使用场景:微信服务器故障,我们的服务器故障,服务器端正在进行更新导致用户付款后端没有及时接收到微信的回调请求,那么此时我们就可以让用户点击按钮“更新支付状态”,此时再来调用这个API。

来看一下下面的java对象,是不是很熟悉?没错,这个接口的返回数据和回调接口是一样的,我们直接拿来复用一下。

@Data
@Slf4j
public class WxchatCallbackSuccessData {/*** 商户订单号*/private String orderId;/*** 微信支付系统生成的订单号*/private String transactionId;/*** 交易状态* SUCCESS:支付成功* REFUND:转入退款* NOTPAY:未支付* CLOSED:已关闭* REVOKED:已撤销(付款码支付)* USERPAYING:用户支付中(付款码支付)* PAYERROR:支付失败(其他原因,如银行返回失败)*/private String tradestate;/*** 支付完成时间*/private Date successTime;/*** 交易类型* JSAPI:公众号支付* NATIVE:扫码支付* APP:APP支付* MICROPAY:付款码支付* MWEB:H5支付* FACEPAY:刷脸支付*/private String    tradetype;/*** 订单总金额*/private BigDecimal totalMoney;public Date getSuccessTime() {return successTime;}public void setSuccessTime(String successTime) {// Hutool工具包的方法,自动识别一些常用格式的日期字符串this.successTime = DateUtil.parse(successTime);}
}

解析响应数据

和回调接口不同的是,我们的解析响应数据返回的不是Map集合,而是一个直接的对象,请求和创建微信订单的请求一样,我们往后放一放。

/*** 解析响应数据* @param response 发送请求成功后,返回的数据* @return 微信返回的参数*/
private static WxchatCallbackSuccessData resolverResponse(CloseableHttpResponse response) {try {// 1.获取请求码int statusCode = response.getStatusLine().getStatusCode();// 2.获取返回值 String 格式final String bodyAsString = EntityUtils.toString(response.getEntity());Gson gson = new Gson();if (statusCode == 200) {// 3.如果请求成功则解析成Map对象返回HashMap<String, String> resultMap = gson.fromJson(bodyAsString, HashMap.class);// 4.封装成我们需要的数据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("微信支付请求失败,提示信息:{}", bodyAsString);// 4.请求码显示失败,则尝试获取提示信息HashMap<String, String> resultMap = gson.fromJson(bodyAsString, HashMap.class);throw new DefaultException(resultMap.get("message"));}log.error("微信支付请求失败,未查询到原因,提示信息:{}", response);// 其他异常,微信也没有返回数据,这就需要具体排查了throw new IOException("request failed");}} catch (Exception e) {e.printStackTrace();throw new DefaultException(e.getMessage());} finally {try {response.close();} catch (IOException e) {e.printStackTrace();}}
}

发送查询微信订单请求

这样有两个请求,只是url不同,其余部分是一样的,一个是根据微信支付订单号查询,另一个是根据商户订单号查询。

@Slf4j
public class WxPaySearchOrderUtil {/*** 根据微信支付系统生成的订单号查询订单详情* @param wxPayConfig 微信支付配置信息* @param transactionId 微信支付系统生成的订单号* @param wxPayClient 微信支付客户端请求对象* @return 微信订单对象*/public static WxchatCallbackSuccessData searchByTransactionId(WxPayConfig wxPayConfig, String transactionId, CloseableHttpClient wxPayClient) {// 1.请求路径和对象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.完成签名并执行请求CloseableHttpResponse response = null;try {response = wxPayClient.execute(httpGet);} catch (IOException e) {e.printStackTrace();throw new DefaultException("微信支付请求失败");}// 3.解析返回的数据WxchatCallbackSuccessData callbackData = resolverResponse(response);log.info("callbackData:{}",callbackData);return callbackData;}/*** 根据微信支付系统生成的订单号查询订单详情* @param wxPayConfig 微信支付配置信息* @param orderId 我们自己的订单id* @param wxPayClient 微信支付客户端请求对象* @return 微信订单对象*/public static WxchatCallbackSuccessData searchByOrderId(WxPayConfig wxPayConfig, String orderId, CloseableHttpClient wxPayClient) {// 1.请求路径和对象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.完成签名并执行请求CloseableHttpResponse response = null;try {response = wxPayClient.execute(httpGet);} catch (IOException e) {e.printStackTrace();throw new DefaultException("微信支付请求失败");}// 3.解析返回的数据WxchatCallbackSuccessData callbackData = resolverResponse(response);log.info("callbackData:{}",callbackData);return callbackData;}/*** 解析响应数据* @param response 发送请求成功后,返回的数据* @return 微信返回的参数*/private static WxchatCallbackSuccessData resolverResponse(CloseableHttpResponse response) {try {// 1.获取请求码int statusCode = response.getStatusLine().getStatusCode();// 2.获取返回值 String 格式final String bodyAsString = EntityUtils.toString(response.getEntity());Gson gson = new Gson();if (statusCode == 200) {// 3.如果请求成功则解析成Map对象返回HashMap<String, String> resultMap = gson.fromJson(bodyAsString, HashMap.class);// 4.封装成我们需要的数据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("微信支付请求失败,提示信息:{}", bodyAsString);// 4.请求码显示失败,则尝试获取提示信息HashMap<String, String> resultMap = gson.fromJson(bodyAsString, HashMap.class);throw new DefaultException(resultMap.get("message"));}log.error("微信支付请求失败,未查询到原因,提示信息:{}", response);// 其他异常,微信也没有返回数据,这就需要具体排查了throw new IOException("request failed");}} catch (Exception e) {e.printStackTrace();throw new DefaultException(e.getMessage());} finally {try {response.close();} catch (IOException e) {e.printStackTrace();}}}
}

使用方法

使用方法就更简单了,基本上是无脑使用。

@Autowired
private WxPayConfig wxPayConfig;@Autowired
private CloseableHttpClient wxPayClient;  @ApiOperation("根据微信订单号查询订单")
@PostMapping("/search/order/transaction/{transactionId}")
public WxchatCallbackSuccessData searchByTransactionId(@PathVariable String transactionId) {return  WxPaySearchOrderUtil.searchByTransactionId(wxPayConfig,transactionId,wxPayClient);
}@ApiOperation("根据商户订单号查询")
@PostMapping("/search/order/{orderId}")
public WxchatCallbackSuccessData searchByOrderId(@PathVariable String orderId) {return  WxPaySearchOrderUtil.searchByOrderId(wxPayConfig,orderId,wxPayClient);
}

java微信支付v3系列——6.微信支付查询订单API相关推荐

  1. java微信支付v3系列——1.微信支付准备工作

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  2. java微信支付v3系列——7.微信支付之申请退款

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  3. java微信支付v3系列——8.微信支付之退款成功回调

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  4. java微信支付v3系列——5.微信支付成功回调

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  5. java微信支付v3系列——4.创建订单的封装及使用

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  6. java微信支付v3系列——3.订单创建准备操作

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  7. 【微信小程序系列】微信小程序连接后端数据库(SSM)案例

    [微信小程序系列]微信小程序连接后端数据库(SSM)案例 登录页面 login.wxml <view class="page"><loading hidden=& ...

  8. 【微信小程序系列】微信小程序超简单教程,基本语法,获取用户基本数据信息,实现对云数据库的增删改查及小程序外部api的引用示例(附源码)

    [微信小程序系列]微信小程序超简单教程 小程序项目结构 静态页面的构成 HTML:结构 css:样式 js:行为 小程序 页面全部存放在pages, 而且pages目录只能存放页面 页面包括4个文件, ...

  9. 【微信小程序系列】微信小程序简单的实现发送订阅信息

    [微信小程序系列]微信小程序简单的实现发送订阅信息 项目结构 两个云函数一个页面 获取模板 注:详细内容中的参数很重要,一会要在云函数里用 代码 app.js // app.js App({onLau ...

最新文章

  1. android电视工程模式,智能电视如何打开ADB?进入工程模式方法
  2. Github如何删除repository(仓库)
  3. JSP Cookie处理
  4. Stopwatch类学习
  5. ViewData 和 ViewBag 到底有什么区别?
  6. 6-4 使用函数统计指定数字的个数_高手不可不学的Excel引用函数(上)
  7. 测试用例又双叒叕失败了,NLP帮你
  8. 不定高宽的元素居中的方法
  9. Variant 数组
  10. 互联网岗位介绍和成长
  11. 表达式必须具有与对应表达式相同的数据类型_跟光磊学Java开发-运算符和表达式...
  12. 编译原理三大经典龙书 虎书 鲸书 编译原理第三版清华pdf 清华北大
  13. Hex Editor Crack版,十六进制编辑器使用方案
  14. Maven最新版的下载与安装教程(详细教程)
  15. Stata数据处理:清洗CFPS数据库
  16. windows 图标文件在哪里?
  17. MIT6.828学习之homework2:shell
  18. JavaScript 进阶 35 -- 构造函数、原型对象、实例之间的关系详解
  19. 10个类脑计算最值得关注玩家 |量子位智库报告(附下载)
  20. C语言中的比较大小的宏定义与反斜杠符号 ' \ '

热门文章

  1. cpu导热膏安装_我应该在CPU上涂抹多少导热膏?
  2. winrar正确破解方法
  3. Windows 9x、2K、XP、2003注册表大全
  4. 移动端滑动事件---实战笔记
  5. 【Android 应用】小白之签名文件的生成。
  6. 【数据分享】2022年11月西南地区POI数据分享(重庆、四川、贵州、云南、西藏)
  7. BT源代码学习心得(十五):客户端源代码分析(下载过程中的块选取策略)
  8. 为了让你的硬盘资源能完好地传给你的曾曾曾孙,科学家想到了这些办法……...
  9. R shiny echart4r 常见问题整理
  10. 程序员从初级到中级10个秘诀