【微信支付】springboot-java接入微信支付-JSAPI支付/查单/退款/发送红包(二)---查单

上篇文章我们已经结束了微信支付准备工作以及JSAPI调起支付

文章地址:https://blog.csdn.net/ssdadasd15623/article/details/134684556

接下来实现,付款后的查单操作

查询订单分为微信订单号查询以及商户订单号查询,这里使用商户订单号,也就是自己的系统的订单号

查看微信支付文档-商户订单号查询订单

https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/query-by-out-trade-no.html
在这里插入图片描述

在请求接口时,注意⚠️:请求参数内的Authorization参数需要提前生成
https://pay.weixin.qq.com/docs/merchant/development/interface-rules/signature-generation.html
在这里微信支付给出了明确的文档教我们如何构造请求签名

在这里插入图片描述

构造请求签名串

  1. 第一步是请求方式,这里查询订单是“GET”
  2. 第二步是请求的绝对URL,这里请求地址是“
    https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}”,微信给出示例代码如何获取绝对URL,例如订单号为202401010001,商户号为12345678
HttpUrl httpurl = HttpUrl.parse("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/202401010001?mchid=12345678"); //使用okhttp3 SDK
  1. 第三步是当前时间戳,这里使用currentTimeMillis()方法生成时间戳
long timestamp = System.currentTimeMillis() / 1000; //生成时间戳
  1. 第四步是请求随机字符串,这里微信支付的工具类给出了生成随机字符串的方法
String nonceStr = WXPayUtil.generateNonceStr(); //生成随机字符串
  1. 最后是请求报文主体,这里是GET方法,没有请求体,所以就是一个空的字符串
  2. 最终组合在一起的字符串为
GET\n  //请求方式
/v3/pay/transactions/out-trade-no/202401010001?mchid=12345678\n //请求地址绝对路径
1554208460\n //时间戳
593BEC0C930BF1AFEB40B4A08C8FB242\n //随机字符串
\n

⚠️每行内容后需添加换行符‘\n‘

完整代码:

Controller.java文件

......

	@Autowired
    private WxPayConfig wxPayConfig; //存放微信基本配置数据


	@GetMapping("/get_order_status")
    public Map<String, Object> get_authorization(@RequestParam String order_no) throws IOException, SignatureException, NoSuchAlgorithmException, InvalidKeyException {
        Map<String, Object> map = new HashMap<>();
        String schema = "WECHATPAY2-SHA256-RSA2048 "; //注意这个,有一个空格
        HttpUrl httpurl = HttpUrl.parse("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + order_no + "?mchid=" + wxPayConfig.getMchId()); //构造参与签名的URL
        HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + order_no + "?mchid=" + wxPayConfig.getMchId());

        httpGet.setHeader("Authorization", schema + getToken("GET", httpurl, "")); //微信支付文档说明,GET请求时body为空
        httpGet.setHeader("Accept", "application/json;charset=utf-8");

        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        CloseableHttpResponse response = httpClient.execute(httpGet);
        // 获取响应状态码
        int statusCode = response.getStatusLine().getStatusCode();
        // 获取响应内容
        String responseBody = EntityUtils.toString(response.getEntity());
        // 关闭响应对象
        response.close();
        map.put("code", statusCode);
        map.put("data", responseBody);
        return map;
    }


String getToken(String method, HttpUrl url, String body) throws UnsupportedEncodingException, SignatureException, NoSuchAlgorithmException, InvalidKeyException {
        String nonceStr = WXPayUtil.generateNonceStr(); //WXPayUtil是微信支付自带的sdk
        long timestamp = System.currentTimeMillis() / 1000; //生成时间戳
        String message = buildMessage(method, url, timestamp, nonceStr, body); 
        String signature = sign(message.getBytes("utf-8"));

        return "mchid=\"" + wxPayConfig.getMchId() + "\","
                + "nonce_str=\"" + nonceStr + "\","
                + "timestamp=\"" + timestamp + "\","
                + "serial_no=\"" + wxPayConfig.getMchSerialNo() + "\"," //mchserialNo是微信支付中申请的证书序列号
                + "signature=\"" + signature + "\"";
    }

    String sign(byte[] message) throws InvalidKeyException, SignatureException, NoSuchAlgorithmException {
        Signature sign = Signature.getInstance("SHA256withRSA");
        sign.initSign(wxPayConfig.getPrivateKey());
        sign.update(message);

        return Base64.getEncoder().encodeToString(sign.sign());
    }

    String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) {
        String canonicalUrl = url.encodedPath();
        if (url.encodedQuery() != null) {
            canonicalUrl += "?" + url.encodedQuery();
        }

        return method + "\n"
                + canonicalUrl + "\n"
                + timestamp + "\n"
                + nonceStr + "\n"
                + body + "\n";
    }
......

使用apifox测试结果:
在这里插入图片描述

  • 34
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
微信JSApi支付是指在微信公众号或小程序内使用JSAPI调起微信支付功能,实现用户在微信内完成付款的一种方式。以下是常见的问题及解决方法: 1. 支付时提示“商户订单号重复” 解决方法:修改商户订单号,确保每笔订单的商户订单号唯一。 2. 支付时提示“支付金额与订单金额不一致” 解决方法:检查订单金额和实际支付金额是否相同,确保订单金额与实际支付金额一致。 3. 支付时提示“支付失败,请稍后再试” 解决方法:检查支付参数是否正确,确保支付参数的完整性和准确性。 4. 支付时提示“当前用户未授权,请先授权登录” 解决方法:用户需要先授权登录,获取用户信息后才能进行支付操作。 5. 支付时提示“当前用户未关注公众号” 解决方法:用户需要先关注公众号,才能进行支付操作。 6. 支付时提示“商户号与appid不匹配” 解决方法:检查商户号和appid是否对应,确保商户号和appid的匹配性。 7. 支付时提示“订单已关闭” 解决方法:订单可能已经被关闭或者已经完成支付,需要重新下单。 8. 支付时提示“系统繁忙,请稍后再试” 解决方法:服务器可能正在维护或者出现故障,需要等待一段时间后再尝试支付。 以上是微信JSApi支付常见问题及解决方法,如果以上方法无法解决问题,可以联系微信支付客服进行咨询。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值