收藏 分销(赏)

微信公众平台开发教程Java版.doc

上传人:丰**** 文档编号:3099608 上传时间:2024-06-17 格式:DOC 页数:52 大小:1.91MB
下载 相关 举报
微信公众平台开发教程Java版.doc_第1页
第1页 / 共52页
微信公众平台开发教程Java版.doc_第2页
第2页 / 共52页
微信公众平台开发教程Java版.doc_第3页
第3页 / 共52页
微信公众平台开发教程Java版.doc_第4页
第4页 / 共52页
微信公众平台开发教程Java版.doc_第5页
第5页 / 共52页
点击查看更多>>
资源描述

1、微信公众平台开发教程Java版一、 环境准备篇准备写系列博客,记录下我的微信公众平台学习记录,也为那些摸索中的开发者提供点参考。希望与大家共同进步。微信3.0的时候我开始做微信公众账号,那时候没时间研究开发,先用的是编辑者模式,后用开发者模式,托管于第三方。一直想自己写个服务端来实现个人定制化的需求。废话不多说,进入正题。想要开发微信公众平台需要一些环境一、申请微信公众账号 这个就不用废话了。附上地址: 现在申请好严格的说,3.0的时候申请都不需要拍照什么的。 友情提示: 1、微信公众账号的名字一旦申请,则不能更改。取名请慎重!2、一个身份证只能申请两个公众号 3、公众号分两种:订阅号和服务号

2、 订阅号可一天群发一次消息,目前不能申请自定义菜单。发送的消息将显示在“订阅号”文件夹中,适合媒体等提供咨询服务的公众号。 服务号一个月只能群发一条消息,能申请自定义菜单,发送的消息会显示在用户的聊天列表中,并会提醒用户新消息。适合为用户提供服务的公众号二、外网服务器 你需要一台外网服务器,来发布你的代码,用于接收处理用户发送的请求。 如果没有的话,也不用担心。可以使用百度BAE,或者是sina sae,国外比较多的是用google的gae。 google gae支持的语言很多。但是在国内经常访问不了,不推荐使用。 百度Bae 支持java和php(完全免费,百度对于资源方面还是一向很大方的,

3、赞一个,哈哈) sina sae 支持java,php,python(可免费使用半年,收费的,但很便宜)三、至少会一种语言 java,php,asp,python等,至少得会一样!接下来的文章中我会用java做事例来做微信公众平台的开发二、 接口配置微信公众账号申请完成后,默认开启的是编辑模式。我们需要修改为开发模式。登陆微信公众平台功能高级功能先关闭 编辑模式,再开启 开发模式。申请成为开发者,如果是服务号,需要则会有开发者凭证信息如图如果是订阅号,则只显示服务器配置。下一步就是配置接口服务器了。在公众平台网站的高级功能 开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL

4、是开发者用来接收微信服务器数据的接口URL。(这就是我们开发的程序,并部署到公网上了)Token 官网描述:可由开发者任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。总之就是你的程序里面写的token和这里填入的token要一致。还没有url和token?首先需要新建一个java web工程。接下来就要看看验证url和token了。下面是官网的描述,已经写的很清楚了核心实现方式就是将三个参数排序,拼接成字符串进行sha1加密,然后与signature比较官网也给了实例,是php的,我们只需要装换成java就可以了。private function

5、 checkSignature() $signature = $_GETsignature; $timestamp = $_GETtimestamp; $nonce = $_GETnonce;$token = TOKEN;$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if( $tmpStr = $signature )return true;elsereturn false;java代码 我的 WeixinContr

6、oller 类 我的项目架构是基于spring3.0的,用到了注解。当get请求的时候会执行get方法,post请求的时候会执行post方法,分别来处理不同的请求,各位也可用servlet等去实现,原理都一样package com.ifp.weixin.controller;import java.io.IOException;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import javax.annotation.Resource;import javax.servlet.http.HttpS

7、ervletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.ifp.weixin.biz.core.CoreService;import com.ifp.weixin.uti

8、l.SignUtil;ControllerRequestMapping(/weixinCore)public class WeixinController Resource(name=coreService)private CoreService coreService;RequestMapping(method = RequestMethod.GET)public void get(HttpServletRequest request, HttpServletResponse response) / 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp

9、参数、nonce参数。String signature = request.getParameter(signature);/ 时间戳String timestamp = request.getParameter(timestamp);/ 随机数String nonce = request.getParameter(nonce);/ 随机字符串String echostr = request.getParameter(echostr);PrintWriter out = null;try out = response.getWriter();/ 通过检验signature对请求进行校验,若校验

