Tag Archives: 微信

微信扫码直接跳转前台实现

微信在Mac、PC、浏览器都实现了扫码登录的功能,过程如下:

当用户已经使用过一次扫码登录后可以直接点击“Log in via My Phone”,微信服务器会向App发送通知,调用确认界面,用户点击“确认在PC上登录微信”,App向服务器确认请求,服务器响应Mac、PC的登录请求成功。

其中微信Android客户端的一个环节为抢占式弹出确认界面,这个过程参与实现的几个要点:Service、PendingIntent,但是还有一个关键点就是如果微信App 处于前台如何抢占式的将确认界面置为task stack的最上面?如果此Activity如果已经位于stack的任意位置如何保证single in task而且还能置于栈顶?

最近在看Android官方例子才发现Intent其实已经提供了相关的Flag来解答这个疑问。

Intent类中提供这样一个Flag,官方解释它的作用:当某个Intent增加这个Flag会导致将要运行的Activity从当前task stack中置为栈顶,当然了由于stack数据结构先入先出的定义只能是进行多次出栈入栈的reorder,如果stack中不存在就直接创建。回到微信那个例子,如果确认Activity在stack中已经存在那么它将被从stack的任意位置置于栈顶,如果stack中不存在确认Activity则在栈顶创建,这样就保证了无论微信是否在前台运行还是确认Activity是否在栈顶都能抢占式的弹出请用户确认此次登录行为。

HttpClient 4.3中Https的使用方法

开发Android版Do+新浪微博客户端时使用到了HTTPClient库,当时刚刚接触API接口开发很多都不懂,直接调用HTTPS时直接报证书错误,后来查找资料发现,HTTPClient在请求HTTPS时也需要证书认证。通过自定义HTTPClient顺利实现了接口调用。最近在做另外一个项目,也会通过HTTPClient来调用第三方的API,所以又查看了一下HTTPClient的源码,把HTTPS的请求方式重新梳理一下。

注意:Android项目中内嵌的HTTPClient库版本为4.2.3,详见此处。下面介绍中使用的库为4.3,两者之间有些差异。4.3当前为开发版,谨慎使用。

以新浪微博API为例,

1、通过浏览器下载https://api.weibo.com的证书

Chrome浏览器,地址栏中键入“https://api.weibo.com/oauth2/authorize”,点击左侧绿色锁状图标,选择”连接”选项卡,点击”证书信息”

IE浏览器,地址栏中键入“https://api.weibo.com/oauth2/authorize”,点击右侧橙色锁状图标,点击”查看证书信息”

弹出对话框,选择“详细信息”选项卡,右侧点击“复制到文件”,进入证书导出向导,点击”下一步”,选择”Base64 编码 X.509(.CER)(S)”,点击”下一步”,选择证书保存位置。证书导出成功。

2、加载证书信息,构造KeyStore。默认将证书****.cer放在src下

3、构造SSLContext

4、创建可用Scheme

5、创建ConnectionManager,添加Connection配置信息

6、构建HTTPClient

HttpClients.custom().setConnectionManager(conManager).build();

7、发起HTTP Request

 

8、当前默认编码为UTF-8.在之前版本中设置编码是通过BasicParam设置为HTTP.UTF-8

在新版本中改为Config模式,参数为Consts.UTF-8。

 

proxy方式连接httpd与tomcat

这几天一直在微信公众平台的开发,由于服务器验证现在仅支持80端口,本博客又架设在Httpd服务器,80端口占用无法再分配给Tomcat使用,所以就开始考虑Tomcat与Httpd的连接问题。

目前主要有三种方式,1、JK;2、http_proxy;3、ajp_proxy

JK方式是通过mod_jk来完成服务器端代码解析的一种方式,也是当前主流的连接方式,鉴于mod_jk已经停止开发,而且配置较为繁琐,遂没有使用它。

http_proxy是通过端口映射将某虚拟主机域下的部分网页解析交给监听8080端口的tomcat来处理,配置起来简单,方便使用,故采用这种方式。

请确保proxy、http_proxy的开启,键入以下命令确认

在site-available中添加额外的虚拟主机文件mysite.com,内容如下

键入以下命令让虚拟主机生效

这样在地址栏中键入

xxxxx.example.com就可以直接映射到http://114.114.114.114:8080/xxxx/上面。

 

参考链接