一、OAuth介绍

在微信开发中,当打开一个页面是,业务场景一般会基于粉丝绑定用户信息,即页面需要基于粉丝和用户的身份处理业务逻辑。

在微信中打开一个页面有三个场景:

1.文本回复中直接包含url

2.图文回复中携带url

3.微信菜单直接打开一个url

对于前两者,因为使用的是请求和回复的方式,回复可以在后台在页面中通过url的参数传递粉丝的openId等身份标识数据。而对于微信菜单的url,因为没有后台的处理,所以无法在url中附加openId,导致菜单打开的页面无法实现粉丝和用户的身份识别。

微信提供了oauth方式,可以用来在微信菜单中打开的url进行粉丝和用户身份的标识。需要说明的是只有微信服务号才支持oauth,对于订阅号是不支持oauth的,即订阅号菜单对应的url中无法识别粉丝和用户的身份。本文介绍的是netsharp.weixin开发下的微信服务号oauth的处理机制。

另外:用户点击一个微信菜单的时候,可以发送一个消息,也可以打开一个url,本文主要介绍打开url的情况

如下场景:

1.业务中微信打开的业务菜单:如http://www.netsharp.org/nav/weixin/index?originalId=gh_cd4d099926d5,本文称之为"redirect_uri"(和微信oauth下的叫法一致)

2.微信要求url必须配置成这样的:https://open.weixin.qq.com/connect/oauth2/authorize?from=weixin&appid=wx19a3e7936ff4ec13&redirect_uri=http%3A%2F%2Fwww.netsharp.org%2Fnav%2Faddins%2Fweixin%2Findex%3ForiginalId%3Dgh_cd4d099926d5&response_type=code&scope=snsapi_base&state=#wechat_redirect,本文称之为oauth_url,在oauth_url中 redirect_uri作为一个参数(即上面的第一点提到的redirect_uri),并且在oauth_url中的redirect_uri部分需要编码

用户点击微信菜单场景:

1.用户点击一个菜单

2.微信打开oauth_url

3.oauth_url页面进行oauth验证

4.oauth_url页验证通过后,跳转到redirect_uri,并且给redirect_uri页面追加了一个参数"code"

5.redirect_uri中,开发人员基于code,调用微信的api得到粉丝的信息

6.基于粉丝信息处理业务

7.结束

二、OAuth示例

下面是redirect_url也的demo代码,首先netsharp会自动把"originalId"参数传递给redirect_url,在redirect_url如果想获取openId则通过oauth_url给redirect_url追加的一个参数“code”获取,netsharp把根据code获取粉丝信息给封装了,参见业务页面的代码:

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
<%@page import="org.netsharp.wx.pa.base.IFansService" %>
<%@page import="org.netsharp.communication.ServiceFactory" %>
<%@page import="org.netsharp.wx.pa.entity.Fans" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<meta name="format-detection" content="telephone=no" />
<title>oauth测试页面</title> </head>
<body > <%
String originalId = (String)request.getParameter("originalId");
response.getWriter().write("originalId:"+originalId+"<br/>"); String code = (String)request.getParameter("code");
response.getWriter().write("code:"+code+"<br/>"); //oauth中必须根据code才能得到粉丝信息
IFansService fansService = ServiceFactory.create(IFansService.class); Fans fans = fansService.attachByOpenId(code, originalId); response.getWriter().write("openId:"+fans.getOpenId()+"<br/>");
response.getWriter().write("nickname:"+fans.getNickname()+"<br/>");
response.getWriter().write("img:<img src='"+fans.getHeadImgUrl()+"' style='width:60px;height:60px' /><br/>"); %>
</body>
</html>

测试页的效果如下:

三、Netsharp下微信菜单的配置

因为oauth的页面拼接很麻烦,netsharp.weixin工具把这些工作给封装了,在微信菜单的配置,只要配置redirect_url就可以了,参见如下界面:

