最近在搞微信的开发者模式,对于第一次接触这东西的人来说还真是没有头绪,因为需要跟微信进行交互,难免会碰到一些问题,不像我们在本机开发那样,很快就能把逻辑代码写完。今天主要是让测试耽误了时间,由于微信只能绑定域名,不能使用ip地址,但是在公司中域名直接解析到线上服务器,但是线上服务器该域名下已经有服务在运行,所以不能使用线上服务器直接进行开发测试,也不能把已有的服务号打开开发者模式,因为打开开发者模式之后好多已有的自动回复就不能使用了,总之遇到了各种问题,记录下开发过程。

申请测试账号

进入申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

点击登录按钮,会弹出一个二维码,使用手机微信扫描即可

登录成功之后会出现下面的界面

appID和appsecret在调用微信接口的时候会用到,这里是微信自动给我们生成好的,直接使用就可以。

URL:是我们自己服务器的URL,用户微信推送用户消息和事件用的。这里只能配置域名,不能使用IP。这个URL是用来接收微信的token认证和消息事件用的,我们自己的服务器要能对这个url的请求进行处理并相应,所以要求该域名必须是外网可以访问的,否则在点“提交”按钮的时候会报token异常。

Token:是验证签名用的,此处填写的要与代码中的Token保持一致否则验证不过。

URL和Token都填好之后点击提交按钮,若验证通过,会返回配置成功,否则返回配置失败。

配置失败的原因可能有几个:

1、URL地址不能访问

2、Token填写错误

注意:在点击提交按钮之前一定要先把服务端的代码写好,否则会返回配置失败,具体实现代码在后面演示。

到此为止,我们的接口配置信息就算完成了。

扫描测试号二维码就可以来测试我们的功能了

Token认证

我配置的URL是,http://www.xxx.com/XX/wxProcess/service,所以微信会把所有的请求都发到我的/service路径上,包括Token认证和事件处理,我使用两个方法来处理的,但是请求类型不同,Token认证是用的GET请求,事件处理使用的是POST请求。演示代码如下:

/*** 打开开发者模式签名认证* @param signature* @param timestamp* @param nonce* @param echostr* @return*/@ResponseBody@RequestMapping(value = "/service", method = RequestMethod.GET)public Object defaultView(String signature, String timestamp, String nonce, String echostr) {if (echostr == null || echostr.isEmpty()) {return nonce;}if (SignUtil.checkSignature(signature, timestamp, nonce)) {return echostr;}return nonce;}/*** 事件处理* @param signature* @param timestamp* @param nonce* @param message* @return*/@ResponseBody@RequestMapping(value = "/service", method = RequestMethod.POST, consumes = "text/xml", produces = "text/xml;charset=UTF-8")public String defaultViewHandler(String signature, String timestamp, String nonce, @RequestBody String message) {String result = "";if (SignUtil.checkSignature(signature, timestamp, nonce)) {result = coreService.processRequest(message);}return result;}

做签名认证的时候会调用我的defaultView方法,其他的事件都走defaultViewHandler方法。

coreService.processRequest(): 是对所有的请求事件进行处理

CoreService.java主要代码实现如下:

