Java微信公众平台开发(6) 微信开发中的token获取

(一)token的介绍

引用:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效!

(二)token的获取参考文档

获取的流程我们完全可以参考微信官方文档:http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html 如图:

(三)token获取流程分析

从公众平台获取账号的AppID和AppSecret;
token获取并解析存储执行体;
采用任务调度每隔两小时执行一次token获取执行体;

(四)token的获取流程的具体实现
①获取appid和appsecret

在微信公众平台【开发】——>【基本配置】中可以查看到我们需要的两个参数:

这里我们将他们定义到我们的配置文件【wechat.properties】中,大致代码为:

#获取到的appid
appid=wx7e32765bc24XXXX
#获取到的AppSecret
AppSecret=d58051564fe9d86093f9XXXXX

②token获取并解析存储执行体的代码编写

由于在这里我们需要通过http的get请求向微信服务器获取时效性为7200秒的token,所以我在这里写了一个http请求的工具类,以方便我们的使用,如下:

package com.cuiyongzhi.wechat.util;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.GZIPInputStream;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

/**
 * ClassName: HttpUtils
 *
 * @Description: http请求工具类
 * @author dapengniao
 * @date 2016年3月10日 下午3:57:14
 */
@SuppressWarnings("deprecation")
public class HttpUtils {

 /**
  * @Description: http get请求共用方法
  * @param @param reqUrl
  * @param @param params
  * @param @return
  * @param @throws Exception
  * @author dapengniao
  * @date 2016年3月10日 下午3:57:39
  */
 @SuppressWarnings("resource")
 public static String sendGet(String reqUrl, Map<String, String> params)
   throws Exception {
  InputStream inputStream = null;
  HttpGet request = new HttpGet();
  try {
   String url = buildUrl(reqUrl, params);
   HttpClient client = new DefaultHttpClient();

   request.setHeader("Accept-Encoding", "gzip");
   request.setURI(new URI(url));

   HttpResponse response = client.execute(request);

   inputStream = response.getEntity().getContent();
   String result = getJsonStringFromGZIP(inputStream);
   return result;
  } finally {
   if (inputStream != null) {
    inputStream.close();
   }
   request.releaseConnection();
  }

 }

 /**
  * @Description: http post请求共用方法
  * @param @param reqUrl
  * @param @param params
  * @param @return
  * @param @throws Exception
  * @author dapengniao
  * @date 2016年3月10日 下午3:57:53
  */
 @SuppressWarnings("resource")
 public static String sendPost(String reqUrl, Map<String, String> params)
   throws Exception {
  try {
   Set<String> set = params.keySet();
   List<NameValuePair> list = new ArrayList<NameValuePair>();
   for (String key : set) {
    list.add(new BasicNameValuePair(key, params.get(key)));
   }
   if (list.size() > 0) {
    try {
     HttpClient client = new DefaultHttpClient();
     HttpPost request = new HttpPost(reqUrl);

     request.setHeader("Accept-Encoding", "gzip");
     request.setEntity(new UrlEncodedFormEntity(list, HTTP.UTF_8));

     HttpResponse response = client.execute(request);

     InputStream inputStream = response.getEntity().getContent();
     try {
      String result = getJsonStringFromGZIP(inputStream);

      return result;
     } finally {
      inputStream.close();
     }
    } catch (Exception ex) {
     ex.printStackTrace();
     throw new Exception("网络连接失败,请连接网络后再试");
    }
   } else {
    throw new Exception("参数不全,请稍后重试");
   }
  } catch (Exception ex) {
   ex.printStackTrace();
   throw new Exception("发送未知异常");
  }
 }

 /**
  * @Description: http post请求json数据
  * @param @param urls
  * @param @param params
  * @param @return
  * @param @throws ClientProtocolException
  * @param @throws IOException
  * @author dapengniao
  * @date 2016年3月10日 下午3:58:15
  */
 public static String sendPostBuffer(String urls, String params)
   throws ClientProtocolException, IOException {
  HttpPost request = new HttpPost(urls);

  StringEntity se = new StringEntity(params, HTTP.UTF_8);
  request.setEntity(se);
  // 发送请求
  @SuppressWarnings("resource")
  HttpResponse httpResponse = new DefaultHttpClient().execute(request);
  // 得到应答的字符串,这也是一个 JSON 格式保存的数据
  String retSrc = EntityUtils.toString(httpResponse.getEntity());
  request.releaseConnection();
  return retSrc;

 }

