2017-11-18 09:14:59 towtotow 阅读数 1160
  • 微信公众号开发6-事件开发管理-微信开发php

    微信公众平台开发之事件开发管理是子恒老师《微信公众平台开发》视频教程的第6部。详细讲解了用php开发微信,对微信公众平台中的常见事件管理开发。内容包含微信关注事件,取消关注事件等等,其它的事件会在相应的章节中详细讲述。欢迎反馈,微信/QQ:68183131

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

在使用微信公众号过程中,

经常会与公众号的粉丝进行互动,

微信把一些重要的动作过程设置为事件,

并且能够把对应的消息发送到开发者绑定的网址上,

这样开发者就可以根据情况处理自己的业务。


众多的事件分布于整个微信开发过程,

像前面讲的菜单点击事件,

还有地理位置事件等等。


公众号事件推送


在这个系列中,

我们着重讲解关注事件和取消关注事件,

其它的事件,

我们在公众号开发中遇到时会分析…

php开发微信公众号事件推送视频教程在线观看

http://edu.csdn.net/course/play/2962/48737

2018-06-22 11:11:36 qq_36500554 阅读数 1293
  • 微信公众号开发6-事件开发管理-微信开发php

    微信公众平台开发之事件开发管理是子恒老师《微信公众平台开发》视频教程的第6部。详细讲解了用php开发微信,对微信公众平台中的常见事件管理开发。内容包含微信关注事件,取消关注事件等等,其它的事件会在相应的章节中详细讲述。欢迎反馈,微信/QQ:68183131

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

      今天整理一下微信开发中遇到的图片和附件的上传问题。

      开发环境参考:微信开发(一)--分享接口 点击打开链接

      由于是基于weixin-java-tools 封装的java sdk,所以在微信底层处理上我们可以直接调用WxMpService.

      .数据准备:

           进入页面前,根据条件查询相应的图片附件列表(已有数据时进行展示,没有数据可以忽略):

	           //查询图片数据  
		List<FileModel> imgList = fileModelService.loadFileModelsByBFTT(11);
		   //查询附件数据
		List<FileModel> attachmentFileList = fileModelService.loadFileModelsByBFTT(11);
		

      二.页面准备:    

            jspye页面设置上传按钮,遍历读取图片列表   

    <!-- 图片上传 -->   
				 <div class="form-group">
				    <div class="input-group">
				       <div class="input-group-addon "><span style="color:red;"> </span>图片上传:</div>
				       <input type="hidden" name="fileIds" id="fileIds">
				       <div class="input-group-addon">
				       	
				       				<a href="javascript:void(0)" onclick="chooseImage('${basePath }','${id}');">
						       			<span class="glyphicon glyphicon-plus"></span>
						       		</a>
				       
				       </div>
				    </div>
				  </div>
				  
				  <!-- 缩略图 -->
				  <ul class="body-img-ul">
				  		<c:forEach items="${imgList}" var="v" varStatus="sta">
				  			<li style="background-image:url('${simplePath }${v.revealpath }')" 
				  				onclick="previewImage('${simplePath }${v.revealpath }');">
				  		
					       		<i class="del_icon" onclick="deleteImage('${v.id }',this,'${basePath }')"></i>
		    	            </li>
				  		</c:forEach>
				  </ul>
				   <!-- 附件上传 --> 
				   <div class="form-group">
				    <div class="input-group">
				       <div class="input-group-addon "><span style="color:red;"> </span>附件上传:</div>
				       <div class="input-group-addon">
				       		<input type="hidden" name="attachmentIds" id="attachmentIds">
				       		
					       				<span class="glyphicon glyphicon-plus">
					       					<input type="file" class="attachmentFile" name="attachmentFile" id="attachmentFile"
						       				 onchange="uploadAttachment('${basePath }','${id}');"/>
					       				</span>
				       </div>
				    </div>
				  </div>
				  <!-- 附件 -->
				  <ul class="body-file-ul">
				  		<c:forEach items="${attachmentFileList }" var="v" varStatus="sta">
		    	            <li>
					  			<a href="${simplePath }${v.revealpath }">
					  				<c:choose>
			              		 		<c:when test="${fn:length(v.filename) < 20 }">
			              		 			${v.filename }
			              		 		</c:when>
			              		 		<c:otherwise>
			              		 			${fn:substring(v.filename,0,20) }....${v.extname }
			              		 		</c:otherwise>
			              		 	</c:choose>
					  			</a>
					
					       				<i class="del_icon" onclick="deleteImage('${v.id }',this,'${basePath }')"></i>
		    	            </li>
				  		</c:forEach>
				  </ul>
				<!-- 附件上传 -->  
				    

     三.初始化jssdk:  

          controller

