微信公众平台企业号回调模式的URL验证--jdk6、jdk7加密问题

来源:互联网 发布:小学生拼音软件下载 编辑:程序博客网 时间:2024/05/30 12:03
    private static final long serialVersionUID = 4440739483644821986L;
    String sToken = "5XaQ8cG6x2pULd";//这个Token是随机生成,但是必须跟企业号上的相同
    String sCorpID = "wx4edd47d3a6r4r991";//这里是你企业号的CorpID
    String sEncodingAESKey = "jWmYm7qjusnxu65ZRjGtBxmz3KA1tkAj3ykkR6q2B2C";//这个EncodingAESKey是随机生成,但是必须跟企业号上的相同
    /**
     * 确认请求来自微信服务器
     * @throws IOException 
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
         
        // 微信加密签名 
        String sVerifyMsgSig = request.getParameter("msg_signature");
        // 时间戳
        String sVerifyTimeStamp = request.getParameter("timestamp");
        // 随机数
        String sVerifyNonce = request.getParameter("nonce");
        // 随机字符串
        String sVerifyEchoStr = request.getParameter("echostr");
        String sEchoStr; //需要返回的明文
        PrintWriter out = response.getWriter();  
        WXBizMsgCrypt wxcpt;
        try {
            wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
            sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,sVerifyNonce, sVerifyEchoStr);
            // 验证URL成功,将sEchoStr返回
            out.print(sEchoStr);  
        catch (AesException e1) {
            e1.printStackTrace();
        }
    }
    
    关于上面接入代码不过多讲解,只说我碰到的问题
    我本机是jdk1.6.0_23  ,下载JCEPolicyJDK6,,百度中搜索"UnlimitedJCEPolicyJDK6"这个进行下载,覆盖到\lib\security中,
       还有官方提供的代码报错部分解决办法(WXBizMsgCrypt.java,PKCS7Encoder.java):
        把Arrays.copyOfRange()方法,替换成下面的方法
       public static byte[] copyOfRange(byte[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        byte[] copy = new byte[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }
     static String CHARSET = "utf-8";
     static byte[] encode(int count) {
byte[] b = null;
try{
// 计算需要填充的位数
int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
if (amountToPad == 0) {
amountToPad = BLOCK_SIZE;
}
// 获得补位所用的字符
char padChr = chr(amountToPad);
String tmp = new String();
for (int index = 0; index < amountToPad; index++) {
tmp += padChr;
}
b = tmp.getBytes(CHARSET);
}catch(Exception e){
e.printStackTrace();
}
return b;
}
剩下就搞定了



 
0 0
原创粉丝点击