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);
}
}
}
最后点击提交按钮即可。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号