@Controller
@RequestMapping("jssdk")
public class WeXinJsSdkController {
	
	@Autowired
	private WxMpService wxMpService;
	
	@RequestMapping(value = "/config", method = RequestMethod.GET)
	@ResponseBody
	public WxJsapiSignature wxJsSdkConfig(HttpServletRequest request,String url) {
		try {
			WxJsapiSignature wxJsapiSignature = wxMpService.createJsapiSignature(url);
			return wxJsapiSignature;
		} catch (WxErrorException e) {
			return null;
		}
	}
	  
}
  js请求获取config 参数 
	/* 初始化jssdk */
	$.get("${basePath}/jssdk/config.do",{url:window.location.href},function(data,status){
		if(status == "success"){
			wx.config({
			    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
			    appId: data.appId, // 必填,公众号的唯一标识
			    timestamp: data.timestamp, // 必填,生成签名的时间戳
			    nonceStr: data.nonceStr, // 必填,生成签名的随机串
			    signature: data.signature,// 必填,签名,见附录1
			    jsApiList: ['chooseImage', 'uploadImage', 'downloadImage', 'previewImage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
			 
			});
			wx.ready(function(){
				//layer.msg("jssdk初始化成功");
			    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
			    //所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
			});
			wx.error(function(res){
			    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,
			    //也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
				layer.msg(res);
			});
		}
		},"json");

  js 配置

    1. chooseImage    手机选择或拍摄图片 
    2. uploadImage    上传图片到微信服务器
    3. downloadImage  下载图片到本地

    previewImage   本地图片预览 


	
	//微信sdk上传图片------------------------
var images = {
	    localIds: [],
	    serverIds: [],
	  }; 
function chooseImage(basePath,id){
	wx.chooseImage({
	    count: 6, // 默认9
	    sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
	    sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
	    success: function (res) {
	    	images.localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
	    	//显示缩略图
	        for(var i=0;i<images.localIds.length;i++){
	        	var liLength = $(".body-img-ul li").length;
	        	if(liLength >= 6 ){
	        		layer.msg("最多允许上传6张图片!");
					return;
		        }
	        	var imgHtml = "<li style=\"background-image:url('"+images.localIds[i]+"')\"";
	        		   imgHtml += "onclick=\"previewImage('"+images.localIds[i]+"')\">";
	        		   imgHtml += "<i class=\"del_icon\"></i>";
	        		   imgHtml += "</li>";
	  				
	        	$(".body-img-ul").append(imgHtml);
		    }
		    //递归的上传图片
	        syncUpload(images.localIds,id);
	    }
	});
}
//将微信服务器的图片下载到本地
var syncUpload = function(localIds,id){
	var localId = localIds.pop();
	//上传图片到微信服务器
    wx.uploadImage({
        localId: localId, // 需要上传的图片的本地ID,由chooseImage接口获得
        isShowProgressTips: 1, // 默认为1,显示进度提示
        success: function (res) {
        	images.serverIds.push(res.serverId); // 返回图片的服务器端ID
            if(localIds.length > 0){
            	syncUpload(localIds,id);  
            }else if(images.localIds.length == 0){
            	var serverids = images.serverIds.join(',');
            	$.post(
            		basePath+"/fileupload/uploadImg.do",
            		{"serverIds":serverids,"id":id}
            		,function(data,status){
        			if(status == "success"){
        				images.serverIds = [];
        				//存储文件id到页面
        				setFileIds(data.join(','));
        				
        				var tempLen = $(".del_icon").length;
        				var dataLen = data.length;
        				var del_index;
        				var del_id;
        				for(var i = 1;i<dataLen+1;i++){
        					del_index = tempLen-i;
        					del_id = data[i-1];
        					addDeleteEvent(del_index,del_id,basePath);
        				}
        				layer.msg("上传成功!");
        			}
        	  },"json");
            }
        }
    });
 }
//添加事件
function addDeleteEvent(del_index,del_id,basePath){
	$(".del_icon").eq(del_index).click(function(e){
		deleteImage(del_id,this,basePath);
		window.event.cancelBubble = true;
	});
}
//添加上传的filemodeID
function setFileIds(fildIds){
	var temp = $("#fileIds").val();
	if(temp == ""){
		 $("#fileIds").val(fildIds)
	}else{
		$("#fileIds").val(temp+","+fildIds)
	}
}
//预览图片
function previewImage(url){
	document.write("url----"+url);
	 wx.previewImage({
         current: url, // 当前显示图片的http链接
         urls: [url] // 需要预览的图片http链接列表
	 });
}
//异步删除图片
function deleteImage(id,obj,basePath){
	$.ajax({
		  type: 'POST',
		  url: basePath+"/fileupload/deleteFile.do",
		  data:{"id":id},
		  dataType: 'json',
		  success: function(data){
			 if(data.state == 200){
				layer.msg("删除成功!");
				 //移除对应数据
				 $(obj).parent()[0].remove();
			 }else{
				 layer.msg("删除失败!");
			 }
		  }
		});
	 window.event.cancelBubble = true;
}
//微信sdk上传图片------------------------
//上传附件
function uploadAttachment(basePath,id) {
   //限制数量
	var liLength = $(".body-file-ul li").length;
	if(liLength >= 6 ){
		layer.msg("最多允许上传6份附件!");
		return;
    }
   //上传文件
   $.ajaxFileUpload({
       url: basePath+"/fileupload/uploadAttachment.do", //文件上传到哪个地址,告诉ajaxFileUpload
       data:{"bussinessId":bussinessId,"id":id},
       secureuri: false, //一般设置为false
       fileElementId: 'attachmentFile', //文件上传控件的Id  <input type="file" id="fileUpload" name="file" />
       dataType: 'json', //返回值类型 一般设置为json
       success: function (data, status){//服务器成功响应处理函数
    	   if(data.state == 200){
    		   var imgHtml = "<li>";
    		   imgHtml += "<a href=\""+basePath+data.data[2]+"\">"+data.data[1]+"</a>";
    		   imgHtml += "<i class=\"del_icon\" onclick=\"deleteImage('"+data.data[0]+"',this,'"+basePath+"')\"></i>";
    		   imgHtml += "</li>";
    		   $(".body-file-ul").append(imgHtml)
    		   //存储文件id到页面
    		   setFileIds(data.data[0]);
    	   }
		   layer.msg(data.msg);
       	}
       });
   };
	
.后台配置文件名称,设置本地存储路径,把相应数据存储到本地:  

@Controller
@RequestMapping("/fileupload")
public class FileUploadController {
	
	public String prefix ="yongjun/upload/";
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	@Autowired
	private WxMpService wxMpService;
	@Autowired
	private UsersService usersService;
	@Autowired
	private FileModelService fileModelService;
	@Value(value = "#{resourceProperties['uploadUrl']}")
	private String uploadUrl;
	
	@RequestMapping(value = "/uploadImg", method = RequestMethod.POST)
	@ResponseBody
	public String[] uploadImg(String serverIds,BigDecimal id,HttpServletRequest request){
		
		String[] result;
		//获取当前用户
		CurrentUser currentUser = usersService.getCurrentUser(request);
		try {
			String[] serverId_arr = serverIds.split(",");
			if(serverId_arr != null && currentUser != null){
				//图片存储
				List<FileModel> fileModelStorelist = new ArrayList<FileModel>();
				for (int i=0;i<serverId_arr.length;i++) {
					File file = wxMpService.getMaterialService().mediaDownload(serverId_arr[i]);
					String filePath = FileUploadUtil.uploadImg(file, uploadUrl, currentUser);
					//文件模型数据
					FileModel fileModel = new FileModel();
					fileModel.setCreatedTime(new Date());
					byte disabled = 0;
					fileModel.setDisabled(disabled);
					fileModel.setFilename(file.getName());
					fileModel.setRealname(file.getName());
					fileModel.setExtname(filePath.substring(filePath.lastIndexOf(".")+1));
					fileModel.setFilepath(filePath);
					fileModel.setRevealpath(filePath.replace("C:\\crm2009\\upload", "/myImg").replace("\\", "/"));
					fileModel.setFiletype("image");
					
					fileModelStorelist.add(fileModel);
				}
				result = fileModelService.storeFileModelList(fileModelStorelist);
				return result;
			}else{
				logger.info("当前用户不存在!!");
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.info("下载文件失败!!"+e.getClass());
			return null;
		}
		
		
	}
	@RequestMapping(value = "/uploadAttachment", method = RequestMethod.POST)
	@ResponseBody
	public ResultData uploadAttachment(BigDecimal bussinessId,BigDecimal id,HttpServletRequest request,MultipartFile attachmentFile){
		
		//判断文件类型
		String originalFilename = attachmentFile.getOriginalFilename();
		String[] imagType={".jpg",".png",".bmp",".gif"};
		List<String> imagTypeList = Arrays.asList(imagType);
		if(imagTypeList.contains(originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase())){
			return ResultData.error("无法上传图片!");
		}
		String[] result = new String[3];
		//获取当前用户
		CurrentUser currentUser = usersService.getCurrentUser(request);
		try {
			if(currentUser != null){
				//上传文件
				String filePath = FileUploadUtil.uploadFile(attachmentFile, uploadUrl, currentUser);
				//文件模型数据
				FileModel fileModel = new FileModel();
				fileModel.setCreatedTime(new Date());
				byte disabled = 0;
				fileModel.setBussinessid(bussinessId);
				fileModel.setDisabled(disabled);
				fileModel.setFilename(originalFilename);
				fileModel.setRealname(filePath.substring(filePath.lastIndexOf("/")+1));
				fileModel.setExtname(filePath.substring(filePath.lastIndexOf(".")+1));
				fileModel.setFilepath(filePath);
				fileModel.setRevealpath(filePath.replace("C:\\crm2009\\upload", "/myImg").replace("\\", "/"));
				fileModel.setFiletype("attachment");
				fileModelService.storeFileModel(fileModel);
				
				result[0] = fileModel.getId().toString();
				result[1] = fileModel.getFilename();
				result[2] = fileModel.getRevealpath();
				return ResultData.ok(result, "上传成功!");
			}else{
				logger.info("当前用户不存在!!");
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.info("下载文件失败!!"+e.getClass());
			return null;
		}
		
		
	}
	
	@RequestMapping(value = "/deleteFile", method = RequestMethod.POST)
	@ResponseBody
	public ResultData deleteFile(BigDecimal id){
		fileModelService.deleteFileModel(id);
		return ResultData.ok();
	}
	
}
.设置 文件转接工具类:

     

public class FileUploadUtil {
	/**
	 * 上传文件
	 * @param file 源文件
	 * @param uploadUrl 上传地址
	 * @param currentUser 当前用户
	 * @param fileType 
	 * @return
	 */
	public  static String uploadImg(File file,String uploadUrl,CurrentUser currentUser) {
		//处理待写入的位置
		if(currentUser != null){
			uploadUrl += "\\image\\" +currentUser.getLoginName().toString();
		}
		File uploadPosition = new File(uploadUrl);
		if(!uploadPosition.exists()){
			//文件路径不存在,则创建
			uploadPosition.mkdirs();
		}
		if (file.renameTo(new File(uploadPosition + "\\" + file.getName()))) {
            System.out.println("File is moved successful!");
        } else {
            System.out.println("File is failed to move!");
        }
		return uploadPosition + "/" + file.getName();
	}
	public  static String uploadFile(MultipartFile file,String uploadUrl,CurrentUser currentUser) throws UnsupportedEncodingException {
		//处理待写入的位置
		if(currentUser != null){
			uploadUrl += "\\attachment\\" +currentUser.getLoginName().toString();
		}
		File uploadPosition = new File(uploadUrl);
		if(!uploadPosition.exists()){
			//文件路径不存在,则创建
			uploadPosition.mkdirs();
		}
		String originalFilename = file.getOriginalFilename();
		String realName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
		try {
			file.transferTo(new File(uploadPosition + "\\" +  realName));
			System.out.println("File is moved successful!");
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
			System.out.println("File is failed to move!");
		}
		return uploadPosition + "/" + realName;
	}
} 
   学习在于不断地探索、思考和总结记录,欢迎喜欢的朋友们在下方留言,与君共同进步!







2014-12-01 14:24:01 liangyh32 阅读数 1160
  • 微信公众号开发6-事件开发管理-微信开发php

    微信公众平台开发之事件开发管理是子恒老师《微信公众平台开发》视频教程的第6部。详细讲解了用php开发微信,对微信公众平台中的常见事件管理开发。内容包含微信关注事件,取消关注事件等等,其它的事件会在相应的章节中详细讲述。欢迎反馈,微信/QQ:68183131

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

<?php
//
// 响应用户消息
// 微信公众账号响应给用户的不同消息类型
//

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
 $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);

        if($tmpStr == $signature){
            return true;
        }else{
            return false;
        }
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

            //用户发送的消息类型判断
            switch ($RX_TYPE)
            {
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
                case "image":
                    $result = $this->receiveImage($postObj);
                    break;
                case "voice":
                    $result = $this->receiveVoice($postObj);
                    break;
                case "video":
                    $result = $this->receiveVideo($postObj);
                    break;
                default:
                    $result = "unknow msg type: ".$RX_TYPE;
                    break;
            }
            echo $result;
        }else {
            echo "";
            exit;
        }
    }
   
    private function receiveText($object)
    {
        $keyword = trim($object->Content);

        if($keyword == "文本"){
            //回复文本消息
            $content = "这是个文本消息";
            $result = $this->transmitText($object, $content);
        }
        else if($keyword == "图文" || $keyword == "单图文"){
            //回复单图文消息
            $content = array();
            $content[] = array("Title"=>"单图文标题",
                                "Description"=>"单图文内容",
                                "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
                                "Url" =>"http://m.cnblogs.com/?u=txw1958");
            $result = $this->transmitNews($object, $content);
        }
        else if($keyword == "多图文"){
            //回复多图文消息
            $content = array();
            $content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
            $content[] = array("Title"=>"多图文2标题", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
            $content[] = array("Title"=>"多图文3标题", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
            $result = $this->transmitNews($object, $content);
          
        }
        else if($keyword == "音乐"){
            //回复音乐消息
            $content = array("Title"=>"最炫民族风",
            "Description"=>"歌手:凤凰传奇",
            "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3",
            "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");
            $result = $this->transmitMusic($object, $content);
        }
       
        return $result;
    }

    private function receiveImage($object)
    {
        //回复图片消息
        $content = array("MediaId"=>$object->MediaId);
        $result = $this->transmitImage($object, $content);;
        return $result;
    }

    private function receiveVoice($object)
    {
        //回复语音消息
        $content = array("MediaId"=>$object->MediaId);
        $result = $this->transmitVoice($object, $content);;
        return $result;
    }

    private function receiveVideo($object)
    {
        //回复视频消息
        $content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId, "Title"=>"", "Description"=>"");
        $result = $this->transmitVideo($object, $content);;
        return $result;
    } 
   
    /*
     * 回复文本消息
     */
    private function transmitText($object, $content)
    {
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }
   
    /*
     * 回复图片消息
     */
    private function transmitImage($object, $imageArray)
    {
        $itemTpl = "<Image>
    <MediaId><![CDATA[%s]]></MediaId>
</Image>";

        $item_str = sprintf($itemTpl, $imageArray['MediaId']);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }
   
    /*
     * 回复语音消息
     */
    private function transmitVoice($object, $voiceArray)
    {
        $itemTpl = "<Voice>
    <MediaId><![CDATA[%s]]></MediaId>
</Voice>";

        $item_str = sprintf($itemTpl, $voiceArray['MediaId']);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }
   
    /*
     * 回复视频消息
     */
    private function transmitVideo($object, $videoArray)
    {
        $itemTpl = "<Video>
    <MediaId><![CDATA[%s]]></MediaId>
    <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
</Video>";

        $item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray['ThumbMediaId'], $videoArray['Title'], $videoArray['Description']);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }
   
    /*
     * 回复图文消息
     */
    private function transmitNews($object, $arr_item)
    {
        if(!is_array($arr_item))
            return;

        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($arr_item as $item)
            $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);

        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";

        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item));
        return $result;
    }
   
    /*
     * 回复音乐消息
     */
    private function transmitMusic($object, $musicArray)
    {
        $itemTpl = "<Music>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <MusicUrl><![CDATA[%s]]></MusicUrl>
    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";

        $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }
}
?>

