2018-01-05 18:31:44 qq_24172609 阅读数 3047
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒

  最近开发微信服务号,遇到了一个问题,在编写自动回复消息的时候出现乱码,最后发现问题是由于spring mvc的@ResponseBody注解返回字符串时默认返回的是“ISO-8859-1”而不是utf-8。

  虽然大家的项目里面可能都有字符编码过滤器,但是有一个问题在这里,我们设置response.setContentType("text/html; charset=utf-8");时都是在chain.doFilter(request, response);之前设置的,也就是过滤器前处理是设置的响应编码格式,之所以不在后处理时设置是因为后处理时响应内容已经生成此时设置是无效的,必须在响应内容生成之前设置响应编码格式。

  那么问题就出在这个地方,我们虽然设置了响应编码格式,,,可是spring mvc在有@ResponseBody注解的响应是,篡改了我们的响应编码!!!!!!!!!为什么会这样。。。。。我们来剖析一下原因。
  相信大家对spring的Message Converters不会陌生,HttpMessageConverters<T>这个接口是用来把请求信息转化为对象T,把T输出为响应信息的一个接口,在该接口众多的实现类中有一个实现类StringHttpMessageConverter,这个类的作用就是把请求信息转换未字符串,而@ResponseBody注解就是默认调用的这个类,,,而这个类中默认的编码格式就是ISO-8859-1,,所以罪魁祸首找到了,怎么改呢?

我直接添加了

@RequestMapping(value = "/weixin/validation" , method = RequestMethod.POST , produces = "text/html;charset=UTF-8")
这样一个注释在控制器上,
 /**
  * 注意:
	 * "application/json" json格式数据
	 * "application/xml" xml类型数据
	 * "application/x-www-form-urlencoded" 基本类型  jquery默认就是采用的这种
	 * "multipart/form-data" 文件上传
	 * "text/xml"  和application/xml采用的默认编码格式不一样
	 * "text/html"  一般的html
	 */
主要就是
produces = "text/html;charset=UTF-8"
这个配置当然还有很多别的方式,网上也有很多,我没有都尝试,这里把一些链接留下:

Spring MVC @ResponseBody响应中文乱码

Spring MVC @ResponseBody注解返回响应流时中文乱码问题的解决




2016-01-13 11:12:49 NingRanZuoZuo 阅读数 3377
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒

上一篇文章微信开发-java篇中简单的介绍了微信开发入门,里面引用的文章中,使用XML解析是用dom4j来解析的,但回复微信消息的时候,采用的组包方式是直接字符串拼接的方法,这种方法虽然直观,但不方便拓展。

我们也可以用另外的方式,使用XStrem库,进行消息组包。

XStream是一个序列化对象为XML或XML转换为对象的库

关于XStream的教程,大家可以阅读下易百教程XStream教程,里面介绍的比较详细,其中需要特别注意的是,XStream的注解方法,因为微信消息中的报文,我们可能使用不同的class,但xml的字段是一样的,这里就要使用Xtream的alias方法,比如:

    xstream.alias("xml", yourMessage.getClass());  
    xstream.alias("item", youeMessageItem.getClass());

然后调用toXML方法,将你消息的类转换为xml格式的字符串。


XStream在实例化的时候,要传入XML解析器,来作为解析的依据,如:

    XStream xstream = new XStream(new StaxDriver());
    XStream xstream = new XStream(new XppDriver());
    XStream xstream = new XStream(new DomDriver());

大家可以通过XML解析方式对比(含XPP3解析)来了解下各种XML解析方式,我采用的是XppDriver。

private static XStream xstream = new XStream(new XppDriver() {  
    public HierarchicalStreamWriter createWriter(Writer out) {  
        return new PrettyPrintWriter(out) {
            @SuppressWarnings("unchecked")  
            public void startNode(String name, Class clazz) {  
                super.startNode(name, clazz);  
            }  
  
            protected void writeText(QuickWriter writer, String text) { 
                writer.write("<![CDATA[");  
                writer.write(text);  
                writer.write("]]>");  
            }  
        };  
    }  
});

2018-12-11 11:51:36 baidu_24707273 阅读数 2317
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒

开发微信公众号时,回复微信消息有的会有换行符。我遇到过两种情况。

一、直接回复字符串,处理换行符只需要把字符串使用双引号包含即可,这种方法基本上都会,没有什么难度

二、从数据库读取带有换行符的文本

       这时,换行符会被当成字符串,而不是特殊字符。这样的话,微信回复的也是文本。是不会出现换行的。我的处理方法是使用字符串替换函数,将换行符字符替换成换行符。

str_replace(['\r\n','\n'],"\r\n",$txt);

注意:第二个参数一定要使用双引号包含

2018-08-12 20:11:57 i042416 阅读数 4079
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒

这个系列的第二篇教程,介绍的实际是被动方式给微信用户发文本消息,即微信用户关注您的公众号时,微信平台将这个关注事件通过一个HTTP post发送到您的微信消息服务器上。您对这个post请求做了应答(格式为文本),则该应答会通过微信平台投递到您粉丝的微信应用上。

微信开发者中心的文档将这种行为称为“被动回复用户消息”:

回复消息报文的格式在开发者文档里也有清晰的定义,是一个xml格式的字符串。我的第二篇教程里也有具体的发送该报文的代码示例。

本文作为这个开发系列的第三篇教程,介绍的是如何用API的方式,主动向某个粉丝发送文本消息。

如何找到合适的微信消息发送API呢?还是登录微信开发者中心,在控制台菜单“客服消息”里,

客服接口-发消息就是我们需要使用的API。url如下:https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=<传入您的access token>

为了使用这个API,我们首先需要获得调用API的access token:

Access token的获取很简单,用Appid和secret去换。

调用另一个API,https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=<您微信公众号的appid>&secret=<您微信公众号的secret>。这个API会返回access token以及过期时间。

您微信公众号的appid和secret可以在微信开发者中心的控制台里找到,在“测试号管理”页面的标签页下。

现在我们拿到access token后,就可以调用微信文本消息发送API给指定微信用户发送文本消息了。看我下图这个postman里的调用。红色高亮的测试文本信息将通过微信API发送到我手机上:

测试成功了:

最后,我们用nodejs实现通过API给指定用户发送文本信息。

function sendWCMeaasge(toUser,sMessage){
    var options = {
    url:"https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" +
    config.accessToken,
    method: "POST",
    json:true,
    headers: {
    "content-type": "application/json"},
    body:{
    "touser":toUser,
    "msgtype":"text",
    "text": {
    "content":sMessage
    }
    }
    };
    request(options,function(error,response,data){
    }
    );
}
module.exports = sendWCMeaasge;

消费代码:

sendMessage(<此处传入接收该消息的微信用户的openid>, “这条消息是用nodejs发送的!”);

用node命名执行上面的代码,也能成功在微信app上接收到通过nodejs代码调用微信消息API的方式发送的文本消息。

要获取更多Jerry的原创技术文章,请关注公众号”汪子熙”或者扫描下面二维码:

2015-08-09 10:57:26 javadeaihaozhe 阅读数 536
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27840 人正在学习 去看看 秦子恒
不加任何格式,直接回复空字符串即可,不需要xml格式
没有更多推荐了,返回首页