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

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

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

  最近开发微信服务号,遇到了一个问题,在编写自动回复消息的时候出现乱码,最后发现问题是由于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注解返回响应流时中文乱码问题的解决




2015-10-10 15:24:51 u010592604 阅读数 2929
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

这里接上一篇:服务器配置

既然我们选用了开发者中心,那微信公众平台的自动回复就不得行了,那就自己开发吧。

这就要在服务器配置的URL里面处理了。


一、自动回复处理代码

@RequestMapping(value="/api",method=RequestMethod.POST)
	public void initPostAPI(HttpServletRequest request, HttpServletResponse response)
	{
		String Event = "";
		String MsgType = "";
		String Content = "";
		String strJson = new String();
		 // 将请求、响应的编码均设置为UTF-8(防止中文乱码)  
       try {
			request.setCharacterEncoding("UTF-8");
			response.setCharacterEncoding("UTF-8");  
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
// 调用核心业务类接收消息、处理消息
       User user = new User();

        String respMessage = "";//反馈信息
        Map<String, String> map = new HashMap<String, String>();  
        try {
			map = parseXml(request);
	} catch (Exception e) {
		e.printStackTrace();
	}
        
        Event = map.get("Event");
        MsgType = map.get("MsgType");
        Content = map.get("Content");
        
        System.out.println("Content = " + Content);
        System.out.println("MsgType = " + MsgType);
        System.out.println("Event = " + Event);
        System.out.println("EventKey = " + map.get("EventKey"));
        if(Event == null){//Event为null 则为用户输入信息被动回复
        	//自动回复用户信息
        	if(MsgType.equals("text")){
        		strJson = sendMess(map,strJson, Content);
        	}
       }
            SendUserMess.sendMess(strJson);
	}


二、这是回复信息内容的处理(文本信息,图文信息)

public String sendMess(Map map,String strJson,String Content){
		
		//根据用户输入的关键字查询对应响应
		AutoReply autoReply = new AutoReply();
		autoReply.setKeyName(Content);
		List<AutoReply> list = this.replyService.findByKeyname(autoReply);
		System.out.println("list size = "+list.size());
		
		//向用户回复消息
		if(list.size() != 0){
			autoReply = list.get(0);
			System.out.println("KeyValue-----"+autoReply.getKeyValue()+"--");
			
			if(!autoReply.getKeyValue().equals("")){
				strJson = "{\"touser\" :\""+map.get("FromUserName")+"\",";
		        strJson += "\"msgtype\":\"text\",";
		        strJson += "\"text\":{";
		        strJson += "\"content\":\""+autoReply.getKeyValue()+"\"";
		        strJson += "}}";
			}else if(!autoReply.getGraphic().equals("")){
				String newsinfo = "";
				String[] strs = autoReply.getGraphic().split(",");
				strJson = "{\"touser\" :\""+map.get("FromUserName")+"\",";
		        strJson += "\"msgtype\":\"news\",";
		        strJson += "\"news\":";
				String news = "{\"articles\": [";
				System.out.println(news);
				
				for(String str:strs){
					Graphic graphic = graphicService.loadByPK(Integer.valueOf(str));
					String url = graphic.getPicurl();
					//url = saveUrl + url.substring(24);
					
					newsinfo += "{\"title\":\""+graphic.getTitle()+"\"," +
										"\"description\":\""+graphic.getDescription()+"\",\"url\":\""+graphic.getUrl()+"\"," +
										"\"picurl\":\""+url+"\""+
										"},";
				}
				
				news = news + newsinfo.substring(0, (newsinfo.length()-1));
				news = news + "]}";
				strJson += news;
				strJson += "}";
				System.out.println("news-------"+news);
			}
		}else{//如果在数据库中找不到对应回复用户的信息则回复默认消息
			autoReply.setKeyName("未知");
			List<AutoReply> list_ = this.replyService.findByKeyname(autoReply);
			autoReply = list_.get(0);
			
			/*StringBuffer content = new StringBuffer();
			content.append("感谢您!").append("\n");
			content.append("再次感谢您").append("\n");
			content.append("再次再次感谢您");*/
			//拼装需要发送的消息
			strJson = "{\"touser\" :\""+map.get("FromUserName")+"\",";
	        strJson += "\"msgtype\":\"text\",";
	        strJson += "\"text\":{";
	        strJson += "\"content\":\""+autoReply.getKeyValue()+"\"";
	        strJson += "}}";
		}
		return strJson;
	}

三、核心代码 SendUserMess

public class SendUserMess {
	public static void sendMess(String jsonParam){
		String openIdUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";

		String result = null;
		result = String.format(openIdUrl, urlEnodeUTF8(Const.AppId),
				urlEnodeUTF8(Const.AppSecrect));

		try {
			System.out.println("Staring");
			// 创建HttpClient实例
			DefaultHttpClient  httpClient = new DefaultHttpClient ();
			// 创建Get方法实例
			HttpGet method = new HttpGet(result);
			HttpResponse re = httpClient.execute(method);
			String resData = EntityUtils.toString(re.getEntity());
			method.releaseConnection();
			System.out.println("get weixinnumber ..." + resData);
			JSONObject obj = JSONObject.fromObject(resData);
			if (obj != null) {
				String token = obj.getString("access_token");
				System.out.println("token = " + token);
                //获取ticket
				String sendMessUrl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s";
				result = String.format(sendMessUrl, token);
				
				httpClient = new DefaultHttpClient();
				
				/*JSONObject jsonParam = new JSONObject();
				jsonParam.put("touser", ""+openId+"");
				jsonParam.put("msgtype", "text");
				jsonParam.put("text", "{'content': '"+respMessage+"'}");*/
				
				System.out.println(jsonParam);
				
				StringEntity entity = new StringEntity(jsonParam,"utf-8");//解决中文乱码问题    
                entity.setContentEncoding("UTF-8");    
                entity.setContentType("application/json");    
				
				// 创建Get方法实例
				HttpPost me = new HttpPost(result);
				me.setEntity(entity);
				HttpResponse hr = httpClient.execute(me);
				String data = EntityUtils.toString(hr.getEntity());
				me.releaseConnection();

				JSONObject userInfo = JSONObject.fromObject(data);
				System.out.println("get backMessage ..." + data);
				
			}
		} catch (Exception ex) {
			System.out.println("error");
			System.out.println(ex.getMessage());
		}
	}
	
	private static String urlEnodeUTF8(String str){
        String result = str;
        try {
            result = URLEncoder.encode(str,"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


这里我用的不是自动回复的哪个接口, 而是用的“发送客服消息”的接口,一样可以达到效果。也可以试下哪个自动回复的接口,反正大体都一样

2018-04-18 17:04:04 qq_41257152 阅读数 133
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

众所周知,微信有一个特别重要的一个功能就是自动回复,就是用户访问订阅号并发送消息,订阅号会根据用户输入字符回复用户,我写了自动回复文字,图片和图文。

每一个自动回复都是一个网页,分别是

<extend name="Common:base" />
<block name="body">
<h2>回复文本</h2>
<form class="layui-form" action="" style="padding-right: 10px;" method="post">
    <div class="layui-form-item">
        <label class="layui-form-label">回复关键词</label>
        <div class="layui-input-block">
            <input type="text" name="keyword" required  lay-verify="required"   placeholder="请输入关键词" autocomplete="off" class="layui-input">
        </div>
    </div>
   
    <div class="layui-form-item">
        <label class="layui-form-label">回复内容</label>
        <div class="layui-input-block">
            <textarea name="content" required  lay-verify="required" placeholder="请输入内容" class="layui-textarea"></textarea>
        </div>
    </div>
    
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="SBT">提交</button>
            <a href="{:U('keywords',['type'=>'text'])}" class="layui-btn layui-btn-primary">返回</a>
        </div>
    </div>
</form>

<script>
  
layui.use('form', function(){
    var form = layui.form
    form.on('submit(SBT)', function(data){
        var load = layer.load();
        $.post("{:U('replytext')}",data.field,function (res) {
           
            layer.close(load);
            layer.msg(res.msg,{time:1000},function () {
                // window.location.href=res.url;
            });
          
        })
        return false;
    });

});

</script>
</block>
<extend name="Common:base" />
<block name="css">
 <style type="text/css">
    .meterial{
        position: relative;
        width: 120px;
        height: 120px;
        padding: 10px;
        float: left;
    }
    .meterial img{
        width: 100%;
        height: 100%;
    }
    .select{

        text-align: center;
        vertical-align: middle;
         opacity: 0.5;  
        color: #0f0;  
        background: rgba(0,0,0,0.8);
    
    }
  </style>
</block>

<block name="body">
<h2>回复图片</h2>
<form class="layui-form" action="" style="padding-right: 10px;" method="post">
    <div class="layui-form-item">
        <label class="layui-form-label">关键词</label>
        <div class="layui-input-block">
            <input type="text" name="keyword" required  lay-verify="required"   placeholder="请输入关键词" autocomplete="off" class="layui-input">
        </div>
    </div>
   <div class="layui-form-item">
        <label class="layui-form-label">回复图片</label>
        <div class="layui-input-block">
            <input type="hidden" id="media_id" name="media_id">
            <input type="hidden" id="url" name="url">
            <img src="" id="img_logo" width="100" height="100" />
            <button type="button" class="layui-btn" id="btn_upload">
              <i class="layui-icon"></i>选择本地图片
            </button>
           <!--  <button type="button" class="layui-btn" id="btn_select">
              <i class="layui-icon"></i>选择素材库中图片
            </button> -->
        </div>
   </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="SBT">提交</button>
            <a href="{:U('keywords',['type'=>'image'])}" class="layui-btn layui-btn-primary">返回</a>
        </div>
    </div>
</form>

<script>
   
layui.use('form', function(){
    var form = layui.form
    form.on('submit(SBT)', function(data){
        var load = layer.load();
        $.post("{:U('replyimage')}",data.field,function (res) {
            // if(res.status=='0'){
                layer.close(load);
                layer.msg(res.msg);
            // }
            // if(res.status=='1'){
            //     layer.close(load);
            //     layer.msg(res.msg,{time:1000},function () {
            //         window.location.href=res.url;
            //     });
            // }
        })
        return false;
    });

});

//图片上传
layui.use('upload', function(){
  var upload = layui.upload;
   
  //执行实例
  var uploadInst = upload.render({
    elem: '#btn_upload', //绑定元素
    accept: 'images', //允许上传的文件类型
    url: "{:U('upload')}", //上传接口
    done: function(res){
      //上传完毕回调
      if(res.code=='0'){
        var url ="__ROOT__" + res.url;
        console.log(url);
        $("#img_logo").attr("src",url);
        $("#url").val(res.url);
      }else{
         layer.msg(res.msg);
      }

    },
    error: function(){
      //请求异常回调
    }
  });
});


$("#btn_select").click(function(){
    layui.use('layer', function(){
      var layer = layui.layer;
      
      layer.open({
          type: 2,
          title: '永久素材',
          shadeClose: true,
          shade: 0.5,
          area: ['680px', '300px'],
          content: '{:U('common/selectImage')}',
          btn:['确定','取消'],
          yes: function(index, layero){
            var body = layer.getChildFrame('body', index);
            // console.log(body.html());
            var img = body.find('.select').siblings('img');
            $("#img_logo").attr('src',img.attr('src'));
            $("#media_id").val(img.attr('media-id'));
            $("#url").val(img.attr('url'));
            layer.close(index); 
          }

        });
    }); 
})
</script>
</block><extend name="Common:base" />
<block name="css">
 <style type="text/css">
    .meterial{
        position: relative;
        width: 120px;
        height: 120px;
        padding: 10px;
        float: left;
    }
    .meterial img{
        width: 100%;
        height: 100%;
    }
    .select{

        text-align: center;
        vertical-align: middle;
         opacity: 0.5;  
        color: #0f0;  
        background: rgba(0,0,0,0.8);
    
    }
  </style>
</block>

<block name="body">
<h2>回复图片</h2>
<form class="layui-form" action="" style="padding-right: 10px;" method="post">
    <div class="layui-form-item">
        <label class="layui-form-label">关键词</label>
        <div class="layui-input-block">
            <input type="text" name="keyword" required  lay-verify="required"   placeholder="请输入关键词" autocomplete="off" class="layui-input">
        </div>
    </div>
   <div class="layui-form-item">
        <label class="layui-form-label">回复图片</label>
        <div class="layui-input-block">
            <input type="hidden" id="media_id" name="media_id">
            <input type="hidden" id="url" name="url">
            <img src="" id="img_logo" width="100" height="100" />
            <button type="button" class="layui-btn" id="btn_upload">
              <i class="layui-icon"></i>选择本地图片
            </button>
           <!--  <button type="button" class="layui-btn" id="btn_select">
              <i class="layui-icon"></i>选择素材库中图片
            </button> -->
        </div>
   </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="SBT">提交</button>
            <a href="{:U('keywords',['type'=>'image'])}" class="layui-btn layui-btn-primary">返回</a>
        </div>
    </div>
</form>

<script>
   
layui.use('form', function(){
    var form = layui.form
    form.on('submit(SBT)', function(data){
        var load = layer.load();
        $.post("{:U('replyimage')}",data.field,function (res) {
            // if(res.status=='0'){
                layer.close(load);
                layer.msg(res.msg);
            // }
            // if(res.status=='1'){
            //     layer.close(load);
            //     layer.msg(res.msg,{time:1000},function () {
            //         window.location.href=res.url;
            //     });
            // }
        })
        return false;
    });

});

//图片上传
layui.use('upload', function(){
  var upload = layui.upload;
   
  //执行实例
  var uploadInst = upload.render({
    elem: '#btn_upload', //绑定元素
    accept: 'images', //允许上传的文件类型
    url: "{:U('upload')}", //上传接口
    done: function(res){
      //上传完毕回调
      if(res.code=='0'){
        var url ="__ROOT__" + res.url;
        console.log(url);
        $("#img_logo").attr("src",url);
        $("#url").val(res.url);
      }else{
         layer.msg(res.msg);
      }

    },
    error: function(){
      //请求异常回调
    }
  });
});


$("#btn_select").click(function(){
    layui.use('layer', function(){
      var layer = layui.layer;
      
      layer.open({
          type: 2,
          title: '永久素材',
          shadeClose: true,
          shade: 0.5,
          area: ['680px', '300px'],
          content: '{:U('common/selectImage')}',
          btn:['确定','取消'],
          yes: function(index, layero){
            var body = layer.getChildFrame('body', index);
            // console.log(body.html());
            var img = body.find('.select').siblings('img');
            $("#img_logo").attr('src',img.attr('src'));
            $("#media_id").val(img.attr('media-id'));
            $("#url").val(img.attr('url'));
            layer.close(index); 
          }

        });
    }); 
})
</script>
</block>

<extend name="Common:base" />
<block name="body">
<h2>回复图文</h2>
<form class="layui-form" action="" style="padding-right: 10px;" method="post">
    <div class="layui-form-item">
        <label class="layui-form-label">回复关键词</label>
        <div class="layui-input-block">
            <input type="text" name="keyword"    placeholder="请输入关键词" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">标题</label>
        <div class="layui-input-block">
            <input type="text" name="title" placeholder="请输入标题" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">封面图</label>
        <div class="layui-input-block">
            <input type="hidden" id="media_id" name="media_id">
            <input type="hidden" id="url" name="url">
            <img src="" id="img_logo" width="100" height="100" />
           <button type="button" class="layui-btn" id="btn_upload">
              <i class="layui-icon"></i>选择本地图片
            </button>
           <!--  <button type="button" class="layui-btn" id="btn_select">
              <i class="layui-icon"></i>选择素材库中图片
            </button> -->
        </div>
    </div>
    <div class="layui-form-item layui-form-text">
        <label class="layui-form-label">内容</label>
        <div class="layui-input-block">
            <textarea name="content" placeholder="请输入图文内容" class="layui-textarea"></textarea>
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">原文地址</label>
        <div class="layui-input-block">
            <input type="text" name="content_source_url"  placeholder="请输入原文地址如:http://xxxx.com/……" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="SBT">提交</button>
            <a href="{:U('keywords',['type'=>'news'])}" class="layui-btn layui-btn-primary">返回</a>
        </div>
    </div>
</form>

<script>
 
layui.use('form', function(){
    var form = layui.form
    form.on('submit(SBT)', function(data){
        var load = layer.load();
        $.post("{:U('replynews')}",data.field,function (res) {
            // if(res.status=='0'){
                layer.close(load);
                layer.msg(res.msg);
            // }
            // if(res.status=='1'){
            //     layer.close(load);
            //     layer.msg(res.msg,{time:1000},function () {
            //         window.location.href=res.url;
            //     });
            // }
        })
        return false;
    });

});

//图片上传
layui.use('upload', function(){
  var upload = layui.upload;
   
  //执行实例
  var uploadInst = upload.render({
    elem: '#btn_upload', //绑定元素
    accept: 'images', //允许上传的文件类型
    url: "{:U('upload')}", //上传接口
    done: function(res){
      //上传完毕回调
      if(res.code=='0'){
        var url ="__ROOT__" + res.url;
        console.log(url);
        $("#img_logo").attr("src",url);
        $("#url").val(res.url);
      }else{
         layer.msg(res.msg);
      }

    },
    error: function(){
      //请求异常回调
    }
  });
});

$("#btn_select").click(function(){
    layui.use('layer', function(){
      var layer = layui.layer;
      
      layer.open({
          type: 2,
          title: '永久素材',
          shadeClose: true,
          shade: 0.5,
          area: ['680px', '300px'],
          content: '{:U('common/selectImage')}',
          btn:['确定','取消'],
          yes: function(index, layero){
            var body = layer.getChildFrame('body', index);
            // console.log(body.html());
            var img = body.find('.select').siblings('img');
            $("#img_logo").attr('src',img.attr('src'));
            $("#media_id").val(img.attr('media-id'));
            $("#url").val(img.attr('url'));
            layer.close(index); 
          }

        });
    }); 
})

</script>
</block>

而且注意的是上面的3个网页对应的是3个数据表,注意的是回复图片,是用media_id来返回图片,而回复图文是要的返回的url

<?php
namespace Home\Controller;



use Think\Controller;
use LaneWeChat\Core\Curl;



class AutoreplyController extends Controller {
	private $mp;
	public function _initialize(){
		$mp=getCurrentMp();
		if(empty($mp)){
			$this->error('无使用公众号',U('index'));
		}else{
			$this->mp=$mp;
		}
	}
	public function replytext(){
		if(IS_GET){
			$this->display();
		}else{
			$content=I('post.content');
			$keyword=I('post.keyword');
			$model=M('mp_reply_text');
			$data['content'] = $content;
			$reply_id=$model->add($data);
			if(isset($reply_id)){
				$mp=$this->mp;
				$data['mp_id']=$mp['id'];
				$data['type']='text';
				$data['keyword']=$keyword;
				$data['reply_id']=$reply_id;
				M('mp_rule')->add($data);
				$this->ajaxReturn(array('msg'=>'添加成功'));
			}else{
				$this->ajaxReturn(array('msg'=>'添加失败'));
			}


		}

	}
	public function replyimage(){
		if(IS_GET){
			$this->display();
		}else{
		$url=I('post.url');//图片在本地服务器上的路径
		//相对路径转换成绝对路径
		$file=realpath('.'.$url);
		// echo $file;
		// exit;	
		$access_token=getAccess_token();
		include APP_PATH.'LaneWeChat/lanewechat.php';		
			//永久素材
		$url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";		
		$data['media']=Curl::addFile($file);		
		$ret=Curl::callWebServer($url,$data,'post',true,false);
		if(isset($ret['media_id'])){
			$mp=getCurrentMp();
			$data['url']=$ret['url'];
			$data['media_id']=$ret['media_id'];
			$reply_id=M('mp_reply_image')->add($data);
			$keyword=I('post.keyword');
			if(isset($reply_id)){				
				$data['mp_id']=$mp['id'];
				$data['type']='image';
				$data['keyword']=$keyword;
				$data['reply_id']=$reply_id;
				if($mp['is_use']==1){
					$data['status']=1;
				}else{
					$data['status']=0;
				}
				M('mp_rule')->add($data);
				$this->ajaxReturn(array('msg'=>'添加成功'));
			}else{
				$this->ajaxReturn(array('msg'=>'添加失败'));
			}
		}else{
			$this->ajaxReturn(array('msg'=>'添加失败'));
		}
		// $this->ajaxReturn($ret);
		}
	}
	public function replynews(){
		if(IS_GET){
			$this->display();
		}else{
		$keyword=I('post.keyword');
		$title=I('post.title');
		$description=I('post.content');
		$link=I('post.content_source_url');
		$url=I('post.url');//图片在本地服务器上的路径
		//相对路径转换成绝对路径
		$file=realpath('.'.$url);
		// echo $file;
		// exit;	
		$access_token=getAccess_token();
		include APP_PATH.'LaneWeChat/lanewechat.php';		
			//永久素材
		$url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";		
		$data['media']=Curl::addFile($file);		
		$ret=Curl::callWebServer($url,$data,'post',true,false);
		if(isset($ret['media_id'])){
			$mp=getCurrentMp();
			$data['title']=$title;
			$data['description']=$description;
			$data['picurl']=$ret['url'];
			$data['url']=$link;
			$reply_id=M('mp_reply_news')->add($data);
			if(isset($reply_id)){				
				$data['mp_id']=$mp['id'];
				$data['type']='news';
				$data['keyword']=$keyword;
				$data['reply_id']=$reply_id;
				if($mp['is_use']==1){
					$data['status']=1;
				}else{
					$data['status']=0;
				}
				M('mp_rule')->add($data);
				$this->ajaxReturn(array('msg'=>'添加成功'));
			}else{
				$this->ajaxReturn(array('msg'=>'添加失败'));
			}
		}else{
			$this->ajaxReturn(array('msg'=>'添加失败'));
		}
		
		}
		
	}
	 public function upload(){



		$upload = new \Think\Upload();// 实例化上传类



		$upload->maxSize = 3145728 ;// 设置附件上传大小



		$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型



		$upload->rootPath = './Uploads/'; // 设置附件上传根目录



		$upload->savePath = ''; // 设置附件上传(子)目录



		// 上传文件



		$info = $upload->uploadOne($_FILES['file']);



		if(!$info) {// 上传错误提示错误信息



			// $this->error($upload->getError());



			$this->ajaxReturn(array('code'=>1,'msg'=>$upload->getError()));



		}else{// 上传成功



			// $this->success('上传成功!');



			$file = '/Uploads/' . $info['savepath'] . $info['savename'];



			$this->ajaxReturn(array('code'=>0,'msg'=>'上传成功','url'=>$file));



		}



	}
}


2018-04-26 17:16:04 ssh456 阅读数 295
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

//回复图文
	public function addNews(){
		$mp=$this->mp;
		$keyword=I('post.keyword');
		$title=I('post.title');
		$description=I('post.content');
		$url=I('post.url');
		//相对路径->绝对路径
		$file=realpath('.'.$url);
		$link=I('post.content_source_url');

		$accessToken=getAccess_token();
		include APP_PATH . 'LaneWeChat/lanewechat.php';
		//上传永久图片api
		$api="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$accessToken&type=image";
		$data['media']='@' . $file;
		$ret=Curl::callWebServer($api,$data,'post',true,false);
		    if (isset($ret['url'])) {
				$mp=$this->mp;
				$arr['title']=$title;
				$arr['url']=$link;
				$arr['picurl']=$ret['url'];
				$arr['description']=$description;
				$ret=M('mp_reply_news')->add($arr);
				if($ret){
					$data['mpid']=$mp['id'];
			        $data['reply_id']=$ret;
			        $data['type']='news';
			     	$data['keyword']=$keyword;
			        $rule=M('mp_rule');
			     	$ret=$rule->add($data);
				}
			    if ($ret) {
	     	    	$this->ajaxReturn(array('status'=>0,'msg'=>"添加成功!"));
		     	} else {
		     	    $this->ajaxReturn(array('msg'=>$ret));
	     	    }

	    }else{
			$ret['fail']='本地上传失败';
          $this->ajaxReturn(array('status'=>1,'msg'=>$ret));
          exit;
		}
	}

2017-08-05 16:05:43 LJFPHP 阅读数 6042
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

最近开始做公司的微信项目,深切的感受到了微信的不同,做微信是需要从头开始好好学的,在此记录一下学习微信的过程,也希望以后能根据这些文章迅速掌握微信开发的知识。少踩坑,,(laravel框架)

1、首先需要进入微信公众号--》基本配置--》填上你的服务器信息--》验证TOKEN,获取appId和appkey

2、下载官方的SDK文件,参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

demo下载地址:http://www.cnblogs.com/txw1958/p/tutorials-of-wechat-public-platform.html       方倍工作室 的。

3、首先需要明确(1)验证token通过,证明你的服务器可以和微信进行交互

(2)进入微信页面,发送消息,此时,后台应接受消息,并判断消息类型

(3)根据消息类型,拼接不同的xml数据,返回给模板

(4)然后就实现了微信上自动回复的功能了。

4、


以上为验证token之后,在控制器设置的微信入口文件:这个文件也就是demo中的reponseMsg()方法:

主要用于获得微信发送过来的数据,然后再把tousername,fromusername等信息放到一起,提取用户发送消息的类型$event,并且请求下一个方法:

5、

这个方法主要是为了判断请求的类型,根据不同的类型会有不同的处理方法。在此只处理text类型的数据,并且调用text方法,获取拼接的数据。最后返回给响应方法handle_response()方法。

6、

在这里,我们把回复的内容都给写死了,大家到时候也完全可以从数据库读出这些数据。里面就是简单的拼接了一些图文信息,然后把这些信息返回。数组$arr是方便在模板上输出图文消息。

7、

该控制器主要是根据传过来的event不同,判断该调用哪个模板,该回复什么样的消息等。如果$event==text,则调用默认的模板:$xml = view(wechat.tpl_reply_text) ;如果$event为news,则需要返回图文消息,我们把数据都放到数组里面,在模板上输出即可。

8、

<xml>
  <ToUserName><![CDATA[{{$ToUserName}}]]></ToUserName>
  <FromUserName><![CDATA[{{$FromUserName}}]]></FromUserName>
  <CreateTime>{{$CreateTime}}</CreateTime>
  <MsgType><![CDATA[news]]></MsgType>
  <ArticleCount>{{$ArticleCount}}</ArticleCount>
  <Articles>
@foreach ($news  as $k => $v)
  <item>
  <Title><![CDATA[{{$v['Title']}}]]></Title>
  <Description><![CDATA[{{$v['Description']}}]]></Description>
  <PicUrl><![CDATA[{{$v['PicUrl']}}]]></PicUrl>
  <Url><![CDATA[{{$v['Url']}}]]></Url>
  </item>
@endforeach
  </Articles>
</xml>

这就是模板部分:直接输出即可。

9、在此已经是完成了微信的自动回复功能。用户输入指定的内容的时候,,我们也回复指定的内容回去。

微信官方的给的demo被拆分了,没有按照官方上那种返回xml数据,而是采用了laravel的模板来输出。


10、总结:虽然整体来说不够简洁,但也算是实现了功能,在此做个记录。以后水平高了再完善完善。

没有更多推荐了,返回首页