收藏
回答

小程序下单/v3/pay/transactions/jsapi,请求报400,什么原因?

    /**
     * 获取预支付id
     * @param response
     */
    @Override
    public String getPrepayId( String ipAddr,HttpServletResponse response) throws IOException, NoSuchAlgorithmException, SignatureException, InvalidKeyException {
        // 加载商户私钥(privateKey:私钥字符串)
        PrivateKey merchantPrivateKey = PemUtil
                .loadPrivateKey(new ByteArrayInputStream(weixinpayProperties.getPrivateKey().getBytes("utf-8")));

        // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
        AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
                new WechatPay2Credentials(weixinpayProperties.getMchId(), new PrivateKeySigner(weixinpayProperties.getMchSerialNo(), merchantPrivateKey)),weixinpayProperties.getApiKey().getBytes("utf-8"));

        // 初始化httpClient
        HttpClient httpClient = WechatPayHttpClientBuilder.create()
                .withMerchant(weixinpayProperties.getMchId(), weixinpayProperties.getMchSerialNo(), merchantPrivateKey)
                .withValidator(new WechatPay2Validator(verifier)).build();

        // 请求URL
        HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi");
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-Type", "application/json");

        // 订单名称,必填
        String subject = "福利兑换测试商品";
        // 付款金额,必填
        int totalAmount = 1;
        // 商品描述,可空
        String body = subject + ";";
        String outTradeNo = IdUtil.fastSimpleUUID();
        // 公用回传参数
        String passbackParams = "123456";
        Map reqDataMap = new HashMap();
        reqDataMap.put("appid", weixinpayProperties.getAppId());
        reqDataMap.put("mchid", weixinpayProperties.getMchId());
        reqDataMap.put("description", body);
        reqDataMap.put("out_trade_no", outTradeNo);
//        reqDataMap.put("attach", passbackParams);
        reqDataMap.put("notify_url", weixinpayProperties.getNotifyUrl());
        Map amountMap = new HashMap();
        amountMap.put("total", totalAmount);
        amountMap.put("currency", "CNY");
        reqDataMap.put("amount", amountMap);
        Map payer = new HashMap();
        payer.put("openid", "oHj106RQfovPJ549Xhd-iVn2FIns");
        reqDataMap.put("payer", payer);
//        Map sceneInfoMap = new HashMap();
//        sceneInfoMap.put("payer_client_ip", ipAddr);
//        Map h5InfoMap = new HashMap();
//        h5InfoMap.put("type", "MWEB");
//        sceneInfoMap.put("h5_info", h5InfoMap);
//        reqDataMap.put("scene_info", sceneInfoMap);

        logger.warn("请求参数:{}", JSONObject.toJSONString(reqDataMap));
        StringEntity entity = new StringEntity(JSONObject.toJSONString(reqDataMap),"utf-8");
        logger.warn("请求参数实体:{}", JSONObject.toJSONString(entity));
        httpPost.setEntity(entity);
        entity.setContentType("application/json");
        Header[] allHeaders = httpPost.getAllHeaders();
        logger.warn("allHeaders=============={}",JSONUtil.toJsonStr(allHeaders));

//        String token = WeixinTokenUtil.getToken("POST", "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi", JSONObject.toJSONString(reqDataMap));
//        logger.warn("获取到的token:{}", token);
//        httpPost.setHeader("Authorization", token);
        // 完成签名并执行请求
        HttpResponse payResponse = httpClient.execute(httpPost);

        Header[] allHeaders2 = httpPost.getAllHeaders();
        logger.warn("allHeaders2=============={}",JSONUtil.toJsonStr(allHeaders2));
        int statusCode = payResponse.getStatusLine().getStatusCode();
        logger.warn("statusCode:{}", statusCode);
        String prepay_id = "";
        if (statusCode == 200) {
            logger.warn("success,return body {} ",  EntityUtils.toString(payResponse.getEntity()));
            prepay_id = JSONObject.parseObject(EntityUtils.toString(payResponse.getEntity())).get("prepay_id").toString();
            logger.warn("prepay_id {} ",  prepay_id);
//            response.getWriter().write(h5_url);
        } else if (statusCode == 204) {
            logger.warn("success");
        } else {
            logger.warn("failed,resp code = " + statusCode + ",return body = " + JSONObject.toJSONString(payResponse));
            throw new IOException("request failed");
        }
        return prepay_id;

    }


错误日志,找不到错误原因?


