java开发微信公众号----开发者基本配置的

首先附上微信公众平台开发技术文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5

本文主要描述文档中1.4部分的开发者的接入部分,省略掉了之前的申请公众号步骤。

准备工作:

1.必须要有一个可以外网访问的地址(个人建议:1.内网传统,如natapp,本人所用的就是natapp  2.买一个云服务器,百度腾讯等都有)

2.端口号必须设置为80

补充:

本人搭建的是 ssm 框架,IDE为 idea

附上开发配置页面:

流程:

微信公众平台会访问用户输入的URL,并传递四个参数,signature, timestamp, nonce,echostr,我们在方法里接收到这四个参数后,通过 Token(网页上基本配置里自己输入的Token),timestamp 和 nonce 排序后拼接成一个字符串,用SHA1加密返回一个新的字符串,用这个字符串与signature比较是否相同,相同则说明是此次请求来自微信公众平台,返回echostr回去,否则返回一个空字符串即可;

实现:

  

@RequestMapping("/wx")
@Controller
public class WeChatController {

   // 开发配置里自己填写的Token值
private final String TOKEN = "***********************";

/**
* 1.NeedLogin是自定义的注解,用来拦截未登录的用户,微信公众号开发,不需要登陆拦截,自己开发的时候可以不配置拦截
* 2.文档说明请求方法为GET请求
* @param request
* @return
*/
@NeedLogin(false)
@RequestMapping(value = "/view.json", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
@ResponseBody
public String view(HttpServletRequest request){
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
if (checkSignature(signature, timestamp, nonce)){
return echostr;
}
return "";
}

private boolean checkSignature(String signature, String timestamp, String nonce){
String [] arr = {TOKEN, timestamp, nonce};
Arrays.sort(arr);
StringBuffer sbf = new StringBuffer();
for (String str : arr){
sbf.append(str);
}
String getSignature = Sha1Util.encode(sbf.toString());
return signature.equals(getSignature);
}
}

SHA1加密的util类网上有很多,本人也是从网上找的一个,代码如下:
import java.security.MessageDigest;

public class Sha1Util {
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
// 把密文转换成十六进制的字符串形式
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}

public static String encode(String str) {
if (str == null) {
return null;
}
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
messageDigest.update(str.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

最后点击提交按钮即可。

猜你喜欢

转载自www.cnblogs.com/ilovegenius/p/9561179.html