1、 了解HttpClient
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HttpClient有如下特点
(1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自动跳转
(3)支持 HTTPS 协议
(4)支持代理服务器等
微信公众号需要用到的就是(1)和(3),所以这里只演示(1)和(3)
Get方法
public void get() throws Exception { // (1) 创建HttpGet实例 HttpGet get = new HttpGet("http://localhost:8080/iheima/getWithNoParam"); // (2) 使用HttpClient发送get请求,获得返回结果HttpResponse HttpClient http = HttpClients.createDefault(); HttpResponse response = http.execute(get); // (3) 读取返回结果 if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); InputStream in = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); } in.close(); reader.close(); } }
Get带参数
public void getWithParam() throws URISyntaxException, IOException { // (1)创建查询参数 URI uri = new URIBuilder() .setScheme("http") .setHost("127.0.0.1") .setPort(8080) .setPath("/iheima/getWithParam") .setParameter("param", "ice") .build(); // (2) 创建Get实例 HttpGet get = new HttpGet(uri); // (3) 使用HttpClient发送get请求,获得返回结果HttpResponse HttpClient http = HttpClients.createDefault(); HttpResponse response = http.execute(get); // (4) 读取返回结果 if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); InputStream in = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); } in.close(); reader.close(); } }
Post方法
public void post() throws Exception { // (1) 创建HttpPost实例 HttpPost post = new HttpPost("http://localhost:8080/iheima/postWithNoParam"); // (2) 使用HttpClient发送post请求,获得返回结果HttpResponse HttpClient http = HttpClients.createDefault(); HttpResponse response = http.execute(post); // (3) 读取返回结果 if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); InputStream in = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); } in.close(); reader.close(); } }
Post带参数
public void postWithParam() throws IOException { // (1) Post请求 HttpPost post = new HttpPost("http://localhost:8080/iheima/postWithParam"); //添加参数 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("param", "post ice")); post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); // (3) 发送请求 HttpClient http = HttpClients.createDefault(); HttpResponse response = http.execute(post); // (3) 读取返回结果 if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); InputStream in = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); } in.close(); reader.close(); } }
2、 了解微信接口
微信提供的接口基本上都是以SSL (Secure Sockets Layer 安全套接层)加密请求的。
如获取access_token的接口地址为:
以下为参数说明:
参数 |
是否必须 |
说明 |
grant_type |
是 |
获取access_token填写client_credential |
appid |
是 |
第三方用户唯一凭证 |
secret |
是 |
第三方用户唯一凭证密钥,即appsecret |
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
对照的参数表为:
参数 |
说明 |
access_token |
获取到的凭证 |
expires_in |
凭证有效时间,单位:秒 |
以下为使用SSL加密方式用get的方式调用微信接口的方法:
public void getSSL() throws Exception { // Trust own CA and all self-signed certs SSLContext sslcontext = SSLContexts.custom() .loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {//信任所有 return true; } }) .build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext); CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); try { HttpGet httpget = new HttpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"); System.out.println("executing request " + httpget.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httpget); // (3) 读取返回结果 if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); InputStream in = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); } in.close(); reader.close(); } response.close(); } finally { httpclient.close(); } }
最后附上maven项目所需要的依赖:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency>
注:微信各类详细接口明天再讲
微信接口开发流程:
1、在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。
参数 |
描述 |
signature |
微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp |
时间戳 |
nonce |
随机数 |
echostr |
随机字符串 |
加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
第一次处理来自于微信和校验时,只需要要把echostr返回给来自于微信的请求即校验通过
全局access_token:其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。
授权access_token:通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取网页授权access_token,通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
用户open_id
用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID,相对于一个公众号来说,openid是唯一的
用户union_id:
1、请注意,网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
2、UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。
微信接口列表
1. 获取access_token
2. 接收消息
Ø 验证消息真实性:使用我们上面介绍的方法进行验证
Ø 接收消息,
Ø 接收事件:关注、取关、扫描二维码()、定位、点击自定义菜单(分为两类:获取信息和跳转)
3. 发送消息
Ø 自动回复
Ø 客服(没研究)
Ø 群发
Ø 回复模板(一定格式的微信消息)
4. 素材管理
5. 用户管理
Ø 设置备注名
Ø 获取用户列表(分页获取,每页10000个,获取的是OpenID)
Ø 获取用户信息(两种方式:UinionID和OpneID)
Ø 授权登录(即授权获取用户信息)
6. 自定义菜单
Ø 自定义的菜单有两种类型:
n 点击后以消息方式返回结果;click
n 以链接形式形成跳转.view
Ø 增删查
Ø 有关事件
7. 获取统计信息
8. JS-SDK(可以用微信扫下,体验下接口类型,不列举了╮(╯▽╰)╭)
To do 是否可以转发到朋友圈
9. 微信小店接口
10. 多客服接口
11. 微信支付
Ø 刷卡支付
Ø 公众号支付
Ø 扫码支付
Ø App支付
Ø 代金券或立减支付
Ø 现金红包
Ø 企业付款
参考资料
微信公众号文档:
http://mp.weixin.qq.com/wiki/home/index.html
微信开放平台文档:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN
微信支付文档:
http://pay.weixin.qq.com/wiki/doc/api/index.html
测试帐号地址:
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
支付开发教程(微信商户平台版):
https://mp.weixin.qq.com/paymch/readtemplate?t=mp/business/course3_tmpl&lang=zh_CN
方倍工作室:
http://www.cnblogs.com/txw1958/
封装好的微信框架:
https://github.com/liyiorg/weixin-popular
https://github.com/chanjarster/weixin-java-tools
httpcomponents 文档:https://hc.apache.org/httpcomponents-client-4.4.x/tutorial/html/index.html
作业,使用把前面的httpclient的例子跑起来