resp code = 400,return body = {"allHeaders":[{"buffer":{"empty":false,"full":false},"elements":[{"name":"nginx","parameterCount":0,"parameters":[]}],"name":"Server","value":"nginx","valuePos":7},{"buffer":{"empty":false,"full":false},"elements":[{"name":"Sat","parameterCount":0,"parameters":[]},{"name":"04 Jan 2025 03:10:19 GMT","parameterCount":0,"parameters":[]}],"name":"Date","value":"Sat, 04 Jan 2025 03:10:19 GMT","valuePos":5},{"buffer":{"empty":false,"full":false},"elements":[{"name":"application/json","parameterCount":1,"parameters":[{"name":"charset","value":"utf-8"}]}],"name":"Content-Type","value":"application/json; charset=utf-8","valuePos":13},{"buffer":{"empty":false,"full":false},"elements":[{"name":"58","parameterCount":0,"parameters":[]}],"name":"Content-Length","value":"58","valuePos":15},{"buffer":{"empty":false,"full":false},"elements":[{"name":"keep-alive","parameterCount":0,"parameters":[]}],"name":"Connection","value":"keep-alive","valuePos":11},{"buffer":{"empty":false,"full":false},"elements":[{"name":"timeout","parameterCount":0,"parameters":[],"value":"8"}],"name":"Keep-Alive","value":"timeout=8","valuePos":11},{"buffer":{"empty":false,"full":false},"elements":[{"name":"no-cache","parameterCount":0,"parameters":[]},{"name":"must-revalidate","parameterCount":0,"parameters":[]}],"name":"Cache-Control","value":"no-cache, must-revalidate","valuePos":14},{"buffer":{"empty":false,"full":false},"elements":[{"name":"nosniff","parameterCount":0,"parameters":[]}],"name":"X-Content-Type-Options","value":"nosniff","valuePos":23},{"buffer":{"empty":false,"full":false},"elements":[{"name":"089BCDE2BB0610B6031896CD8C58209FA00E28F68E03-268501091","parameterCount":0,"parameters":[]}],"name":"Request-ID","value":"089BCDE2BB0610B6031896CD8C58209FA00E28F68E03-268501091","valuePos":11},{"buffer":{"empty":false,"full":false},"elements":[{"name":"zh-CN","parameterCount":0,"parameters":[]}],"name":"Content-Language","value":"zh-CN","valuePos":17},{"buffer":{"empty":false,"full":false},"elements":[{"name":"46dd8158e7c75b1798e6c44fb5692707","parameterCount":0,"parameters":[]}],"name":"Wechatpay-Nonce","value":"46dd8158e7c75b1798e6c44fb5692707","valuePos":16},{"buffer":{"empty":false,"full":true},"elements":[{"name":"F311nyMKh6n5W0FJuWR8JisX0xyPjQlaiExUi+/137ntNU2Yz0kVFOB8MXxLBcono0Fasb5Ezgfj2qnSnpEQlVeKVtH8dEalKT75s9UXCsTNFUCAcW+/eDI/i8kdSWUyHqnMQdVNX4a3hx2hiS6E78iuDH4GuRTew5HEToKX1WOeD+ETQ1bAeF0ry0HVXCNDdM4xncMZL2pOnQqGgvjjjXo9UM8KYMQ1lz7OzH6eK0bJWnkuly7Bv45b5BaUPB7OmVQ1zS+EC7XMk7ivpcHWLVSVmA3Jpij4ojZ6Q4gysMsGjSF58oTT9M9Diqdxn2jXeUExd8z6khzd0LFk+I0DjA","parameterCount":0,"parameters":[],"value":"="}],"name":"Wechatpay-Signature","value":"F311nyMKh6n5W0FJuWR8JisX0xyPjQlaiExUi+/137ntNU2Yz0kVFOB8MXxLBcono0Fasb5Ezgfj2qnSnpEQlVeKVtH8dEalKT75s9UXCsTNFUCAcW+/eDI/i8kdSWUyHqnMQdVNX4a3hx2hiS6E78iuDH4GuRTew5HEToKX1WOeD+ETQ1bAeF0ry0HVXCNDdM4xncMZL2pOnQqGgvjjjXo9UM8KYMQ1lz7OzH6eK0bJWnkuly7Bv45b5BaUPB7OmVQ1zS+EC7XMk7ivpcHWLVSVmA3Jpij4ojZ6Q4gysMsGjSF58oTT9M9Diqdxn2jXeUExd8z6khzd0LFk+I0DjA==","valuePos":20},{"buffer":{"empty":false,"full":false},"elements":[{"name":"1735960219","parameterCount":0,"parameters":[]}],"name":"Wechatpay-Timestamp","value":"1735960219","valuePos":20},{"buffer":{"empty":false,"full":false},"elements":[{"name":"53ACA85B1F0054C927E51A48FC2C69D16D7A2886","parameterCount":0,"parameters":[]}],"name":"Wechatpay-Serial","value":"53ACA85B1F0054C927E51A48FC2C69D16D7A2886","valuePos":17},{"buffer":{"empty":false,"full":false},"elements":[{"name":"WECHATPAY2-SHA256-RSA2048","parameterCount":0,"parameters":[]}],"name":"Wechatpay-Signature-Type","value":"WECHATPAY2-SHA256-RSA2048","valuePos":25}],"entity":{"chunked":false,"contentLength":58,"contentType":{"$ref":"$.allHeaders[2]"},"repeatable":false,"streaming":true},"locale":"en_US","params":{"names":[]},"protocolVersion":{"major":1,"minor":1,"protocol":"HTTP"},"statusLine":{"protocolVersion":{"$ref":"$.protocolVersion"},"reasonPhrase":"Bad Request","statusCode":400}}



最后一次编辑于  01-06
回答关注问题邀请回答
收藏

1 个回答

  • 养乐多
    养乐多
    01-06

    问题解决:openid传入错误,使用了微信的unionid,导致400。

    "openid", "oHj106RQfovPJ549Xhd-iVn2FIns",替换成正确的openid即可

    01-06
    有用
    回复
登录 后发表内容