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

这篇具有很好参考价值的文章主要介绍了java微信支付v3系列——6.微信支付查询订单API。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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集合,而是一个直接的对象,请求和创建微信订单的请求一样,我们往后放一放。

@Slf4j
public class WxPayRefundUtil {

	/**
	  * 解析响应数据
	  * @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();
            }
        }
    }
}

使用方法

使用方法就更简单了,基本上是无脑使用。文章来源地址https://www.toymoban.com/news/detail-403780.html

@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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】微信小程序V3支付(后台)

    目录         相关官网文档         1.需要的参数         2.引入库         3.用到的工具类         4.支付下单实现         5.支付回调 接入前准备-小程序支付 | 微信支付商户平台文档中心 微信支付-JSAPI下单 获取平台证书列表-文档中心-微信支付商户平

    2024年02月12日
    浏览(38)
  • Java实现微信小程序V3支付

    2024年02月12日
    浏览(43)
  • 小程序微信支付V3版本Java集成

    相较于之前的微信支付API,主要区别是: 遵循统一的REST的设计风格 使用JSON作为数据交互的格式,不再使用XML 使用基于非对称密钥的SHA256-RSA的数字签名算法,不再使用MD5或HMAC-SHA256 不再要求携带HTTPS客户端证书(仅需携带证书序列号) 使用AES-256-GCM,对回调中的关键信息进

    2024年02月11日
    浏览(46)
  • Java实现微信小程序V3支付 (完整demo)

    2024年02月07日
    浏览(27)
  • weixin-java-pay对接微信V3支付记录

    https://github.com/binarywang/weixin-java-pay-demo 这个demo里, 没有v3版本的配置, 这里记录一下 v3支付, 相对之前的版本来说, 更为安全, 也相对繁琐一些, 而且请求和响应都使用了json格式的数据 1. 配置 发起支付所需的配置有三个证书文件, 在商户后台申请 apiclient_cert.p12 apiclient_key.pem ap

    2024年02月11日
    浏览(41)
  • 微信支付开发 认清微信支付v2和v3

    2014年9月10号之前申请的为v2版(旧版本),之后申请的为v3版。 V2版中的参数有 AppID AppSecret 支付专用签名串PaySignKey 商户号PartnerID 初始密钥PartnerKey 并且包含一个证书文件: 安全证书 V3版中的参数有 AppID AppSecret 商户号PartnerID 初始密钥PartnerKey 商户号MCHID 申请编号 商户平台登

    2023年04月08日
    浏览(34)
  • 03、SpringBoot + 微信支付 ---- 创建订单、保存二维码url、显示订单列表

    1-1:需求: 之前的下单,只是获取支付二维码,但是并没有将订单存到数据库 需求1:点击确认支付后,创建商品的订单存到数据库 需求2:每次确认支付之前,要判断这个人是否存在已下单未支付的订单,有的话就不用再创建订单了,把他的订单查询出来给他就行。 1-2:代

    2024年02月05日
    浏览(39)
  • SpringBoot整合微信小程序支付V3(支付、退款)

    微信支付开发前,需要先获取商家信息,包括商户号、AppId、证书和密钥。 获取商户号 微信商户平台 申请成为商户 = 提交资料 = 签署协议 = 获取商户号 获取AppID 微信公众平台 注册服务号 = 服务号认证 = 获取APPID = 绑定商户号 申请商户证书 登录商户平台 = 选择 账户中心 = 安

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

    最近的一个微信小程序项目里有用到微信支付,网上找的资料都是特别乱,看起来特别懵,结合了好多文章的内容,终于做了出来,可能我的这个博文看起来也是特别乱,但是是可以直接C走简单改一改就可以用的。(支付成功回调,和退款回调因为昨天刚在阿里申请的域名还

    2024年04月25日
    浏览(40)
  • java对接微信支付api3心得(小白易懂)

            公司做的项目中,需要支付功能,因为做的微信小程序项目,所以直接就用微信支付了,以前我也对接过微信支付,但以前没有java的sdk,并且还是用的xml报文,我们还得解析xml才行,所以麻烦的很,这次对接突然发现,微信已经提供了好多中语言的sdk,其中也包

    2024年02月03日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包