找回密码
 立即注册

QQ登录

只需一步,快速开始

微信公众号开发教程
微信公众号开发相关参考文章,不定期更新

2分钟搭建微信公众号后台

[复制链接]
查看: 1154|回复: 15
最佳答案
0 

1

主题

1

帖子

52

积分

新人求带

积分
52
 楼主| 发表于 2018-3-2 10:39:28 | 显示全部楼层 |阅读模式
前一段时间,写了一篇在新浪云上搭建自己的网站的教程,通过简单构建了一个 maven 的项目,展示部署的整个流程,具体的操作可以参看这里。
新浪云服务器除了可以搭建自己的网站以外,也非常的适合作为微信公众号回调地址来使用(熟悉微信公众号开发的朋友可能已经了解了,如果不太清楚请参看微信公众平台),微信公众号的开发需要一个公网可以访问的服务器,用于处理消息的 token 的验证,以及自身业务的定制开发。在这里,写了一些简单操作的例子,给大家参考。

准备

开发微信公众号首先要申请自己的公众号,或者获得相关需要开发的公众号的操作权限,如何申请,这里就不具体讲了,具体的流程大家可以参看微信公众号的申请流程,需要注意的是自己的 AppID 和自己的 AppSecret ,不要泄漏,还需要自己设置一个 token 令牌,这里还有一个消息的加密密钥 EncodingAESKey ,可以随机生成,用于消息的加密解密。如下图所示:


这里 URL 填写在新浪云申请的服务器的地址,当然具体指向到那个 path 我们需要自己去写一个 servlet,这里我自己定义了一个 WX 的 servlet,令牌我自己定义了一个,消息加密密钥使用了系统随机生成的,为了便于开发,所以消息加密方式,使用了明文的方式,这样消息就可以直观的看到,在填写完这些配置之后,在提交之后,微信的服务器会发一个 get 请求到我们填写的 URL 地址,去验证下 token,所以这里我们就预先要将这个 servlet 写好,简单的验证一步 token(代码会在下面列出),当验证通过后,修改才会成功,点击启用后,微信的服务器才会将客户端的消息,发送到我们提供的服务器。这里有具体的 接入指南。
我在我的项目中建立了一个叫 WX 的 servlet。添加了如下的代码。

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.     String sig =  request.getParameter("signature");
  3.     String timestamp =  request.getParameter("timestamp");
  4.     String nonce =  request.getParameter("nonce");
  5.     String echostr =  request.getParameter("echostr");
  6.     String token = "xxxx"; // 这里填写自己的 token
  7.     List<String> list = new ArrayList<String>();
  8.     list.add(nonce);
  9.     list.add(token);
  10.     list.add(timestamp);
  11.     Collections.sort(list);
  12.     String hash = getHash(list.get(0)+list.get(1)+list.get(2), "SHA-1");
  13.     if(sig.equals(hash)){ // 验证下签名是否正确
  14.         response.getWriter().println(echostr);
  15.     }else{
  16.         response.getWriter().println("");
  17.     }}public  String getHash(String source, String hashType) {
  18.     StringBuilder sb = new StringBuilder();
  19.     MessageDigest md5;
  20.     try {
  21.         md5 = MessageDigest.getInstance(hashType);
  22.         md5.update(source.getBytes());
  23.         for (byte b : md5.digest()) {
  24.             sb.append(String.format("%02x", b));
  25.         }
  26.         return sb.toString();
  27.     } catch (NoSuchAlgorithmException e) {
  28.         e.printStackTrace();
  29.     }
  30.     return null;}
复制代码


