微信开放平台API对接

研究了一下微信公众账号的开放平台的APi

/**
 * 
 * @Description: 微信消息处理以及用户分组 
 * @author zhangjun
 * @date 2014-1-7 上午10:51:51
 */
public class WeiXinMessageAction extends BaseAction{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private IFeWeiXinMessageService weiXinExternalService;
	
	private static final String RESPONSE_TXT = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
	
	private String wxNo;
	
	public String responseMessgaeInfo(){
		Boolean isGet = request.getMethod().equalsIgnoreCase("GET");
		if(isGet){
			validateSignature();
		}else{
			saveWxMessage();
		}
		return null;
	}

	/**
	 * 
	 * @Description: 接收post保存接受的消息 只保存MsgType类型为text信息
	 * @param     
	 * @return void 
	 * @throws
	 */
	private void saveWxMessage(){
		InputStream inputStream;
		try {
			request.setCharacterEncoding("UTF-8");
			Document doc = null;
			SAXReader reader = new SAXReader();
			inputStream = request.getInputStream();
			doc = reader.read(inputStream);
			Element root = doc.getRootElement();
			String toUserName = root.element("ToUserName").getTextTrim();
			String fromUserName = root.element("FromUserName").getTextTrim();
			String content = root.element("Content").getTextTrim();
			String msgType=root.element("MsgType").getTextTrim();
			String msgId=root.element("MsgId").getTextTrim();
			String createTime=root.element("CreateTime").getTextTrim();
			//只保存文本消息
			//时间
			System.out.println("接收消息内容:"+content+"-----------------msgType:"+msgType);
			if(WeiXinMsgType.TEXT.type.equals(msgType)){
				weiXinExternalService.addWxMessage(toUserName, fromUserName, content, msgType, msgId, formatTime(createTime));
				//如果需要回复消息
				PrintWriter out = null;
				out.printf(RESPONSE_TXT, fromUserName, toUserName,
						System.currentTimeMillis(), "text",  "回复内容");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	 * @Description: 传入的CreateTime转换成long类型
	 * @param @param createTime
	 * @param @return    
	 * @return Date 
	 * @throws
	 */
	private   Date formatTime(String createTime) {
		long msgCreateTime = Long.parseLong(createTime) * 1000L;
		return new Date(msgCreateTime);
	}
	
	/**
	 * 
	 * @Description: 校验微信签名
	 * @param     
	 * @return void 
	 * @throws
	 */
	private void validateSignature(){
		PrintWriter out = null;
		try {
			String signature = request.getParameter("signature");
			String timestamp = request.getParameter("timestamp");
			String nonce = request.getParameter("nonce");
			out = response.getWriter();
			if (checkSignature(signature, timestamp, nonce)) {
				out.print(request.getParameter("echostr"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			out.close();
			out = null;
		}
	}
	
	/**
	 * 
	 * @Description: 判断token是否合法
	 * @param @param signature
	 * @param @param timestamp
	 * @param @param nonce
	 * @param @return    
	 * @return boolean 
	 * @throws
	 */
	private  boolean checkSignature(String signature, String timestamp, String nonce) {
			//根据微信账号获取token并校验
			Map<String,Object> map=new HashMap<String,Object>();
			map.put("wxNo", wxNo);
			WeiXinMasterConfig  masterConfig= weiXinExternalService.selectWeiXinMasterConfig(map);
			if(masterConfig==null){
				return false;
			}
			String[] arr = new String[] {masterConfig.getWxToken(), timestamp, nonce };
			Arrays.sort(arr);
			StringBuilder content = new StringBuilder();
			for (int i = 0; i < arr.length; i++) {
				content.append(arr[i]);
			}
			MessageDigest md = null;
			String tmpStr = null;
			try {
				md = MessageDigest.getInstance("SHA-1");
				byte[] digest = md.digest(content.toString().getBytes());
				tmpStr = byteToStr(digest);
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			}
			content = null;
			return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
	}

	// 将字节转换为十六进制字符串
	private static String byteToHexStr(byte ib) {
		char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
				'B', 'C', 'D', 'E', 'F' };
		char[] ob = new char[2];
		ob[0] = Digit[(ib >>> 4) & 0X0F];
		ob[1] = Digit[ib & 0X0F];
		String s = new String(ob);
		return s;
	}

	// 将字节数组转换为十六进制字符串
	private static String byteToStr(byte[] bytearray) {
		String strDigest = "";
		for (int i = 0; i < bytearray.length; i++) {
			strDigest += byteToHexStr(bytearray[i]);
		}
		return strDigest;
	}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在你的App中对接微信开放平台实现微信登录,你可以按照以下步骤进行操作: 1. 在微信开放平台注册一个应用: - 访问微信开放平台(https://open.weixin.qq.com/),使用微信公众平台账号登录。 - 进入开放平台管理中心,在应用管理中创建一个新的移动应用。 - 在创建应用时,填写应用的基本信息,并获取到对应的AppID和AppSecret。 2. 在你的App中集成微信登录SDK: - 根据你的App开发语言和框架,选择合适的微信登录SDK。 - 集成SDK到你的App中,并按照SDK提供的文档和示例代码进行配置和调用。 3. 实现微信登录功能: - 在你的App中,提供一个“使用微信登录”的入口,例如按钮或链接。 - 当用户点击该入口时,调用微信登录SDK提供的方法,发起微信登录请求。 - 微信登录SDK将会打开微信客户端或内嵌浏览器,用户需要在其中输入微信账号和密码进行授权。 - 授权成功后,微信客户端或内嵌浏览器将会跳转回你的App,并传递授权凭证(例如access token)。 4. 在服务器端验证和处理授权凭证: - 在你的服务器端,根据微信登录SDK提供的文档和示例代码,对接微信开放平台API,验证和处理授权凭证。 - 使用授权凭证调用微信开放平台API,获取用户的基本信息和其他需要的数据。 - 在服务器端进行必要的逻辑处理,例如创建用户账号、生成会话等。 以上是一个大致的流程,实际操作中可能会有一些细节和特殊情况需要考虑。建议参考微信开放平台提供的文档和SDK的具体使用说明,以及根据你使用的开发语言和框架进行相应的调整和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值