Netsharp下微信菜单以及OAuth的更多相关文章

  1. C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

    前面介绍了很多篇关于使用C#开发微信门户及应用的文章,基本上把当时微信能做的接口都封装差不多了,微信框架也积累了不少模块和用户,最近发现微信公众平台增加了不少内容,特别是在自定义菜单里面增加了扫一扫. ...

  2. C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

    我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...

  3. C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

    在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一印象,我们要规划好这些菜单的内容,布局等信息.根据微信菜单的定义,我们可以看到,一般菜单主要分为两种,一 ...

  4. 小程序页面跳转传参-this和that的区别-登录流程-下拉菜单-实现画布自适应各种手机尺寸

    小程序页面跳转传参 根目录下的 app.json 文件 页面文件的路径.窗口表现.设置网络超时时间.设置多 tab { "pages": [ "pages/index/i ...

  5. excel选择元角分下拉菜单选择框自动变更数字

    excel选择元角分下拉菜单选择框自动变更数字 (M2列),数据-->数据有效性-->在“允许”栏中选择序列-->在“来源”栏中输入:分,角,元单位倍数公式(M4列):=IF(M2= ...

  6. [.Net] C#开发微信门户及应用之微信菜单的多种表现方式介绍

    URL:http://www.it165.net/pro/html/201405/13997.html 在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一 ...

  7. DIV置底层或置最高层的方法下拉菜单被挡住

    网站常会用到一些 下拉菜单,,幻灯片,,,飘浮广告等. 但经常会发现.幻灯片会挡住下拉菜单或者飘浮广告微信开店等. 解决办法有下 第一,可将幻灯片所在DIV 置于最底层.添加CSS如下 style=& ...

  8. 初学者--bootstrap(六)组件中的下拉菜单----在路上(10)

    组件---下拉菜单 用于显示链接列表的可切换.有上下文的菜单.下拉菜单的 JavaScript 插件让它具有了交互性. 将下拉菜单触发器和下拉菜单都包裹在 .dropdown 里,或者另一个声明了 p ...

  9. Bootstrap3系列:按钮式下拉菜单

    1. 基本实例 把按钮放入 .btn-group 中,加入适当的菜单标签,让按钮触发下拉菜单. 1.1 示例代码 <div class="btn-group"> < ...

随机推荐

  1. 游戏AI技术 2

    [Unity3D人工智能编程精粹 2] 1.跟随领队行为. 用靠近(Seek)或追逐(Pursuit)实现跟随领队行为并不好.在Seek中,AI角色会被推向领队,最终与领队占据相同位置.而Pursui ...

  2. python-ceilometerclient命令行(终结)

    ceilometerclient入口 工程ceilometerclient shell.py中的main方法 ceilometerclient目录 --ceilometerclient --commo ...

  3. macaca自动化测试以及配置环境问题

    macaca 测试和环境问题 标签(空格分隔): macaca自动化配置环境问题 macaca环境变量配置 基本环境需要准备的东西: JDK的安装及环境配置:(1.8) Node.js的安装及环境配置 ...

  4. oracle 一致读原理

    在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复(Instance Recovery). ...

  5. oracle数据库连接不上

    Oracle数据库1521端口telnet不通 现象:服务器的ip地址可以ping通,但是安装oracle过程中的指定的“1521”端口telnet不通过 解决办法:1.确保防火墙对1521端口开启: ...

  6. PHP 用正则获取URL的根域名

    function GetUrlRoot($url){ preg_match('/[\w][\w-]*\.(?:com\.cn|com|cn|co|net|org|gov|cc|biz|info)(\/ ...

  7. NumPy Ndarray 对象

    NumPy Ndarray 对象 NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放 ...

  8. TZOJ 4085 Drainage Ditches(最大流)

    描述 Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. Th ...

  9. PLSQL连接Oracle数据库问题及详解

    一.Oracle数据库安装步骤参考:https://jingyan.baidu.com/article/363872eccfb9266e4aa16f5d.html 二.Oracle客户端安装:http ...

  10. Python中操作SQLAlchemy

    一.ORM 框架简介 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法 ...