10、成功则原样返回echostr,否则接入失败if (SignUtil.checkSignature(signature, timestamp, nonce) out.print(echostr); catch (IOException e) e.printStackTrace(); finally out.close();out = null;RequestMapping(method = RequestMethod.POST)public void post(HttpServletRequest request, HttpServletResponse response) /暂时空着,在这里可

11、处理用户请求上面类中用到了SignUtil 类package com.ifp.weixin.util;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;import com.ifp.weixin.constant.Constant;/* * 验证签名 * */public class SignUtil /* * 验证签名 * param signature * param timestamp * param nonce * return

12、 */public static boolean checkSignature(String signature, String timestamp, String nonce) String arr = new String Constant.TOKEN, timestamp, nonce ;/ 将token、timestamp、nonce三个参数进行字典排序Arrays.sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i arr.length; i+) content.append(arri);Me

13、ssageDigest md = null;String tmpStr = null;try md = MessageDigest.getInstance(SHA-1);/ 将三个参数字符串拼接成一个字符串进行sha1加密byte digest = md.digest(content.toString().getBytes();tmpStr = byteToStr(digest); catch (NoSuchAlgorithmException e) e.printStackTrace();content = null;/ 将sha1加密后的字符串可与signature对比return tmp

14、Str != null ? tmpStr.equals(signature.toUpperCase() : false;/* * 将字节数组转换为十六进制字符串 * * param byteArray * return */private static String byteToStr(byte byteArray) String strDigest = ;for (int i = 0; i 4) & 0X0F;tempArr1 = DigitmByte & 0X0F;String s = new String(tempArr);return s;我们看到checkSignature 这个方法

15、里使用到了Constant.TOKEN ,这个token,我声明的一个常量。要与微信配置接口里面的token值一样/* 与接口配置信息中的Token要一致*/public static String TOKEN = infopower;也贴上web.xml的配置,我的后缀是.html 的请求都交给DispatcherServlet了。web-app version=3.0 xmlns=xmlns:xsi=http:/www.w3.org/2001/XMLSchema-instancexsi:schemaLocation= weixinHelpcontextConfigLocationclass

16、path:/applicationContext.xmllog4jConfigLocationclasspath:/properties/log4j.propertiesorg.springframework.web.util.Log4jConfigListenerencodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8encodingFilter/*spring 容器的监听器org.springframework.web.context.ContextLoaderListeneracti

17、onorg.springframework.web.servlet.DispatcherServletaction*.htmlindex.jsp我们的代码已经写完了,访问请求地址试试什么都没有显示,看看后台报空指针异常别担心,我们的代码没问题。因为直接访问地址,默认是get请求,而什么参数都没有传给后台,当然会报空指针前台没有异常,是因为我做了异常处理。ok接下来就是把代码打成war包发布到外网。然后填入相应的url和token,接口的配置就完成了。注意1:一定要发布war包到外网,配置外网的url,有些开发者配置的是ip是localhost,那肯定是不行的啦。 如果没有外网环境,请看我的第一

18、篇,环境准备,里面有介绍可以使用百度bae注意2:开发模式一定要开启,不然配置了url和token也没用,我犯过这个错,嘿嘿。三、 消息接收和发送前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送可以先了解公众平台的消息api接口(接收消息,发送消息)接收消息当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。接收的消息类型有6种,分别为: 1文本消息 2图片消息 3语音消息 4视频消息 5地理位置消息 6链接消息可以根据官方的api提供的字段建立对应的实体类如:文本消息有很多属性是所有消息类型都需要的,可以把这些信息提取出来建立一个

19、基类package com.ifp.weixin.entity.Message.req;/* * 消息基类(用户 - 公众帐号) * */public class BaseMessage /* * 开发者微信号 */private String ToUserName;/* * 发送方帐号(一个OpenID) */private String FromUserName;/* * 消息创建时间 (整型) */private long CreateTime;/* * 消息类型 text、image、location、link */private String MsgType;/* * 消息id,64

20、位整型 */private long MsgId;public String getToUserName() return ToUserName;public void setToUserName(String toUserName) ToUserName = toUserName;public String getFromUserName() return FromUserName;public void setFromUserName(String fromUserName) FromUserName = fromUserName;public long getCreateTime() r

21、eturn CreateTime;public void setCreateTime(long createTime) CreateTime = createTime;public String getMsgType() return MsgType;public void setMsgType(String msgType) MsgType = msgType;public long getMsgId() return MsgId;public void setMsgId(long msgId) MsgId = msgId;接收的文本消息package com.ifp.weixin.enti

22、ty.Message.req;/* * 文本消息 */public class TextMessage extends BaseMessage /* * 回复的消息内容 */private String Content;public String getContent() return Content;public void setContent(String content) Content = content;接收的图片消息package com.ifp.weixin.entity.Message.req;public class ImageMessage extends BaseMess

23、ageprivate String picUrl;public String getPicUrl() return picUrl;public void setPicUrl(String picUrl) this.picUrl = picUrl;接收的链接消息package com.ifp.weixin.entity.Message.req;public class LinkMessage extends BaseMessage /* * 消息标题 */private String Title;/* * 消息描述 */private String Description;/* * 消息链接 *

24、/private String Url;public String getTitle() return Title;public void setTitle(String title) Title = title;public String getDescription() return Description;public void setDescription(String description) Description = description;public String getUrl() return Url;public void setUrl(String url) Url =

25、 url;接收的语音消息package com.ifp.weixin.entity.Message.req;/* * 语音消息 * * author Caspar * */public class VoiceMessage extends BaseMessage /* * 媒体ID */private String MediaId;/* * 语音格式 */private String Format;public String getMediaId() return MediaId;public void setMediaId(String mediaId) MediaId = mediaId;

26、public String getFormat() return Format;public void setFormat(String format) Format = format;接收的地理位置消息package com.ifp.weixin.entity.Message.req;/* * 位置消息 * * author caspar * */public class LocationMessage extends BaseMessage /* * 地理位置维度 */private String Location_X;/* * 地理位置经度 */private String Locati

27、on_Y;/* * 地图缩放大小 */private String Scale;/* * 地理位置信息 */private String Label;public String getLocation_X() return Location_X;public void setLocation_X(String location_X) Location_X = location_X;public String getLocation_Y() return Location_Y;public void setLocation_Y(String location_Y) Location_Y = lo

28、cation_Y;public String getScale() return Scale;public void setScale(String scale) Scale = scale;public String getLabel() return Label;public void setLabel(String label) Label = label;发送被动响应消息对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。请注意,回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器,只支持认证服务号

29、。同样,建立响应消息的对应实体类 也把公共的属性提取出来,封装成基类 响应消息的基类package com.ifp.weixin.entity.Message.resp;/* * 消息基类(公众帐号 - 用户) */public class BaseMessage /* * 接收方帐号(收到的OpenID) */private String ToUserName;/* * 开发者微信号 */private String FromUserName;/* * 消息创建时间 (整型) */private long CreateTime;/* * 消息类型 */private String MsgTy

30、pe;/* * 位0x0001被标志时,星标刚收到的消息 */private int FuncFlag;public String getToUserName() return ToUserName;public void setToUserName(String toUserName) ToUserName = toUserName;public String getFromUserName() return FromUserName;public void setFromUserName(String fromUserName) FromUserName = fromUserName;pu

31、blic long getCreateTime() return CreateTime;public void setCreateTime(long createTime) CreateTime = createTime;public String getMsgType() return MsgType;public void setMsgType(String msgType) MsgType = msgType;public int getFuncFlag() return FuncFlag;public void setFuncFlag(int funcFlag) FuncFlag =

32、funcFlag; 响应文本消息package com.ifp.weixin.entity.Message.resp;/* * 文本消息 */public class TextMessage extends BaseMessage /* * 回复的消息内容 */private String Content;public String getContent() return Content;public void setContent(String content) Content = content;响应图文消息package com.ifp.weixin.entity.Message.res

33、p;import java.util.List;/* * 多图文消息, * 单图文的时候 Articles 只放一个就行了 * author Caspar.chen */public class NewsMessage extends BaseMessage /* * 图文消息个数,限制为10条以内 */private int ArticleCount;/* * 多条图文消息信息,默认第一个item为大图 */private List Articles;public int getArticleCount() return ArticleCount;public void setArticle

34、Count(int articleCount) ArticleCount = articleCount;public List getArticles() return Articles;public void setArticles(List articles) Articles = articles;图文消息的定义package com.ifp.weixin.entity.Message.resp;/* * 图文消息 * */public class Article /* * 图文消息名称 */private String Title;/* * 图文消息描述 */private Strin

35、g Description;/* * 图片链接,支持JPG、PNG格式, * 较好的效果为大图640*320,小图80*80 */private String PicUrl;/* * 点击图文消息跳转链接 */private String Url;public String getTitle() return Title;public void setTitle(String title) Title = title;public String getDescription() return null = Description ? : Description;public void setD

36、escription(String description) Description = description;public String getPicUrl() return null = PicUrl ? : PicUrl;public void setPicUrl(String picUrl) PicUrl = picUrl;public String getUrl() return null = Url ? : Url;public void setUrl(String url) Url = url;响应音乐消息package com.ifp.weixin.entity.Message.resp;/* * 音乐消息 */public class MusicMessage extends BaseMess

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服