 /**
  * @Description: http请求发送xml内容
  * @param @param urlStr
  * @param @param xmlInfo
  * @param @return
  * @author dapengniao
  * @date 2016年3月10日 下午3:58:32
  */
 public static String sendXmlPost(String urlStr, String xmlInfo) {
  // xmlInfo xml具体字符串

  try {
   URL url = new URL(urlStr);
   URLConnection con = url.openConnection();
   con.setDoOutput(true);
   con.setRequestProperty("Pragma:", "no-cache");
   con.setRequestProperty("Cache-Control", "no-cache");
   con.setRequestProperty("Content-Type", "text/xml");
   OutputStreamWriter out = new OutputStreamWriter(
     con.getOutputStream());
   out.write(new String(xmlInfo.getBytes("utf-8")));
   out.flush();
   out.close();
   BufferedReader br = new BufferedReader(new InputStreamReader(
     con.getInputStream()));
   String lines = "";
   for (String line = br.readLine(); line != null; line = br
     .readLine()) {
    lines = lines + line;
   }
   return lines; // 返回请求结果
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return "fail";
 }

 private static String getJsonStringFromGZIP(InputStream is) {
  String jsonString = null;
  try {
   BufferedInputStream bis = new BufferedInputStream(is);
   bis.mark(2);
   // 取前两个字节
   byte[] header = new byte[2];
   int result = bis.read(header);
   // reset输入流到开始位置
   bis.reset();
   // 判断是否是GZIP格式
   int headerData = getShort(header);
   // Gzip 流 的前两个字节是 0x1f8b
   if (result != -1 && headerData == 0x1f8b) {
    // LogUtil.i("HttpTask", " use GZIPInputStream ");
    is = new GZIPInputStream(bis);
   } else {
    // LogUtil.d("HttpTask", " not use GZIPInputStream");
    is = bis;
   }
   InputStreamReader reader = new InputStreamReader(is, "utf-8");
   char[] data = new char[100];
   int readSize;
   StringBuffer sb = new StringBuffer();
   while ((readSize = reader.read(data)) > 0) {
    sb.append(data, 0, readSize);
   }
   jsonString = sb.toString();
   bis.close();
   reader.close();
  } catch (Exception e) {
   e.printStackTrace();
  }

  return jsonString;
 }

 private static int getShort(byte[] data) {
  return (data[0] << 8) | data[1] & 0xFF;
 }

 /**
  * 构建get方式的url
  *
  * @param reqUrl
  *   基础的url地址
  * @param params
  *   查询参数
  * @return 构建好的url
  */
 public static String buildUrl(String reqUrl, Map<String, String> params) {
  StringBuilder query = new StringBuilder();
  Set<String> set = params.keySet();
  for (String key : set) {
   query.append(String.format("%s=%s&", key, params.get(key)));
  }
  return reqUrl + "?" + query.toString();
 }

}

我们在做http请求的时候需要目标服务器的url,这里在项目中为了方便对url的管理我们在资源目录下建立了interface_url.properties用于存放目标url,这里我们将请求token的url存入:

#获取token的url
tokenUrl=https://api.weixin.qq.com/cgi-bin/token

我们需要将我们配置的配置文件在项目初始化后能得到启动,所以我在这里加入一个项目初始化的代码实现,用于项目启动初始化interface_url.properties和wechat.properties中的配置:

package com.cuiyongzhi.web.start;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

/**
 * ClassName: InterfaceUrlIntiServlet
 * @Description: 项目启动初始化servlet
 * @author dapengniao
 * @date 2016年3月10日 下午4:08:43
 */
public class InterfaceUrlIntiServlet extends HttpServlet {

 private static final long serialVersionUID = 1L;

 @Override
 public void init(ServletConfig config) throws ServletException {
  InterfaceUrlInti.init();
 }

}

初始化的具体实现,将初始化过后的方法都存入到GlobalConstants中方便项目中随意调用,如下:

package com.cuiyongzhi.web.start;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import com.cuiyongzhi.web.util.GlobalConstants;

/**
 * ClassName: InterfaceUrlInti
 * @Description: 项目启动初始化方法
 * @author dapengniao
 * @date 2016年3月10日 下午4:08:21
 */
public class InterfaceUrlInti {

