Java微信开发入门
来源:互联网 发布:sql文 意义 编辑:程序博客网 时间:2024/05/22 03:10
第一步 注册一个公众号
1.1百度输入“微信公众平台”就能够进入公众号平台完成注册或登录。
1.2可以先熟悉一下微信本身的可编辑模式下消息的发送与回复之类的。。
1.3进入开发者模式,在左侧菜单栏找到“开发”菜单,里面会有比较详细的有关开发的知识等。
1.4由于个人注册只能注册订阅号,未经认证的公众号是不能直接进入开发者模式的,不过没关系,微信给每个订阅号提供了一个公众平台测试账号,在“开发者工具”--->“公众平台测试账号”(后面会用到)
如下图:
第二步:环境准备
2.1由于本地服务器不能实现和外网的通信,所以,我们需要一个外网映射内网的工具。
我用的是ngrok(很好下载),这是一个国外的服务器,所以速度可能有点慢,但是免费。他也有部署在国内的服务器,可以自定义域名(以前免费,现在收费)。
2.2配置ngrok。在命令行进入ngrok安装目录,输入ngrok即可进入ngrok
2.2 配置映射地址,输入ngrok 8081或ngrok http 8081由于版本不一样所以输入命令有差别。因为我的本地服务器Tomcat的端口设置为8081所以是ngrok http 8081,如果你是8080自行改动。
红线位置即是随机分配给你的映射地址,也就是说,当你启动本地服务器访问localhost:8081时和访问http://19b82289.ngrok.io是一样的效果。
第三步,创建Java项目(最好用maven项目,开发环境idea)部署本地服务器,保证部署无误,即能正确访问localhost:8081;(具体方法,不多说了,可百度idea如何创建maven项目)(虽然我在这一步浪费了好长时间,因为一个无知的错误)
可以给大家说一下maven的依赖方法
当你需要引入某个jar包时,需要在pom.xml中加入依赖。
首先你需要在https://mvnrepository.com/这个网站里搜索是否有你要用到的包,比如说搜dom4j
点进去一个,
点击verSion下的任意一个
红框内的代码即是你要加入pom.xml的代码。更新maven即可。
第四步,基本代码构成(本测试使用J2ee+tomact)
4.1创建目录如下
4.2cn.yang.util主要是一些工具类
Dao里是对象类
Serlet里是servlet
CheckUtil代码:
//开发者提交信息后,微信服务器将发送get请求到填写的服务器地址URL上,get请求携带四个参数,
package cn.yang.util;
/**
* Created by jibei on 2017/7/20.
* 验证服务器地址的有效性
*/
importjava.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class CheckUtil {
private static final Stringtoken="imooc";//自定义的
public static boolean checkSignature(String signature,String timestamp,String nonce){
String[] arr=new String[]{token,timestamp,nonce};
//排序
Arrays.sort(arr);
//生成字符串
StringBuffer content=newStringBuffer();
for(inti=0;i<arr.length;i++){
content.append(arr[i]);
}
//sha1加密
String temp=getSha1(content.toString());
//对比
return temp.equals(signature);
}
public static String getSha1(String str){
if (null== str || 0 == str.length()){
return null;
}
char[] hexDigits = {'0', '1','2', '3','4', '5','6', '7','8', '9',
'a', 'b', 'c','d', 'e','f'};
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char[] buf =new char[j * 2];
int k = 0;
for (inti = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4& 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
}
MessageUtil类是xml转换为集合以及文本转化为xml的方法(因为微信是xml格式的)
package cn.yang.util;
/**
* Created by jibei on 2017/7/29.
*/
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import com.thoughtworks.xstream.XStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.imooc.dao.TextMessage;
public class MessageUtil {
public static Map<String,String> xmlToMap(HttpServletRequest request)throws IOException, DocumentException {
//将XML转换成集合
Map<String,String> map=newHashMap<String,String>();
SAXReader reader=new SAXReader();
//从reuest中获取输入流
InputStream ins=request.getInputStream();
Document doc=reader.read(ins);
Element root=doc.getRootElement();
List<Element> list=root.elements();
for(Element e:list){
map.put(e.getName(),e.getText());
}
//关闭输入流
ins.close();
return map;
}
public static String textMessageToXml(TextMessage textMessage){
//将文本转换成XML
XStream xstream=newXStream();
//将xml的根节点替换成xml即<xml>jkkkkk</xml>
xstream.alias("xml",textMessage.getClass());
xstream.toXML(textMessage);
return xstream.toXML(textMessage);
}
}
TextMessage是文本对象,包括他的基本属性和方法
package com.imooc.dao;
/**
* Created by jibei on 2017/7/29.
*/
public class TextMessage {
private String ToUserName;
private String FromUserName;
private String CreateTime;
private String MsgType;
private String Content;
private String 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 String getCreateTime() {
return CreateTime;
}
public void setCreateTime(String createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
}
WeiX
package com.imooc.servlet;
import cn.yang.util.CheckUtil;
import cn.yang.util.MessageUtil;
import com.imooc.dao.TextMessage;
import org.dom4j.DocumentException;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class WeiX extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
String signature=req.getParameter("signature");
String timestamp=req.getParameter("timestamp");
String nonce=req.getParameter("nonce");
String echostr=req.getParameter("echostr");
PrintWriter out=resp.getWriter();
if(CheckUtil.checkSignature(signature,timestamp,nonce)){
out.print(echostr);
}
}
protected void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out=resp.getWriter();
try {
Map<String,String> map= MessageUtil.xmlToMap(req);
String fromUserName=map.get("FromUserName");
String toUserName=map.get("ToUserName");
String msgType=map.get("MsgType");
String content=map.get("Content");
String message=null;
//判断这个消息是否为文本消息
if("text".equals(msgType)){
TextMessage text=new TextMessage();
text.setFromUserName(toUserName);
text.setToUserName(fromUserName);
text.setMsgType("text");
SimpleDateFormat df = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
text.setCreateTime(df.format(newDate()) );
text.setContent("您发送的消息是"+content);
message=MessageUtil.textMessageToXml(text);
}
out.print(message);
System.out.println(message);
} catch (DocumentException e) {
e.printStackTrace();
}finally {
out.close();
//关闭
}
}
}
第五步:接口配置
由第一步1.4进入测试号,接口配置信息里,填写(我已经填过了)
配置时要保证你的tomcat是启动的,也就是说你的代码是无编译错误的否则tomcat启动不起来。
如果出现配置失败也就是说微信端无法找到你所给的地址。
第六步 测试
打开你的微信,扫一扫你的测试公众号二维码关注,发送消息,看能否收到回复。
Ok!如此算是入了微信开发的一个小门。
- Java微信开发入门
- Java微信开发入门
- JAVA微信公众号开发入门
- java微信开发入门第一讲
- 微信开发入门
- 微信开发入门
- 微信开发入门
- 微信开发入门
- 微信开发入门
- 微信入门开发
- 微信开发入门
- 微信开发入门
- java微信公众号开发入门(1)--开发准备
- jsp(java)开发微信公众平台入门
- JAVA微信开发之weixin4j入门视频
- java微信公众号开发系列——入门
- JAVA微信开发之weixin4j入门视频
- 微信支付Java开发快速入门&工具类
- AbstractString
- Servlet 生命周期、工作原理
- Oracle增删改查训练
- C++ 多线程并发控制——互斥锁 pthread_mutex
- Highways
- Java微信开发入门
- 使用 Python Mock 类进行单元测试
- FZU 2020 组合(扩展欧几里得)
- [Python]创建,安装和发布共享模块
- 7. Reverse Integer
- 2017.8.4 闻内少转会大巴黎
- CodeForce 837 A/B/C解题报告
- MS顺序与聚类分析算法
- 剑指offer:顺时针打印矩阵