@Overridepublic String processRequest(String msg) {String respMessage = null;try {// 默认返回的文本消息内容String respContent = "";// xml请求解析Map<String, String> requestMap = MessageUtil.parseXml(msg);// 发送方帐号(open_id)String fromUserName = requestMap.get("FromUserName");// 公众帐号String toUserName = requestMap.get("ToUserName");// 消息类型String msgType = requestMap.get("MsgType");String eventType = requestMap.get("Event");// 存在事件类型且类型有效 或者 消息类型可以处理,才需要进行身份处理,防止没有意义的事件引起发送大量绑定消息if ((!StringUtils.isEmpty(eventType) && !eventArrays.contains(eventType)) || !msgArrays.contains(msgType)) {return "";}respMessage = handleWxMessage(requestMap);} catch (Exception e) {LOGGER.error("error", e);e.printStackTrace();}return respMessage;}@Overridepublic String handleWxMessage(Map<String, String> requestMap) {// 发送方帐号(open_id)String fromUserName = requestMap.get("FromUserName");// 公众帐号String toUserName = requestMap.get("ToUserName");// 消息类型String msgType = requestMap.get("MsgType");// 回复文本消息String respContent = "";BaseMessage textMessage = new TextMessage();textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);switch (msgType) {case MessageUtil.REQ_MESSAGE_TYPE_TEXT:// 文本类型消息,暂时设置成用户发什么就回复什么String content = requestMap.get("Content");respContent = "";break;case MessageUtil.REQ_MESSAGE_TYPE_VOICE:// 使用语音识别功能需要开启微信公众号相关权限// 语音识别结果String recognizeText = requestMap.get("Recognition");respContent = "";break;case MessageUtil.REQ_MESSAGE_TYPE_EVENT:// 事件类型String eventType = requestMap.get("Event");// 事件KEY值,qrscene_为前缀,后面为二维码的参数值String eventKey = requestMap.get("EventKey");// 自定义事件switch (eventType) {// 用户未关注时,进行关注后的事件推送case MessageUtil.EVENT_TYPE_SUBSCRIBE:if (isUserBuyLastActivity(fromUserName)) {textMessage = getAddClassTextMessage(fromUserName);} else {textMessage = getDefaultTextMessage(fromUserName);}Integer eventKeyValue = 1;// 带参数的情景值if (!StringUtils.isEmpty(eventKey) && eventKey.contains("qrscene_")) {eventKey = eventKey.replace("qrscene_", "");// 渠道IDeventKeyValue = Integer.parseInt(eventKey);}subscribeAction(fromUserName, eventKeyValue);break;// 取消关注case MessageUtil.EVENT_TYPE_UNSUBSCRIBE:unSubscribeAction(fromUserName);break;// 用户已关注时的事件推送case MessageUtil.EVENT_TYPE_SCAN:textMessage = getDefaultTextMessage(fromUserName);break;default:respContent = "";break;}break;default:respContent = "";break;}if (textMessage instanceof TextMessage) {// 文本内容为空且是文本消息返回空字符串,防止微信发送异常消息String content = ((TextMessage) textMessage).getContent();if (StringUtils.isEmpty(respContent) && StringUtils.isEmpty(content)) {return "";}if (org.apache.commons.lang.StringUtils.isBlank(content)) {((TextMessage) textMessage).setContent(respContent);}}textMessage.setToUserName(fromUserName);textMessage.setFromUserName(toUserName);textMessage.setCreateTime(new Date().getTime());String xmlString = MessageUtil.messageToXml(textMessage);return xmlString;}

上面只是展示了部分核心代码,具体代码可以去我的GitHub下载,地址:https://github.com/liuyanmin/wxDemo

下面是微信开发相关的链接:

申请个人测试账号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

微信被动回复消息开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

微信错误码文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

Java实现微信开发者-测试账号申请及配置相关推荐

  1. 连小白都能看懂的微信开发之测试账号申请

    微信测试账号申请 由于用户体验和安全性方面的考虑,微信公众号的注册有一定门槛,某些高级接口的权限需要微信认证后才可以获取. 所以,为了帮助开发者快速了解和上手微信公众号开发,熟悉各个接口的调用,我们推 ...

  2. 微信小程序云开发-微信小程序账号申请及新手环境配置

    申请一个微信小程序账号 在微信开发时,我们yx时候可能需要用到微信小程序,微信小程序云开发需要使用注册的小程序appid,测试和游客进入是没有云开发的功能,所以我们需要注册一个微信小程序账号.在注册账 ...

  3. 微信小程序账号申请与开发软件下载

    申请账号 点击 https://mp.weixin.qq.com/wxopen/waregister?action=step1 根据指引填写信息和提交相应的资料. 注册完以后就可以在这个 https: ...

  4. 微信开发[测试账号]

    一.微信开发: Oauth 认证 所需:服务器一台 微信 Oauth 授权过程与服务器认证 其实在正常开发的时候,可以省略一步,就是在菜单栏哪里配置 微信OAuth 链接就好,有一点需要注意的是作为参 ...

  5. 微信公众号测试账号申请,后台获取公众号关注取关事件,获取用户发送消息

    目录 1.访问微信公众号平台 2.扫码登录 3.登录后进行接口信息配置 4.完成以上配置和代码,将代码部署到服务器上,后台就可以接收到公众号的关注.取关.用户发送的消息等等事件拉! 1.访问微信公众号 ...

  6. 微信公众号测试账号的接口配置信息配置失败

    记录一次配置失败的问题 问题发生环境: 因为项目之前配置是好的,后来域名备案,更换域名后,备案后重新配置,提示报错: 后面怎么调试都不合适,于是想到是否是域名配置时候哪里配置不合适,打开阿里云控制台, ...

  7. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  8. 微信公众号开发-网页授权——配置测试账号

    思路分析: 1.创建测试账号并且配置测试账号的授权回调域名. 2.由前端发起授权请求,微信收到请求后(若是首次打开,并且未关注公众号,微信会弹出授权页,提示用户授权)将重定向到请求url中配置的red ...

  9. 微信公众号测试账号总结

    微信公众号测试账号总结 微信公众号 微信公众号测试账号 申请测试账号 配置微信公众号测试账号 接口配置信息 JS接口安全域名,模板消息接口 网页授权获取用户基本信息 微信公众号 微信公众号测试账号 在 ...

最新文章

  1. Linux and the Device Tree
  2. linux中postscript如何生成,【转载】如何为Linux生成和打上patch
  3. [数论]莫比乌斯反演1
  4. MyBatis : Example 条件查询 in 用法
  5. 为什么GOF的23种设计模式里面没有MVC?
  6. 深度学习自学(三十八):基于交互式双流解码器图像显著性检测
  7. java day47【redis概念 、下载安装 、 命令操作 、持久化操作 、使用Java客户端操作redis】...
  8. 25年前的预言(转贴一篇,事实胜于雄辩)
  9. 编程语言-Ruby-问题整理
  10. [Shell]test命令使用指南
  11. Java从入门到精通(一)
  12. VUE2快速入门(六)---实例property(重点)
  13. chipsel语言_英语快速记忆法视频
  14. 建立统计回归模型的基本步骤_基本回归模型
  15. R语言|导入excel数据
  16. 有哪些赚钱的软件?说说我是如何每天赚上千元的!
  17. css网站样式表是什么,什么是css样式表
  18. 大型C++网络游戏开发视频教程
  19. 研究生期间科研经验总结
  20. Unix 文件系统的核心目录总结

热门文章

  1. 联通、华为携手打造5G专网,解决煤矿井下作业难题
  2. bat 批处理 小工具
  3. BUUCTF笔记之Web系列部分WriteUp(三)
  4. Android App Dark Theme(暗黑模式)适配指南,android实战mysql
  5. biabiamiamia百度音乐网批量歌曲下载工具
  6. Cassandra,NoSQL中的兰博基尼
  7. (7,4)汉明码编码译码及计算最小码距——基于MATLAB编程
  8. node下载文件 解压压缩包
  9. 戴尔R710服务器配置raid阵列(附图文)
  10. TCL/TK 学习笔记 之 用C定义自己的TCL命令