本题主要从技术实现来讲讲微信开发。

    微信开发之前,必须先申请微信订阅号/服务号/企业号,不管哪种类型都是微信针对不同专业,领域做的区分,在某些功能上有所限制。

    一般在开发之前,都是开发模式,所以在获得了微信号之后,先申请微信测试号进行测试。

    第一步:进入公众平台,在左侧菜单栏找到 开发 -- 开发者工具 在右侧选择 公众平台测试帐号 进入

    第二步:在 测试号信息 可以看到 appID  和 appsecret 此为后续接口开发重要账号与密钥。

    第三步:在 接口配置信息 中,填写以后需要对接微信入口校验以及接收消息接口的url访问地址以及校验参数token。

    第四步: 设完配置信息以后,需要在服务器建立一个应用,并对外暴露一个网址即在第三步中填写的访问地址。本人对外的地址为 http://xxx.com/wx/index

    主要用于微信服务器校验,接收微信消息通知。

    校验主要参数四个: 

    signature,timestamp,nonce,echostr
    微信消息通知则是需要通过流的接收方式,代码如下


     

    public class XMLUtil {
    	
    	public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
    		Map<String, String> map = new HashMap<String, String>();
    		InputStream inputStream = request.getInputStream();
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(inputStream);
    		Element root = document.getRootElement();
    		List<Element> elementList = root.elements();
    		for (Element e : elementList)
    			map.put(e.getName(), e.getTextTrim());
    		inputStream.close();
    		inputStream = null;
    		return map;
    	}

     下面为完整的具体接口关键代码:

    /**
     * 
     * 类名称:WeixinController.java 类描述: 微信公共平台开发
     * 
     * @author wyong 
     *  联系方式:343886028
     *  创建时间:2016年1月10日
     * @version 1.0
     */
    @Controller
    @RequestMapping("/wx")
    public class WeixinController extends BaseAction {
    	Logger logger = Logger.getLogger(getClass());
    
    	
    	@Autowired
    	MsgService msgService;
    	/**
    	 * 微信接口总入口
    	 * @param out
    	 * @param request
    	 * @param response
    	 * @throws Exception
    	 */
    	@RequestMapping(value = "/index")
    	public void index(@RequestParam(value = "signature", defaultValue = "") String signature, @RequestParam(value = "timestamp", defaultValue = "") String timestamp,
    			@RequestParam(value = "nonce", defaultValue = "") String nonce, @RequestParam(value = "echostr", defaultValue = "") String echostr, HttpServletRequest request,
    			HttpServletResponse response) throws Exception {
    
    			if (logger.isInfoEnabled()) {
    				logger.info("signature=" + signature + "|timestamp=" + timestamp + "|nonce=" + nonce + "|echostr=" + echostr);
    			}
    			 
    			PrintWriter out = response.getWriter();
    			if (StringUtils.isNotBlank(signature) && StringUtils.isNotBlank(timestamp) &&StringUtils.isNotBlank(nonce)&& StringUtils.isNotBlank(echostr)) {/* 接口验证 */
    				logger.info("========进入身份验证");
    				List<String> list = new ArrayList<String>(3) {
    					private static final long serialVersionUID = 2621444383666420433L;
    					
    					public String toString() { // 重写toString方法,得到三个参数的拼接字符串
    						return this.get(0) + this.get(1) + this.get(2);
    					}
    				};
    				list.add(PropertiesUtil.getValue("wx.WEIXIN")); // 读取Token(令牌)
    				list.add(timestamp);
    				list.add(nonce);
    				Collections.sort(list); // 排序
    				String tmpStr = new MySecurity().encode(list.toString(), MySecurity.SHA_1); // SHA-1加密
    				if (signature.equals(tmpStr)) {
    					out.write(echostr); // 请求验证成功,返回随机码
    				} else {
    					out.write("");
    				}
    				out.flush();
    				out.close();
    			} else {/* 消息处理 */
    				System.out.println("========进入消息处理");
    				Map<String, String> requestMap = XMLUtil.parseXml(request);
    				log.error("====="+JSON.toJSON(requestMap));
    				//事件推送,是否是发送消息后的事件推送。
    				if(requestMap!=null && requestMap.get("MsgType")!=null && "event".equalsIgnoreCase(requestMap.get("MsgType"))){
    					String msgid  = requestMap.get("MsgID");
    					if(StringUtils.isNotBlank(msgid)){
    						TMemNotify notify = msgService.findNotify(msgid);
    						if(notify!=null){
    							notify.setUpdatetime(new Date());
    							notify.setReturnmsg(requestMap.get("Status"));
    							msgService.updateObj(notify);
    						}
    					}
    				}
    				response.reset();
    				log.error(JSON.toJSON(requestMap));
    			}
    	}

     

       

     

    联系QQ:343886028 --加QQ群 145315854