利用微信接口返回图片消息给用户

转自:http://www.liutime.com/javainfo/1432/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Date;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller("WeiXinAction")
@Scope("prototype")
public class wWeiXinAction {

    /**
     * 
     */
    private static final long serialVersionUID = 756754074696664021L;
    //自定义的TOken 
    public static final String Token = "liutimeweixintoken";


    /**
     * Convenience method to get the request
     *
     * @return current request
     */
    protected HttpServletRequest getRequest() {
        return ServletActionContext.getRequest();
    }

    /**
     * Convenience method to get the response
     *
     * @return current response
     */
    protected HttpServletResponse getResponse() {
        return ServletActionContext.getResponse();
    }


    /**
     *  Function:微信服务
     *  @author JLC
     *  @return
     */
    public String weixinService(){
        try{    
             //微信加密签名
              String signature = getRequest().getParameter("signature");
              //时间戳
              String timestamp = getRequest().getParameter("timestamp");
              //随机数
              String nonce = getRequest().getParameter("nonce");
              //随机字符串
              String echostr = getRequest().getParameter("echostr");
            if (StringUtils.isNotEmpty(echostr)) {
                echostr = checkAuthentication(signature,timestamp,nonce,echostr); 
                //验证通过返回随即字串
                getResponse().getWriter().write(echostr);
                getResponse().getWriter().flush();  
            }else{
                String postStr = readStreamParameter(getRequest().getInputStream()) ;
                 if (null!=postStr&&!postStr.isEmpty()){  
                        Document document=null;  
                        try{  
                            document = DocumentHelper.parseText(postStr);  
                        }catch(Exception e){  
                            e.printStackTrace();  
                        }  
                        if(null==document){  
                            getResponse().getWriter().write("nothing");
                            return null;  
                        }  
                        Element root=document.getRootElement();  
                        String fromUsername = root.elementText("FromUserName");  //取得发送者
                        String toUsername = root.elementText("ToUserName");  //取得接收者
                        String userMsgType  = root.elementText("MsgType");
                        String userMsgEvent = root.elementText("Event");
                        String keyword =new String(root.elementTextTrim("Content").getBytes(), "UTF-8");   
                        String time = new Date().getTime()+"";  
                        String textTpl = "<xml>"+  
                                    "<ToUserName><![CDATA[%1$s]]></ToUserName>"+  
                                    "<FromUserName><![CDATA[%2$s]]></FromUserName>"+  
                                    "<CreateTime>%3$s</CreateTime>"+  
                                    "<MsgType><![CDATA[%4$s]]></MsgType>"+  
                                    "<Content><![CDATA[%5$s]]></Content>"+  
                                    "<FuncFlag>0</FuncFlag>"+  
                                    "</xml>";    
                        String msgType = "text";  
                        //当回复内容为 深圳文字 的指令时
                        if(null!=keyword&&keyword.equals("深圳文字"))  {  
                          String contentStr = "欢迎来到微信公众平台!";  
                          String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);  
                          getResponse().getWriter().write(resultStr);
                        }else  if(null!=keyword&&keyword.equals("深圳图片"))  { 
                            textTpl = "<xml>"+  
                            "<ToUserName><![CDATA[%1$s]]></ToUserName>"+  
                            "<FromUserName><![CDATA[%2$s]]></FromUserName>"+  
                            "<CreateTime>%3$s</CreateTime>"+  
                            "<MsgType><![CDATA[news]]></MsgType>"+  
                            "<ArticleCount>2</ArticleCount>"+ 
                            "<Articles>"+
                             "<item>"+
                             "<Title><![CDATA[title1]]></Title> "+
                             "<Description><![CDATA[图片一logo]]></Description>"+
                             "<PicUrl><![CDATA[http://www.**.com/images/logo.png]]></PicUrl>"+
                             "<Url><![CDATA[url]]></Url>"+
                             "</item>"+
                             "<item>"+
                             "<Title><![CDATA[title]]></Title>"+
                             "<Description><![CDATA[description]]></Description>"+
                             "<PicUrl><![CDATA[图片二]]></PicUrl>"+
                             "<Url><![CDATA[http://www.**.com/images/111.jpg]]></Url>"+
                             "</item>"+
                             "</Articles>"+
                            "<FuncFlag>1</FuncFlag>"+  
                            "</xml>";    
                             String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time);  
                            getResponse().getWriter().write(resultStr);
                        }else if(null!=keyword&&keyword.equals("Hello2BizUser")){
                            // 这是新用户关注时默认发的一条信息。可以做一个欢迎处理。  4.5之前版本
                            String contentStr = "欢迎来到微信公众平台!";  
                              String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);  
                              getResponse().getWriter().write(resultStr);

                        }else{
                          String contentStr = "欢迎来到微信公众平台!";  
                          String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);  
                          getResponse().getWriter().write(resultStr);
                        }
                }else {  
                   getResponse().getWriter().write("test");
                 }  
            }
        }catch(Exception e){
        }
        return null;
    }

     //从输入流读取post参数  
    public String readStreamParameter(ServletInputStream in){  
        StringBuilder buffer = new StringBuilder();  
        BufferedReader reader=null;  
        try{  
            reader = new BufferedReader(new InputStreamReader(in));  
            String line=null;  
            while((line = reader.readLine())!=null){  
                buffer.append(line);  
            }  
        }catch(Exception e){  
            e.printStackTrace();  
        }finally{  
            if(null!=reader){  
                try {  
                    reader.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
        return buffer.toString();  
    } 

    /**
     *  Function:微信验证方法
     *  @author JLC
     *  @param signature 微信加密签名
     *  @param timestamp 时间戳
     *  @param nonce     随机数
     *  @param echostr   随机字符串
     *  @return
     */
    private String  checkAuthentication(String signature,String timestamp,String nonce,String echostr) {
        String result ="";
        // 将获取到的参数放入数组
        String[] ArrTmp = { Token, timestamp, nonce };
        // 按微信提供的方法,对数据内容进行排序
        Arrays.sort(ArrTmp);
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < ArrTmp.length; i++) {
            sb.append(ArrTmp[i]);
        }
        // 对排序后的字符串进行SHA-1加密
        String pwd = Encrypt(sb.toString());
        if (pwd.equals(signature)) { 
            try {
                System.out.println("微信平台签名消息验证成功!"); 
                result = echostr;
            } catch (Exception e) {
                e.printStackTrace();
            } 
        } else {
            System.out.println("微信平台签名消息验证失败!");
        }
        return result;
    }

    /**
     * 用SHA-1算法加密字符串并返回16进制串
     * 
     * @param strSrc
     * @return
     */
    private String Encrypt(String strSrc) {
        MessageDigest md = null;
        String strDes = null;
        byte[] bt = strSrc.getBytes();
        try {
            md = MessageDigest.getInstance("SHA-1");
            md.update(bt);
            strDes = bytes2Hex(md.digest());
        } catch (NoSuchAlgorithmException e) {
            System.out.println("错误");
            return null;
        }
        return strDes;
    }

    private String bytes2Hex(byte[] bts) {
        String des = "";
        String tmp = null;
        for (int i = 0; i < bts.length; i++) {
            tmp = (Integer.toHexString(bts[i] & 0xFF));
            if (tmp.length() == 1) {
                des += "0";
            }
            des += tmp;
        }
        return des;
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值