使用java语言实现微信开发,与web服务器交互,实现了web显示,微信输入信息,网络上现在给出的官方demo都是php版本的,现在我采用了java进行了实现。
工具/原料
笔记本,手机,myeclipse
方法/步骤
1、先你得建立一个微信公众号,这个可以去微信公众平台注册,因为我只是进行学习加测试,我最后申请的是订阅号,而不是面向企业应用的服务号,所以这是做微信开发最基本的一部。登录微信公众平台进行注册,注册界面如图:
2、现在我已经挂入了公网,你可以查找建立的公众号来关注信息,进而发送消息。但是你的电脑关机的话,公网就结束,你发送的消息也就无法返回相应结果了(因为电脑是服务器)。微信图形界面大题如下:
3、需要的解决一个特别大的问题,那就是公网问题以及微信端口只支持80端口问题,如果只是用简单的花生壳去映射的话,这个端口问题还是很难解决的,现在来解决这个问题。方式一:使用软件ngrok去映射。下面是我映射后的截图相当于我把本地地址localhost映射映射到公网地址上了。
4、方式二:当然你也可以不使用这种映射,你可以考虑一下让别人代理你的应用程序,比如百度云BAE,新浪云SAE,阿里云,其中百度云,阿里云收费,新浪云有一段时间免费,我测试的新浪云SAE,测试成功了,如果不想使用ngrok,嫌这个麻烦,你也可以考虑新浪云代理你的应用。
5、除了上面的挥响裢鲮东西的话,那就是微信端的代码了,代码我用的myeclipse工具,写的是java代码,不是c++,python,注意微信的开发可以采用pytho荏鱿胫协n,java,php进行,官网提供的是php案例的哦。现在是我调通的之前用的测试代码,足够调通基本功能。已经足够了解微信开发,后面无非就是数据库的添加,以及几个jsp界面的问题,再找美工调一调,绝对会很好的。下面提供微信开发之后的管理平台如图:
6、服务器端核心代码服务类CoreService的源代码pack瞢铍库祢agecom.cashion.cour霜杼厮贿se.service;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.servlet.http.HttpServletRequest;importcom.cashion.course.message.resp.TextMessage;importcom.cashion.course.util.MessageUtil;publicclassCoreService{ /** *处理微信发来的请求 * *@paramrequest *@return */ privatestaticbooleanflag=false; publicstaticMap<String,Boolean>flagMap=newHashMap<String,Boolean>(); publicstaticStringprocessRequest(HttpServletRequestrequest){ StringrespMessage=null; try{ //默认返回的文本消息内容 StringrespContent="请求处理异常,请稍候尝试!"; //xml请求解析 Map<String,String>requestMap=MessageUtil.parseXml(request); //发送方帐号(open_id) StringfromUserName=requestMap.get("FromUserName"); //公众帐号 StringtoUserName=requestMap.get("ToUserName"); //消息类型 StringmsgType=requestMap.get("MsgType"); //消息内容 Stringcontent=requestMap.get("Content"); System.out.println(fromUserName+""+toUserName+""+msgType); //回复文本消息 TextMessagetextMessage=newTextMessage(); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime(newDate().getTime()); textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); textMessage.setFuncFlag(0); //文本消息 //List<String>list=MessageUtil.usersList; //Map<String,Boolean>flagMap=MessageUtil.flagMap; if(flagMap.containsKey(fromUserName)){//如果存在这个用户, System.out.println("系统存在了这个微信用户"); if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){ //if(flag) // respContent="你发送的消息已上墙"; if(content.equals("上墙")){ flag=true; flagMap.put(fromUserName,flag); respContent="上墙成功,你可以发送消息了"; }else{ //respContent="消息可以上弹幕"; flag=flagMap.get(fromUserName); if(!flag) respContent="你必须先发送上墙才拥有发送消息的权限"; else respContent="你发送的消息已上墙"; } } }else{ flag=false; flagMap.put(fromUserName,flag); } /*if(list.contains(fromUserName)){ System.out.println("这个对应的标志位出来了"); }else{ flag=false; if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){ //if(flag) // respContent="你发送的消息已上墙"; if(content.equals("上墙")){ flag=true; respContent="上墙成功,你可以发送消息了"; }else{ //respContent="消息可以上弹幕"; if(!flag) respContent="你必须先发送上墙才拥有发送消息的权限"; else respContent="你发送的消息已上墙"; } } }*/ if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){ //if(flag) // respContent="你发送的消息已上墙"; if(content.equals("上墙")){ flag=true; respContent="上墙成功,你可以发送消息了"; }else{ //respContent="消息可以上弹幕"; if(!flag) respContent="你必须先发送上墙才拥有发送消息的权限"; else respContent="你发送的消息已上墙"; } } //图片消息 elseif(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){ respContent="您发送的是图片消息!"; } //地理位置消息 elseif(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)){ respContent="您发送的是地理位置消息!"; } //链接消息 elseif(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)){ respContent="您发送的是链接消息!"; } //音频消息 elseif(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){ respContent="您发送的是音频消息!"; } //事件推送 elseif(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){ //事件类型 StringeventType=requestMap.get("Event"); //订阅 if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){ respContent="谢谢您的关注!"; } //取消订阅 elseif(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){ //TODO取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息 } //自定义菜单点击事件 elseif(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){ //TODO自定义菜单权没有开放,暂不处理该类消息 } } textMessage.setContent(respContent); respMessage=MessageUtil.textMessageToXml(textMessage); }catch(Exceptione){ e.printStackTrace(); } returnrespMessage; }}