 public synchronized static void init(){
  ClassLoader cl = Thread.currentThread().getContextClassLoader();
  Properties props = new Properties();
  if(GlobalConstants.interfaceUrlProperties==null){
   GlobalConstants.interfaceUrlProperties = new Properties();
  }
  InputStream in = null;
  try {
   in = cl.getResourceAsStream("interface_url.properties");
   props.load(in);
   for(Object key : props.keySet()){
    GlobalConstants.interfaceUrlProperties.put(key, props.get(key));
   }

   props = new Properties();
   in = cl.getResourceAsStream("wechat.properties");
   props.load(in);
   for(Object key : props.keySet()){
    GlobalConstants.interfaceUrlProperties.put(key, props.get(key));
   }

  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   if(in!=null){
    try {
     in.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  return;
 }

}

当我们把所有的准备工作都做好了之后我们可以开始真正的去获取token了,这里我们将获取到的token解析之后依然存储到GlobalConstants中方便使用,简单代码如下:

package com.cuiyongzhi.wechat.common;

import java.util.HashMap;
import java.util.Map;

import net.sf.json.JSONObject;

import com.cuiyongzhi.web.util.GlobalConstants;
import com.cuiyongzhi.wechat.util.HttpUtils;

/**
 * ClassName: WeChatTask
 * @Description: 微信两小时定时任务体
 * @author dapengniao
 * @date 2016年3月10日 下午1:42:29
 */
public class WeChatTask {
 /**
  * @Description: 任务执行体
  * @param @throws Exception
  * @author dapengniao
  * @date 2016年3月10日 下午2:04:37
  */
 public void getToken_getTicket() throws Exception {
  Map<String, String> params = new HashMap<String, String>();
  params.put("grant_type", "client_credential");
  params.put("appid", GlobalConstants.getInterfaceUrl("appid"));
  params.put("secret", GlobalConstants.getInterfaceUrl("AppSecret"));
  String jstoken = HttpUtils.sendGet(
    GlobalConstants.getInterfaceUrl("tokenUrl"), params);
  String access_token = JSONObject.fromObject(jstoken).getString(
    "access_token"); // 获取到token并赋值保存
  GlobalConstants.interfaceUrlProperties.put("access_token", access_token);
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"token为=============================="+access_token);
 }

}

(三)采用任务调度每隔两小时执行一次token获取执行体

我们阅读过微信的文档会发现我们的token获取的接口每天是有调用次数限制的,为了防止我们业务量比较大的情况下token的直接调用的接口次数不够用,所以我们需要根据token的时效性(7200s)在自己的业务服务器上做到token的缓存并定时获取,我这里用到的任务调度的方式是采用quartz,有关quartz的使用可以参考文章 http://cuiyongzhi.com/?tags=%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1 ,下面具体代码的实现:

package com.cuiyongzhi.wechat.quartz;

import org.apache.log4j.Logger;

import com.cuiyongzhi.wechat.common.WeChatTask;

public class QuartzJob{
  private static Logger logger = Logger.getLogger(QuartzJob.class);
  /**
   * @Description: 任务执行获取token
   * @param
   * @author dapengniao
   * @date 2016年3月10日 下午4:34:26
   */
  public void workForToken() {
    try {
      WeChatTask timer = new WeChatTask();
      timer.getToken_getTicket();
    } catch (Exception e) {
      logger.error(e, e);
    }
  }

}

这里新建配置文件spring-quartz.xml以方便quartz任务的管理和启用,这里将我们需要用到的workForToken()加入到执行任务中:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
 <!-- 要调用的工作类 -->
 <bean id="quartzJob" class="com.cuiyongzhi.wechat.quartz.QuartzJob"></bean>

 <!-- 定义调用对象和调用对象的方法 -->
 <bean id="jobtaskForToken"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <!-- 调用的类 -->
  <property name="targetObject">
   <ref bean="quartzJob" />
  </property>
  <!-- 调用类中的方法 -->
  <property name="targetMethod">
   <value>workForToken</value>
  </property>

 </bean>
 <!-- 定义触发时间 -->
 <bean id="doTimeForToken" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail">
   <ref bean="jobtaskForToken" />
  </property>
  <!-- cron表达式 -->
  <property name="cronExpression">
   <value>0 0/1 * * * ?</value>
  </property>
 </bean>

 <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
 <bean id="startQuertz" lazy-init="false" autowire="no"
  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
   <list>
    <ref bean="doTimeForToken" />
   </list>
  </property>
 </bean>

</beans>

这里我为了测试将执行间隔时间设置成了1分钟一次,根据需要可以自行修改执行时间;最后我们需要在我们的web.xml启动项中开启quartz的使用:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring.xml,classpath:spring-mybatis.xml,classpath:spring-quartz.xml</param-value>
  <!-- ,classpath:spring-quartz.xml 用于做任务调度 任务定时都可以 -->
 </context-param>

当这一切都准备完毕之后我们启动项目,会发现每间隔一分钟就会有token获取到,这里我是将其存储在项目变量中,但是如果需要考虑到项目横向扩展这里建议将token存储到缓存中;运行结果如下:

那么到这里token的获取和保存就基本讲完了,下一篇将讲述【多媒体消息的回复】,感谢你的翻阅,如果有需要源码或有疑问可以留言!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java微信开发之上传下载多媒体文件

    回复图片.音频.视频消息都是需要media_id的,这个是需要将多媒体文件上传到微信服务器才有的. 将多媒体文件上传到微信服务器,以及从微信服务器下载文件,可以参考:http://mp.weixin.qq.com/wiki/index.php?title=上传下载多媒体文件 上传下载多媒体文件的方法还是写到WeixinUtil.java中. 代码如下: import java.io.BufferedOutputStream; import java.io.BufferedReader; impo

  • java微信开发API第一步 服务器接入

    微信开发API如何接入服务器,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.tom

  • 微信开发之使用java获取签名signature

    一.前言 微信接口调用验证最终需要用到的三个参数noncestr.timestamp.signature: 接下来将会给出获取这三个参数的详细代码 本文的环境eclipse + maven 本文使用到的技术HttpClient.Json字符串转map.sha1加密 二.需要用到的jar包 maven依赖的包有: 1.HttpClient包依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <ar

  • java微信开发API第四步 微信自定义个性化菜单实现

    微信如何实现自定义个性化菜单,下面为大家介绍 一.全局说明 详细说明请参考前两篇文章. 二.本文说明 本文分为五部分:     * 工具类AccessTokenUtils的封装     * 自定义菜单和个性化菜单文档的阅读解析     * 菜单JSON的分析以及构建对应bean     * 自定义菜单的实现     * 个性化菜单的实现 微信自定义菜单所有类型菜单都给出演示 本文结束会给出包括本文前四篇文章的所有演示源码 工具类AccessTokenUtils的封装 在上文中关于AccessTo

  • Java的微信开发中使用XML格式和JSON格式数据的示例

    XML 微信XML消息model定义: package cn.wx.server; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; /** * @title cn.wx.serverXMLMsg.java * @todo TODO * @author lpe234 * @time 2014年5月21日下

  • java微信开发第二步 获取消息和回复消息

    接着上一篇java微信开发API第一步 服务器接入进行学习,下面介绍java微信开发第二步:获取消息和回复消息,具体内容如下 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet

  • java微信开发API第三步 微信获取以及保存接口调用凭证

    微信如何获取以及保存接口调用凭证,下面就为大家进行介绍 一.说明 *详细说明请参考前两篇文章. *本文分为三部分:     接口调用凭证access_token的作用以及解释     如何获取接口调用凭证access_token     如何实现微信文档所说的"中控服务器"的实现以保存access_token * 本文结束会给出包括本文前三篇文章的所有演示源码  为什么要获取和保存接口调用凭证access_token  •开始开发-获取接口调用凭据 ◦文档地址:http://mp.we

  • java微信开发API第二步 获取和回复消息

    微信开发API如何获取和回复消息,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.t

  • Java微信公众平台开发(7) 公众平台测试帐号的申请

    前面几篇一直都在写一些比较基础接口的使用,在这个过程中一直使用的都是我个人微博认证的一个个人账号,原本准备这篇是写[多媒体消息回复]的,后来主要到我个人账号的接口权限不够,所以在这里插入一篇[公众平台测试帐号的申请]的文章,同时也提醒各位开发者一定要注意在开发过程中需要注意接口权限,以防想当然的写完代码才发现接口不能使用,但是同样的我们也可以先预演接口的功能然后再将其应用到实际中! ①登入到微信公众平台,我们到[开发]-->[开发者工具]-->[公众平台测试账号]--进入: 首次进入可能会需要

  • 微信公众平台开发入门教程(SAE方倍工作室)

    我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务: 创建新浪云计算平台应用启用微信公众平台开发模式基础接口消息及事件微信公众平台PHP SDK微信公众平台开发模式原理开发天气预报功能 第一章 申请服务器资源 创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+MySQL数据库作为程序运行环境.申请地址:http://sae.sina.com.cn/ ,使用新浪微博账号可以直接登录SAE,登录后SAE将赠送50

  • 通过微信公众平台获取公众号文章的方法示例

    我之前自己维护了一个公众号,但因为个人关系很久没有更新了,今天上来缅怀一下,却偶然发现了一个获取微信公众号文章的方法. 之前获取方法有很多,通过搜狗.清博.网页端.客户端等等都还可以,这个可能并没有其他的优秀,但是操作简单,很容易理解. so. 首先需要有一个微信公众平台的账号 微信公众平台:https://mp.weixin.qq.com/ 登陆之后,进入首页,点击新建群发. 选择自建图文: 似乎像是公众号运营教学了 进入编辑页面之后,点击超链接 弹出选择框,我们在框中输入对应的公众号名字,即

  • Java微信公众平台开发(10) 微信自定义菜单的创建实现

    自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自己用代码实现,所以对于刚开始接触的人来说可能存在一定的疑惑,这里我说下平时我们在开发模式下常用的两种自定义菜单的实现方式:①不用写实现代码,直接用网页测试工具Post json字符串生成菜单:②就是在我们的开发中用代码实现菜单生成!(参考文档:http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html 

  • Java微信公众平台开发(13) 微信JSSDK中Config配置

    前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的.搞前端的甚至是是搞后端的都跑过来凑热闹,一时之间也把微信JSSDK捧得特别牛逼,但是在我们的技术眼里它的实现原理和根本是不能够被改变的,这篇文章就不对其js的实现做任何评价和解说了(因为我也不是很懂,哈哈),这里要说的是它的config配置实现,参考文档:http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html  ! 微信

  • Java微信公众平台开发(15) 微信JSSDK的使用

    在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置] ,但是我们在真正的使用中我们不仅仅只是为了配置Config而已,而是要在我们的项目中真正去使用微信JS-SDK给我们带来便捷,那么这里我们就简述如何在微信web开发中使用必要的方法!微信的JS-SDk中为我们提供的方法很多,这里我有一个简单截图如下: 在上图的提供的所有口中我们可以按照接口实现的难易程度分成两个部分: 较易实现:基础接口.分享接口.设备信息接口.地理位置接口.界面操作接口.微信扫一扫

  • Java微信公众平台开发(6) 微信开发中的token获取

    (一)token的介绍 引用:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效! (二)token的获取参考文档 获取的流程我们完全可以参考微信官方文档:http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14

  • Java微信公众平台开发(1) 接入微信公众平台

    前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA微信公众平台开发的整个流程,那么这篇我们开始聊聊如何将我们的服务端和微信公众平台对接! (一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html 通过上面我们可以看出其中接入微信公众平台开发,开发者需要按照如下步骤完成: 填写服务器配置 验证服务

  • Java微信公众平台开发(12) 微信用户信息的获取

    前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关联,所以在这里我们就采用openid去获取用户微信信息,并实现一个简单场景应用:当微信新用户关注我们的微信公众平台的时候我们自动回复一篇图文消息,然后在图文消息中标题为:[尊敬的:XXX,你好!],而且在图文消息中的图片就是用户的微信头像,如下图: 有关获取微信用户信息的文档我们可以参照:http:

  • 微信公众平台开发实战Java版之微信获取用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称.头像.性别.所在城市.语言和关注时间. 开发者可通过OpenID来获取用户基本信息.请使用https协议. 我们可以看看官方的文档:获取用户的基本信息. 接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/cgi-b

  • 微信公众平台 客服接口发消息的实现代码(Java接口开发)

    微信公众平台技术文档:客服消息 一.接口说明 当用户和公众号产生特定动作的交互时(具体动作列表请见下方说明),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过POST一个JSON数据包来发送消息给普通用户.此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务. 目前允许的动作列表如下(公众平台会根据运营情况更新该列表,不同动作触发后,允许的客服接口下发消息条数不同,下发条数达到上限后,会遇到错误返回码,具体请见返回码说明页

随机推荐