在我们开发微信公众号的时候,有的时候需要本地测试,这个时候就需要本地内网穿透。下面将描述如何来完成本地内网穿透以及完成微信公众号的开发。
一:完成内网穿透。
(1):在ngrok的网站里注册个用户,并且在Auth中记住授权码,如下图。下载windows版本的ngrok(地址是:https://ngrok.com/download 找里面的window版本)
(2):解压压缩包,点击ngrok.exe.出现dos窗口。
第一步,在dos里输入:ngrok -authtoken 授权码 80
第二步,在dos中赋权:ngrok http 8080
通过上面两步,就完成了内网穿透。
参考:https://www.cnblogs.com/fengzheng/p/5023678.html
二:开发微信公众号调试接口;
(1):完成基本的server服务。也就是完成基本框架,可以查到页面。接下来写Weixin的校验CheckUtil.java.代码如下:
import java.security.MessageDigest;
import java.util.Arrays;
public class CheckUtil {
public static final String tooken = "zhm123456"; // 开发者自行定义Tooken
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;
}
}
}
(2):写微信的校验controller.代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
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.practice.util.CheckUtil;
@Controller
public class WeixinController {
@RequestMapping(value = "wx",method=RequestMethod.GET)
public void login(HttpServletRequest request,HttpServletResponse response) throws IOException{
System.out.println("success");
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
System.err.println(signature+","+timestamp+","+nonce+","+echostr);
PrintWriter out = response.getWriter();
if(CheckUtil.checkSignature(signature, timestamp, nonce)){
//如果校验成功,将得到的随机字符串原路返回
out.print(echostr);
}
}
}
接下来就是在微信公众号里调试了。
参考如下:https://www.cnblogs.com/jerehedu/p/6377759.html