公众号类型:
企业号,服务号,订阅号
微信公众号申请:
进入微信公众平台https://mp.weixin.qq.com ,点击右上角立即注册,选择“服务号”或“订阅号”注册(服务号仅限机构用户注册,个人用户只能选择订阅号)
开发人员也可以不用申请微信公众号也可以测试,测试账号申请请地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 点击后扫描二维码,即可获得一个测试账号,拥有服务号全部权限。
微信扫码下面的即可即可在微信上测试
开发环境准备
1、 外网映射工具
微信公众平台在访问后台时,必须提供能够正确访问的外网地址,微信平台对后台URL的要求有两点:
① 必须能够用公网访问 ② 必须使用80端口
要实现以上两点,我们可以选择购买外网服务器,例如:阿里云、百度云、腾讯云…都是不错的选择。如果没有服务器,可以选择用外网映射工具,将我们的内网链接映射为公网,比较不错的映射软件有:花生壳、ngrok、nat123等…
ngrok下载:https://ngrok.com/download
这几款软件都可以百度很容易搜索到并下载,下面简单讲解一下用法:
① Ngrock:
进入dos环境,切换到ngrock所在盘符,输入ngrock 8080(ngrok 2.0以上版本,ngrok http 8080) 回车:
回车后等待一会,即可得到公网链接,下图所示阴影区域给出的链接,即可直接访问本机127.0.0.1:8080下的链接内容,分别是http协议和https协议对应的地址:
此时此刻,我们后台的代码已经可以放到共网地址上了,那那么微信号开发的数据交互是怎么样的
实际开发过程,我们可以参考官方提供的开发文档:
https://mp.weixin.qq.com/wiki
web.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>bb</servlet-name>
<servlet-class>yiche.com.servlet.WeiXinServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>bb</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Servlet:
public class WeiXinServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getMethod().toString());
while (request.getAttributeNames().hasMoreElements()){
System.out.println("1");
request.getAttributeNames().nextElement();
}
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串 由于我使用的是申请的测试账号,并没有随机字符串随意这里的ech是null
String ech = request.getParameter("echostr");
PrintWriter out = response.getWriter();
if (CheckUtil.checkSignature(signature,timestamp,nonce))
System.out.println("校验成功");
out.print(ech);
}
}
此时填写url和token
URL:即我们上述所说的后台服务器公网访问地址
Token:开发者自定的验证口令
EncodingAESKey:随机字符串,如果消息加解密方式采用安全模式才需验证,
我这里的测试账号没有所以传入Servlet的echostr为null
当点击提交的时候会想Servlet发送一个get请求,而后在微信接口测试上都是post请求如下的方法都是发送的post请求
Servlet接受的参数
结果
加密方法:
public class CheckUtil {
public static final String tooken = "jkjkjkhk"; //开发者自行定义Tooken
//signatrue微信公众平台传过来的的经过加密的签名
public static boolean checkSignature(String signature, String timestamp, String nonce) {
//1.定义数组存放tooken,timestamp,nonce
String[] arr = {tooken, timestamp, nonce};
//2.对数组进行排序
Arrays.sort(arr);
//3.生成字符串
StringBuffer sb = new StringBuffer();
for (String s : arr) {
sb.append(s);
}
//4.sha1加密,网上均有现成代码
String temp = getSha1(sb.toString());
//5.将加密后的字符串,与微信传来的加密签名比较,返回结果
return temp.equals(signature);
}
public static String getSha1(String str){
if(str==null||str.length()==0){
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 (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
// TODO: handle exception
return null;
}
}
}