在验证完成后, 原样返回 echostr 字符串就行了。这样填写服务器配置之后就可以成功的保存配置了。注意需要点击启用微信才会将客户端的消息转发给自己的服务器。
以上这个环节条中通过之后,我们来处理下消息,根据消息的输入做一些简单的返回,比如输入 hello 返回特定的字符串,返回定义的字符串,输入 time,返回当前的时间。这里要注意,咱们服务器接受的请求是由微信的服务器 post 过来的,所以,我们的处理过程要写在 doPost 方法里。

  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.     String sig =  request.getParameter("signature");
  3.     System.out.println("sig : "+sig);
  4.     String timestamp =  request.getParameter("timestamp");
  5.     String nonce =  request.getParameter("nonce");
  6.     String echostr =  request.getParameter("echostr");
  7.     String token = "nero";
  8.     String responseContent = defaultStr;
  9.     List<String> list = new ArrayList<String>();
  10.     list.add(nonce);
  11.     list.add(token);
  12.     list.add(timestamp);
  13.     Collections.sort(list);
  14.     String hash = getHash(list.get(0)+list.get(1)+list.get(2), "SHA-1").toLowerCase();
  15.     if(sig.equals(hash)){
  16.         if(request.getMethod().equals("POST")){
  17.             Map<String,String> map = XMLParse.extract(convertStreamToString(request.getInputStream()));
  18.             if(map.get("Content").equals("hello")){
  19.                 responseContent = "Hello,This message from SinaCloud";
  20.             }
  21.             if(map.get("Content").equals("time")){
  22.                 sf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
  23.                 responseContent = sf.format(new Date());
  24.             }
  25.             responseMsg = formatResponseMsg(responseContent, map);
  26.         }
  27.         response.setCharacterEncoding("utf-8");
  28.         response.getWriter().println(responseMsg);
  29.     }else{
  30.         response.getWriter().println("success");
  31.     }}public String convertStreamToString(InputStream is) {
  32.     BufferedReader reader = new BufferedReader(new InputStreamReader(is));
  33.     StringBuilder sb = new StringBuilder();
  34.     String line = null;
  35.     try {
  36.         while ((line = reader.readLine()) != null) {
  37.             sb.append(line);
  38.         }
  39.     } catch (IOException e) {
  40.         e.printStackTrace();
  41.     } finally {
  42.         try {
  43.             is.close();
  44.         } catch (IOException e) {
  45.             e.printStackTrace();
  46.         }
  47.     }
  48.     return sb.toString();}public String formatResponseMsg(String content,Map map){
  49.     String responseMsg = "<xml>"
  50.             + "<ToUserName><![CDATA[%1$s]]></ToUserName>"
  51.             + "<FromUserName><![CDATA[%2$s]]></FromUserName>"
  52.             + "<CreateTime>%3$s</CreateTime>"
  53.             + "<MsgType><![CDATA[%4$s]]></MsgType>"
  54.             + "<Content><![CDATA[%5$s]]></Content>"
  55.             + "<MsgId>%6$s</MsgId>"
  56.             + "</xml>";
  57.     return String.format(responseMsg, map.get("FromUserName"),map.get("ToUserName"),map.get("CreateTime"),map.get("MsgType"),content,map.get("MsgId"));}
复制代码

以上的代码就是处理的大概的过程,处理的效果如下。
640.webp (1).jpg


以上就是使用新浪云大概搭建一个微信处理的后端程序,简单的实现了一些文本信息的交互功能,以后有时间继续写点其他消息的交互过程。


「新浪云福利」1000云豆免费领!低成本、免运维、灵活、安全稳定,轻松应对业务爆发式增长,一起来用吧!
新浪云官方邀请注册地址:[url=:http://www.sinacloud.com/public/ ... ja1-rp9sf6Kudg.html]file:///C:\Users\hp\AppData\Local\Temp\%W@GJ$ACOF(TYDYECOKVDYB.pnghttp://www.sinacloud.com[/url]

通过以上邀请链接注册成功后,可获得200云豆奖励首次充值˃=100元时,可获得600云豆奖励首次创建独享型MySQL,可获得200云豆奖励

640.webp (1).jpg
回复

使用道具 举报

最佳答案
0 

0

主题

38

帖子

105

积分

新人求带

积分
105
发表于 2018-3-4 16:49:22 | 显示全部楼层
学习了 .....
回复

使用道具 举报

最佳答案
0 

0

主题

44

帖子

78

积分

新人求带

积分
78
发表于 2018-3-6 23:20:13 | 显示全部楼层
多谢大佬
回复

使用道具 举报

最佳答案
0 

0

主题

6

帖子

75

积分

新人求带

积分
75
发表于 2018-3-8 20:20:21 | 显示全部楼层
受教了                             
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

22

帖子

206

积分

新人求带

积分
206
发表于 2018-3-12 20:11:59 | 显示全部楼层
学习。支持一个!!!
回复 支持 反对

使用道具 举报

最佳答案
1 

1

主题

34

帖子

174

积分

新人求带

积分
174
发表于 2018-3-23 07:54:04 | 显示全部楼层
学习一下,活动还在吗?
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

22

帖子

101

积分

新人求带

积分
101
发表于 2018-3-26 22:30:12 | 显示全部楼层
学习一下,谢谢分享。
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

5

帖子

49

积分

新人求带

积分
49
发表于 2018-3-27 08:25:51 | 显示全部楼层
xx谢谢分享1111111
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

187

帖子

1688

积分

专家路上

积分
1688
发表于 2018-3-28 10:12:08 | 显示全部楼层
:):):):):):):)
回复

使用道具 举报

最佳答案
0 

0

主题

8

帖子

44

积分

新人求带

积分
44
发表于 2018-4-1 10:43:27 | 显示全部楼层
不错  学习学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



www.henkuai.com—微信开发者的分享交流平台,专注微信开发生态。

天津市滨海新区
中新生态城中成大道生态建设公寓9号楼3层301

微信公众号

广告推广
QQ:805874290

市场合作
zhongcong@henkuai.com