Giter Club home page Giter Club logo

Comments (11)

xy-peng avatar xy-peng commented on June 5, 2024

#42 中提到的使用有没有效果?

this.restTemplate.getMessageConverters()
        .add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));

我需要实验一下

from wechatpay-apache-httpclient.

1440530275 avatar 1440530275 commented on June 5, 2024

#42 中提到的使用有没有效果?

this.restTemplate.getMessageConverters()
        .add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));

我需要实验一下

使用过, 但是没有效果, 集成的方式和您的代码是一样的。我debug跟踪了流程, 主要原因不是在于转换器的问题。在spring
HttpComponentsClientHttpRequest#executeInternal 这个方法是直接new了一个httpClient的HttpEntity。我不知道是为什么没有将Content-Type的属性复制进去。所以在解析的时候使用了默认的ISO-8859-1进行解码

from wechatpay-apache-httpclient.

xy-peng avatar xy-peng commented on June 5, 2024

看了下stackoverflow上答案的代码,试试先移除原有的StringHttpMessageConverter

List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof StringHttpMessageConverter);
converters.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));

from wechatpay-apache-httpclient.

1440530275 avatar 1440530275 commented on June 5, 2024

看了下stackoverflow上答案的代码,试试先移除原有的StringHttpMessageConverter

List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof StringHttpMessageConverter);
converters.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));

依然不行, 解析出来之后, 中文依旧乱码。我暂时先直接使用HttpClient来请求是没问题的, 集成RestTemplate就会乱码。

from wechatpay-apache-httpclient.

xy-peng avatar xy-peng commented on June 5, 2024

方便把整个工程打包发到我邮箱一下?注意去掉敏感信息,比如商户私钥

from wechatpay-apache-httpclient.

1440530275 avatar 1440530275 commented on June 5, 2024

from wechatpay-apache-httpclient.

xxoyt avatar xxoyt commented on June 5, 2024

可以试试在请求之前指定编码格式,
HttpHeaders headers = request.getHeaders(); ContentType contentType = ContentType.APPLICATION_JSON.withCharset(StandardCharsets.UTF_8); headers.add("Content-Type", contentType.toString());
因为默认EntityUtils.toString(final HttpEntity entity) 里的编码会从contentType里取。可以试试还未验证

from wechatpay-apache-httpclient.

1440530275 avatar 1440530275 commented on June 5, 2024

from wechatpay-apache-httpclient.

xy-peng avatar xy-peng commented on June 5, 2024

是应答的数据出现乱码?

from wechatpay-apache-httpclient.

1440530275 avatar 1440530275 commented on June 5, 2024

是应答的数据出现乱码?

不是, 就是单纯的请求过去就出现了乱码. "description":"?????(??)-Indosat???-5KIDR??"
因为最终还是通过WechatPay2Credentials.buildMessage来进行输出解码的呀!
导致了
WeChat9a9d8614126d1ee48d4a3874a823418c

因为新版APIV3 description是必填的 所以这个问题我必须要解决,但是在我的代码中我不想去覆写这个类来进行注入, 所以我暂时还是使用原生的HttpClient配合连接池使用。 但是坏处是无法做到整体资源进行整合托管, 例如异常处理等事情。所以希望作者能够提供一个好的解决方法。谢谢啦

from wechatpay-apache-httpclient.

xy-peng avatar xy-peng commented on June 5, 2024

0.2.2,使用以下的测试代码ok。乱码应该是设置StringHttpMessageConverter可以解决的。

    RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient));
    List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
    converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof StringHttpMessageConverter);
    converters.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectMapper objectMapper = new ObjectMapper();

    ObjectNode rootNode = objectMapper.createObjectNode();
    rootNode.put("mchid","1900009191")
            .put("appid", "wxdace645e0bc2c424")
            .put("description", "Image形象店-深圳腾大-QQ公仔")
            .put("notify_url", "https://www.weixin.qq.com/wxpay/pay.php")
            .put("out_trade_no", "1217752501201407033233368018");
    rootNode.putObject("amount")
            .put("total", 1);
    rootNode.putObject("payer")
            .put("openid", "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o");

    objectMapper.writeValue(bos, rootNode);

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    org.springframework.http.HttpEntity<String> request =
            new org.springframework.http.HttpEntity<>(bos.toString(), headers);

    ResponseEntity<String> response = restTemplate.postForEntity(
            "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi", request, String.class);
    assertEquals(200, response.getStatusCode());

from wechatpay-apache-httpclient.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.