這篇文章利用java開發微信公眾號案例代碼,如何接入公眾號,訂閱號怎麼樣接收訊息,具有一定的參考價值,有興趣的小夥伴們可以參考一下
微信公眾號開發一般是針對企業和組織的,個人一般只能申請訂閱號,並且調用的接口有限,下面我們就來簡單的描述下接入公眾號的步驟:
1、首先你需要一個郵箱在微信公眾號平台進行註冊;
註冊的方式有訂閱號碼、公眾號、小程式和企業號,個人我們這裡只能選擇訂閱號碼
2、註冊完後,我們登入公眾號平台--->開發--->基本配置,這裡需要填寫URL和token ,URL就是我們使用伺服器的介面;
3、Java Web伺服器程式編譯好且在伺服器上部署可以運行的話,可在微信公眾號進行線上介面偵錯 :
1)、選擇適當的介面
2)、系統產生此介面的參數表,您可直接在文字方塊內填入對應的參數值(紅色星號表示此欄位必填)
3)、點選檢查問題按鈕,即可取得對應的除錯資訊
eg:取得access_token的步驟:
# 1)、介面類型:基礎支援
2)、介面清單:取得access_token介面/token
3)、填寫對應的參數:grant_type、appid、secret
4)、點選檢查問題
我們在這裡驗證比較多的是訊息介面偵錯:文本訊息、圖片訊息、語音訊息、
影片
4、介面有不理解的地方,可進入開發-->開發者工具-->開發者文件進行
查詢
下面我們主要講
訂閱號碼怎麼樣接收訊息
1、需要申請一個個人微信訂閱號碼
1)、Accounts
Servlet
package cn.jon.wechat.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.jon.wechat.service.AccountsService; import cn.jon.wechat.utils.SignUtil; public class AccountsServlet extends HttpServlet { public AccountsServlet() { super(); } public void destroy() { super.destroy(); // Put your code here } /** * 确认请求来自于微信服务器 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("接口测试开始!!!"); //微信加密签名 String signature = request.getParameter("signature"); //时间戳 String timestamp = request.getParameter("timestamp"); //随机数 String nonce = request.getParameter("nonce"); //随机字符串 String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter(); //通过校验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if(SignUtil.checkSignature(signature,timestamp,nonce)){ out.print(echostr); } out.close(); out = null; // response.encodeRedirectURL("success.jsp"); } /** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //消息的接受、处理、响应 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //调用核心业务类型接受消息、处理消息 String respMessage = AccountsService.processRequest(request); //响应消息 PrintWriter out = response.getWriter(); out.print(respMessage); out.close(); } public void init() throws ServletException { // Put your code here } }2)、SignUtil.java類,請求校驗工具類,token需要和微信中填寫的token一致
package cn.jon.wechat.utils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * 请求校验工具类 * @author jon */ public class SignUtil { //与微信配置中的的Token一致 private static String token = ""; public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arra = new String[]{token,timestamp,nonce}; //将signature,timestamp,nonce组成数组进行字典排序 Arrays.sort(arra); StringBuilder sb = new StringBuilder(); for(int i=0;i<arra.length;i++){ sb.append(arra[i]); } MessageDigest md = null; String stnStr = null; try { md = MessageDigest.getInstance("SHA-1"); byte[] digest = md.digest(sb.toString().getBytes()); stnStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } //释放内存 sb = null; //将sha1加密后的字符串与signature对比,标识该请求来源于微信 return stnStr!=null?stnStr.equals(signature.toUpperCase()):false; } /** * 将字节数组转换成十六进制字符串 * @param digestArra * @return */ private static String byteToStr(byte[] digestArra) { // TODO Auto-generated method stub String digestStr = ""; for(int i=0;i<digestArra.length;i++){ digestStr += byteToHexStr(digestArra[i]); } return digestStr; } /** * 将字节转换成为十六进制字符串 */ private static String byteToHexStr(byte dByte) { // TODO Auto-generated method stub char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char[] tmpArr = new char[2]; tmpArr[0] = Digit[(dByte>>>4)&0X0F]; tmpArr[1] = Digit[dByte&0X0F]; String s = new String(tmpArr); return s; } public static void main(String[] args) { /*byte dByte = 'A'; System.out.println(byteToHexStr(dByte));*/ Map<String,String> map = new ConcurrentHashMap<String, String>(); map.put("4", "zhangsan"); map.put("100", "lisi"); Set set = map.keySet(); Iterator iter = set.iterator(); while(iter.hasNext()){ // String keyV = (String) iter.next(); String key =(String)iter.next(); System.out.println(map.get(key)); // System.out.println(map.get(iter.next())); } /*for(int i=0;i<map.size();i++){ }*/ } }3)、AccountsService.java服務類,主要是訊息的請求和回應處理,並且當使用者關注你的公眾號碼的時候,可以設定默認推播訊息
#package cn.jon.wechat.utils;
import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import cn.jon.wechat.message.req.ImageMessage;
import cn.jon.wechat.message.req.LinkMessage;
import cn.jon.wechat.message.req.LocationMessage;
import cn.jon.wechat.message.req.VideoMessage;
import cn.jon.wechat.message.req.VoiceMessage;
import cn.jon.wechat.message.resp.Article;
import cn.jon.wechat.message.resp.MusicMessage;
import cn.jon.wechat.message.resp.NewsMessage;
import cn.jon.wechat.message.resp.TextMessage;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
/**
* 各种消息的处理类
* @author jon
*/
public class MessageUtil {
/**
* 文本类型
*/
public static final String MESSSAGE_TYPE_TEXT = "text";
/**
* 音乐类型
*/
public static final String MESSSAGE_TYPE_MUSIC = "music";
/**
* 图文类型
*/
public static final String MESSSAGE_TYPE_NEWS = "news";
/**
* 视频类型
*/
public static final String MESSSAGE_TYPE_VIDEO = "video";
/**
* 图片类型
*/
public static final String MESSSAGE_TYPE_IMAGE = "image";
/**
* 链接类型
*/
public static final String MESSSAGE_TYPE_LINK = "link";
/**
* 地理位置类型
*/
public static final String MESSSAGE_TYPE_LOCATION = "location";
/**
* 音频类型
*/
public static final String MESSSAGE_TYPE_VOICE = "voice";
/**
* 推送类型
*/
public static final String MESSSAGE_TYPE_EVENT = "event";
/**
* 事件类型:subscribe(订阅)
*/
public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
/**
* 事件类型:unsubscribe(取消订阅)
*/
public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
/**
* 事件类型:click(自定义菜单点击事件)
*/
public static final String EVENT_TYPE_CLICK= "CLICK";
/**
* 解析微信发来的请求 XML
*/
@SuppressWarnings("unchecked")
public static Map<String,String> pareXml(HttpServletRequest request) throws Exception {
//将解析的结果存储在HashMap中
Map<String,String> reqMap = new HashMap<String, String>();
//从request中取得输入流
InputStream inputStream = request.getInputStream();
//读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
//得到xml根元素
Element root = document.getRootElement();
//得到根元素的所有子节点
List<Element> elementList = root.elements();
//遍历所有的子节点取得信息类容
for(Element elem:elementList){
reqMap.put(elem.getName(),elem.getText());
}
//释放资源
inputStream.close();
inputStream = null;
return reqMap;
}
/**
* 响应消息转换成xml返回
* 文本对象转换成xml
*/
public static String textMessageToXml(TextMessage textMessage) {
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
/**
* 语音对象的转换成xml
*
*/
public static String voiceMessageToXml(VoiceMessage voiceMessage) {
xstream.alias("xml", voiceMessage.getClass());
return xstream.toXML(voiceMessage);
}
/**
* 视频对象的转换成xml
*
*/
public static String videoMessageToXml(VideoMessage videoMessage) {
xstream.alias("xml", videoMessage.getClass());
return xstream.toXML(videoMessage);
}
/**
* 音乐对象的转换成xml
*
*/
public static String musicMessageToXml(MusicMessage musicMessage) {
xstream.alias("xml", musicMessage.getClass());
return xstream.toXML(musicMessage);
}
/**
* 图文对象转换成xml
*
*/
public static String newsMessageToXml(NewsMessage newsMessage) {
xstream.alias("xml", newsMessage.getClass());
xstream.alias("item", new Article().getClass());
return xstream.toXML(newsMessage);
}
/**
* 图片对象转换成xml
*
*/
public static String imageMessageToXml(ImageMessage imageMessage)
{
xstream.alias("xml",imageMessage.getClass());
return xstream.toXML(imageMessage);
}
/**
* 链接对象转换成xml
*
*/
public static String linkMessageToXml(LinkMessage linkMessage)
{
xstream.alias("xml",linkMessage.getClass());
return xstream.toXML(linkMessage);
}
/**
* 地理位置对象转换成xml
*
*/
public static String locationMessageToXml(LocationMessage locationMessage)
{
xstream.alias("xml",locationMessage.getClass());
return xstream.toXML(locationMessage);
}
/**
* 拓展xstream,使得支持CDATA块
*
*/
private static XStream xstream = new XStream(new XppDriver(){
public HierarchicalStreamWriter createWriter(Writer out){
return new PrettyPrintWriter(out){
//对所有的xml节点的转换都增加CDATA标记
boolean cdata = true;
@SuppressWarnings("unchecked")
public void startNode(String name,Class clazz){
super.startNode(name,clazz);
}
protected void writeText(QuickWriter writer,String text){
if(cdata){
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
}else{
writer.write(text);
}
}
};
}
});
}
5)、BaseMessage.java訊息基類別(包含:開發者微訊號、使用者帳號、建立時間、訊息類型、訊息ID變數 ),文字、影片、圖片訊息都會
繼承
#
package cn.jon.wechat.message.req; /** * 消息基类 (普通用户-公众号) * @author jon */ public class BaseMessage { //开发者微信号 private String ToUserName; //发送方账号(一个openId) private String FromUserName; //消息创建时间(整型) private long CreateTime; //消息类型(text/image/location/link...) private String MsgType; //消息id 64位整型 private String MsgId; public BaseMessage() { super(); // TODO Auto-generated constructor stub } public BaseMessage(String toUserName, String fromUserName, long createTime, String msgType, String msgId) { super(); ToUserName = toUserName; FromUserName = fromUserName; CreateTime = createTime; MsgType = msgType; MsgId = 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() { return CreateTime; } public void setCreateTime(long createTime) { CreateTime = createTime; } public String getMsgType() { return MsgType; } public void setMsgType(String msgType) { MsgType = msgType; } public String getMsgId() { return MsgId; } public void setMsgId(String msgId) { MsgId = msgId; } }6)、TextMessage.java文字訊息,繼承自5中基類,擴充內容屬性
package cn.jon.wechat.message.req; /** * 文本消息 * @author jon */ public class TextMessage extends BaseMessage{ //消息内容 private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
7 )、ImageMessage.java圖片訊息
package cn.jon.wechat.message.req; /** * 图片消息 * @author jon */ public class ImageMessage extends BaseMessage{ //图片链接 private String PicUrl; public String getPicUrl() { return PicUrl; } public void setPicUrl(String picUrl) { PicUrl = picUrl; } }8)、VideoMessage.java影片訊息
package cn.jon.wechat.message.req; public class VideoMessage extends BaseMessage { private String mediaId; private String thumbMediaId; public String getMediaId() { return mediaId; } public void setMediaId(String mediaId) { this.mediaId = mediaId; } public String getThumbMediaId() { return thumbMediaId; } public void setThumbMediaId(String thumbMediaId) { this.thumbMediaId = thumbMediaId; } }
以上是利用java開發微信公眾號案例代碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!