2017-08-17 10:04:09 zhengyikuangge 阅读数 586
  • 微信公众号开发6-事件开发管理-微信开发php

    微信公众平台开发之事件开发管理是子恒老师《微信公众平台开发》视频教程的第6部。详细讲解了用php开发微信,对微信公众平台中的常见事件管理开发。内容包含微信关注事件,取消关注事件等等,其它的事件会在相应的章节中详细讲述。欢迎反馈,微信/QQ:68183131

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

从微信开发文档中得出一个结论:在公众号上进行的任何操作,比如发送文本、图片、视频、语音消息等或者点击菜单某个按钮,微信服务器都会给绑定的URL发送一个带数据的request。

例如参考数据如下(因为我对map比较熟,所以格式已经从XML转化为map):

文本消息:
MsgId=6454514167540419126, FromUserName=xxxxxxxx, CreateTime=1502808688, Content=哈哈, ToUserName=xxxxxxxx, MsgType=text

点击带链接的菜单:
FromUserName=xxxxxxx, EventKey=http://www.baidu.com, Event=VIEW, CreateTime=1502808706, MenuId=435751363, ToUserName=xxxxx, MsgType=event

步骤总体来说有三步,如下:



1.数据格式从XML转化为map

所需jar包下载地址:
http://download.csdn.net/download/zhengyikuangge/9510313

代码如下:

/*
     * XML解析,把request参数传入,调用该方法即可
     */
    public static Map<String, String> parseXml(HttpServletRequest request)
            throws Exception {
        // 将解析结果存储在HashMap中
        Map<String, String> map = new HashMap<String, String>();
        // 从request中取得输入流
        InputStream inputStream = request.getInputStream();
        // 读取输入流
        SAXReader reader = new SAXReader();
        Document document = reader.read(inputStream);
        // document.selectSingleNode("//")
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();
        // 遍历所有子节点
        for (Element e : elementList)
            map.put(e.getName(), e.getText());
        // 释放资源
        inputStream.close();
        inputStream = null;
        System.out.println("XML获取的信息为:" + map.toString());
        return map;
    }

2. 判断是服务器接入还是推送

注意要将该过程放在绑定URL的接收范围内,即servlet的doget或dopost方法内。

if (map == null) {
    // 执行微信接入验证操作

    } else {
    // 执行消息处理操作
    doMsg(map, resp);
    // doMsg方法如下
}

3.结合获取的map判断

拿文本信息举例,代码如下

/*
     * 消息处理
     */
    public void doMsg(Map map, HttpServletResponse resp) throws IOException {

        // 根据消息的种类
        switch (map.get("MsgType").toString()) {
        // 文字信息
        case "text":
            String reText = "";
            if (map.get("Content").equals("你好")) {
                reText = "<xml><ToUserName>" + "<![CDATA["
                        + map.get("FromUserName") + "]]>"
                        +"</ToUserName>"
                        + "<FromUserName><![CDATA[" + Common.amdin_acount
                        + "]]>" + "</FromUserName>"
                        + "<CreateTime>12345678</CreateTime>"
                        + "<MsgType><![CDATA[text]]></MsgType>"
                        + "<Content><![CDATA[你好]]></Content></xml>";
            }

            resp.getWriter().print(reText);
            break;

        default:
            resp.getWriter().print("");
            break;
        }

    }

执行结果为:在公众号中输入 “你好”则公众号返回“你好”

2018-07-11 08:59:30 qq_37230094 阅读数 3901
  • 微信公众号开发6-事件开发管理-微信开发php

    微信公众平台开发之事件开发管理是子恒老师《微信公众平台开发》视频教程的第6部。详细讲解了用php开发微信,对微信公众平台中的常见事件管理开发。内容包含微信关注事件,取消关注事件等等,其它的事件会在相应的章节中详细讲述。欢迎反馈,微信/QQ:68183131

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

      昨天在微信开发平台官网下了微信开发小程序软件(.exe  64位),在自己台式机(windows 7 系统,64位)上安装可以正常打开运行,但在自己笔记本(windows 10 ,64位)上,安装以后,点击无任何反应。

       然后上网查资料,说是兼容性的问题,但改了之后还是不行...(的确是兼容性的问题,但解决办法不行!)

       本人解决办法:

        1.将原来装的(官网上下载安装的)先卸载。

        2.从360软件管家中搜索微信开发小程序,点击安装。(OK)


        感触:

        一脸懵逼...但确实解决了。

        

微信端开发配置

阅读数 125

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