企业号 网页授权 php,微信企业号开发之网页授权接口调用示例
摘要:上一篇总结了微信企业号开发的入门篇,access_token接口调用,这篇咱们来看下微信企业号开发中的网页授权接口调用,这个接口一般都是用来实现微信企业号应用免登录或者获取关注的微信用户的个人信息时会用到。
下面摘自微信企业号官方文档:
网页授权
概述
企业微信提供了OAuth的授权登录方式,可以让网页和企业微信共享用户ID,从而免去登录的环节。
此文档面向网页开发者介绍企业微信网页授权如何使用及相关注意事项。
关于网页授权的可信域名
1、在开始使用网页授权之前,开发者需要先登录到企业管理端后台,选择“企业应用”选项卡,进入需要使用网页授权的应用并编辑“可信域名”表单项,此选项将用于网页OAuth2.0授权的时候进行安全验证。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头
2、可信域名配置规范为全域名,且需要通过ICP备案(否则在微信侧jssdk功能失效)。比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权
3、域名的验证逻辑说明:由于一个企业可以自定义多个应用,每个应用都可以配置一个安全域名,在做oauth跳转的时候,只需要携带coprid即可,企业微信的后台会遍历该企业下面配置的所有应用并检查其配置的可信域名,只要任意一个应用的可信域名匹配则校验成功。
关于UserID机制
UserId用于在一个企业内唯一标识一个用户,通过网页授权接口可以获取到当前用户的UserId信息,如果需要获取用户的更多信息可以调用通讯录管理的成员接口来获取。
接入流程说明
企业应用中的URL链接(包括自定义菜单或者消息中的链接),均可通过OAuth2.0验证接口来获取成员的UserId身份信息。注意:此URL的域名,必须完全匹配企业应用设置项中的“可信域名”(如果你的redirect_uri有端口号,那么“可信域名”也必须加上端口号),否则跳转时会提示redirect_uri参数错误。
通过此接口获取成员身份会有一定的时间开销。对于频繁获取成员身份的场景,建议采用如下方案: 1、企业应用中的URL链接直接填写企业自己的页面地址 2、成员操作跳转到步骤1的企业页面时,企业后台校验是否有标识成员身份的cookie信息,此cookie由企业生成 3、如果没有匹配的cookie,则重定向到OAuth验证链接,获取成员的身份信息后,由企业后台植入标识成员身份的cookie信息 4、根据cookie获取成员身份后,再进入相应的页面
关键步骤
获取code
如果企业需要在打开的网页里面携带用户的身份信息,第一步需要构造如下的链接来获取code参数: https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&agentid=AGENTID&state=STATE#wechat_redirect
参数说明:
参数
必须
说明
appid
是
企业的CorpID
redirect_uri
是
授权后重定向的回调链接地址,请使用urlencode对链接进行处理
response_type
是
返回类型,此时固定为:code
scope
是
应用授权作用域。 snsapi_base:静默授权,可获取成员的基础信息; snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含手机、邮箱; snsapi_privateinfo:手动授权,可获取成员的详细信息,包含手机、邮箱。
agentid
否
企业应用的id。 当scope是snsapi_userinfo或snsapi_privateinfo时,该参数必填。 注意redirect_uri的域名必须与该应用的可信域名一致。
state
否
重定向后会带上state参数,企业可以填写a-zA-Z0-9的参数值,长度不可超过128个字节
#wechat_redirect
是
终端使用此参数判断是否需要带上身份信息
员工点击后,页面将跳转至 redirect_uri?code=CODE&state=STATE,企业可根据code参数获得员工的userid。code长度最大为512字节。
权限说明: 企业无限制;第三方使用snsapi_privateinfo的scope时,应用必须有’成员敏感信息授权’的权限。
根据code获取成员信息
请求方式:GET(HTTPS) 请求地址:https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE
参数说明:
参数
必须
说明
access_token
是
调用接口凭证
code
是
通过成员授权获取到的code,最大为512字节。每次成员授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
权限说明: 跳转的域名须完全匹配access_token对应应用的可信域名。
返回结果: a) 当用户为企业成员时返回示例如下:
{
"errcode":0,
"errmsg":"ok",
"UserId":"USERID",
"DeviceId":"DEVICEID",
"user_ticket":"USER_TICKET",
"expires_in":7200
}
参数
说明
errcode
返回码
errmsg
对返回码的文本描述内容
UserId
成员UserID
DeviceId
手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)
user_ticket
成员票据,最大为512字节。 scope为snsapi_userinfo或snsapi_privateinfo,且用户在应用可见范围之内时返回此参数。 后续利用该参数可以获取用户信息或敏感信息。
expires_in
user_token的有效时间(秒),随user_ticket一起返回
非企业成员授权时返回示例如下:
{
"errcode":0,
"errmsg":"ok",
"OpenId":"OPENID",
"DeviceId":"DEVICEID"
}
参数
说明
errcode
返回码
errmsg
对返回码的文本描述内容
OpenId
非企业成员的标识,对当前企业唯一
DeviceId
手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)
出错返回示例:
{
"errcode":40029,
"errmsg":"invalid code"
}
下面来看具体的代码实现:
1.SimpleOAuth2Controller.java
package com.eqiao.bidata.weixin.controller;
import com.eqiao.bidata.weixin.common.AccessToken;
import com.eqiao.bidata.weixin.common.Result;
import com.eqiao.bidata.weixin.common.WeiXinQiYeConstants;
import com.eqiao.bidata.weixin.common.WeiXinQiYeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
/**
* 单纯实现OAuth2验证,不使用注解及拦截器
* Created by zhaoxinguo on 2017/7/11.
*/
@Controller
public class SimpleOAuth2Controller {
private Logger logger = LoggerFactory.getLogger(SimpleOAuth2Controller.class);
/**
* 拼接网页授权链接
* 此处步骤也可以用页面链接代替
* @return
*/
@RequestMapping(value = { "/oauth2wx.do" })
public String Oauth2API(HttpServletRequest request){
//获取项目域名
String requestUrl = request.getServerName();
String contextPath = request.getContextPath();
logger.info("domain name: " + requestUrl + " project name: " + contextPath);
//拼接微信回调地址
String backUrl ="http://" + requestUrl + contextPath + "/oauth2me.do";
String redirect_uri = "";
try {
redirect_uri = java.net.URLEncoder.encode(backUrl, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
logger.error("ecdoe error: " + e.getMessage());
}
String oauth2Url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeiXinQiYeConstants.CORPID + "&redirect_uri=" + redirect_uri
+ "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
return "redirect:" + oauth2Url;
}
/**
* 授权回调请求处理
* @return
*/
@RequestMapping(value = { "/oauth2me.do" })
public String oAuth2Url(HttpServletRequest request, @RequestParam String code){
// 调用获取access_token的接口
AccessToken accessToken = WeiXinQiYeUtil.access_token();
HttpSession session = request.getSession();
if (accessToken != null && accessToken.getAccess_token() != null) {
// 调用获取用户信息的接口
String UserId = getMemberGuidByCode(accessToken.getAccess_token(), code, WeiXinQiYeConstants.AGENTID);
logger.info("UserId: " + UserId);
if (UserId != null) {
session.setAttribute("UserId", UserId);
logger.info("UserId放入session成功!");
}
}
// 这里简单处理,存储到session中
return "user/result";
}
/**
* 调用接口获取用户信息
*
* @param token
* @param code
* @return
*/
public String getMemberGuidByCode(String token, String code, String agentId) {
logger.info("code==" + code + " token=" + token + " agentId=" +agentId);
Result result = WeiXinQiYeUtil.oAuth2GetUserByCode(token, code, agentId);
logger.info("result= " + result);
if (result.getErrcode().equals("0")) {
if (result.getUserId() != null && result.getUserId().length() > 0) {
// 此处可以通过微信授权用code还钱的Userid查询自己本地服务器中的数据
logger.info("result.getUserId(): " + result.getUserId());
return result.getUserId();
}
}
return "";
}
}
2.OAuth2验证接口根据code获取成员信息接口调用方法:
/**
* OAuth2验证接口根据code获取成员信息
*
* @param token
* @param code
* @return
*/
public static Result oAuth2GetUserByCode(String token, String code, String agentId) {
Result result = new Result();
String menuUrl = WeiXinQiYeConstants.GET_OAUTH2_URL.replace("ACCESS_TOKEN", token).replace("CODE", code).replace("AGENTID", agentId + "");
String userinfo = JHttpUtils.doGet(menuUrl);
logger.info("userinfo: " + userinfo);
JSONObject jsonObject = null;
if (userinfo != null) {
try {
jsonObject = JSONObject.fromObject(userinfo);
logger.info("jsonObject: " + jsonObject);
if (jsonObject.getString("UserId") != null && jsonObject.getString("UserId").length() > 0) {
result.setErrmsg(jsonObject.getString("errmsg"));
result.setErrcode(jsonObject.getString("errcode"));
result.setUserId(jsonObject.getString("UserId"));
} else {
result.setErrmsg(jsonObject.getString("errmsg"));
result.setErrcode(jsonObject.getString("errcode"));
}
} catch (Exception e) {
result.setErrmsg("accessToken 超时......");
result.setErrcode("42001");
}
}
return result;
}
以上就是网页授权接口的调用示例,最后调用成功后,会打印出微信企业号的UserId(前提是这个微信号必须先关注改企业号才行)。
3.访问方法测试网页授权接口:http://域名:端口号/项目名称/oauth2wx.do
企业号 网页授权 php,微信企业号开发之网页授权接口调用示例相关推荐
- 微信企业号接收消息服务器配置,微信企业号企业消息功能介绍与操作
昨日微信企业号有重大的更新,出现了不用加好友也能进行聊天的功能,这个功能叫做"企业消息"下面我们来看看微信企业号企业消息功能介绍与操作吧. 相信很多人在微信上都有过这种经历: 因为 ...
- php微信商务平台 红包调用,微信平台红包接口怎么调用?微信支付商户平台红包发放接口调用图文教程[多图]...
微信平台红包接口怎么调用?估计很多商家都还不太会操作吧?别着急,下面是友情小编搜集相关资料整理出来的微信支付商户平台红包发放接口调用图文教程,希望可以帮到大家,现在就跟随小编一起看看吧!!! 首先,商 ...
- 企业号 php 考勤,使用微信企业号实现微信考勤和办公
原标题:使用微信企业号实现微信考勤和办公 微信考勤只需使用移动考勤功能直接点击上班签到.下班签退->确定,即可考勤,考勤系统是在电脑后台设置好班次.规则之后,员工可以在考勤机上打卡也可以直接在手 ...
- java 企业号 临时素材_微信企业号上传临时素材的方法C#实现
// /// 上传多媒体文件,返回 MediaId /// /// /// /// public string UploadMultimedia(string files) { weixinsendm ...
- 微信企业号信息接收服务器,微信企业号拟部署HTTPS协议,移步到微:早已升级...
原标题:微信企业号拟部署HTTPS协议,移步到微:早已升级 12月19号,微信企业号更新了一条消息,引起了不少企业的轰动,具体内容如下: 这条消息告诉我们,凡是没有使用HTTPS协议的网站,都会被屏蔽 ...
- 快递鸟Java开发快递查询api接口调用源码
快递鸟是专业的第三方物流数据服务商,国家高新技术企业,已先后完成四轮融资,一直专注于企业级物流API技术研发和打通物流各节点信息服务,致力于成为全球最大的物流信息枢纽中心,为零售电商企业级提供标准的物 ...
- 微信服务开发——读取百度音乐接口返回音乐
最近用了很多网上的坑爹接口,都泪奔了,不说了,都是泪啊~ 前两天做了个微信返回音乐的接口,先来看下效果: 出来之后在手机微信里面就可以实现音乐播放了. 技术很简单,首先访问百度音乐接口,传入音乐名称和 ...
- 企业微信逆向开发协议,HOOK接口,DLL开发
企业微信hook接口 基本实现企业微信pc端所有功能. 1.登陆模块: 接收登录二维码,登录成功通知,退出通知 2.用户信息模块: 获取自己的信息,获取联系人信息 获取内部联系人列表,获取外部联系人列 ...
- python 支付宝营销活动现金红包开发接入流程-含接口调用加签
1 创建网页/移动应用 2 配置接口加签方式 涉及到金额的需要上传证书,在上传页面有教程, 在支付宝开放平台秘钥工具中生成CSR证书,会自动保存应用公钥和私钥到电脑上,调用支付宝接口需要应用私钥进行加 ...
- android开发接口调用,Android开发中webService接口调用示例
代码示例: package com.study.ws; import java.io.IOException; import org.ksoap2.SoapEnvelope; import org.k ...
最新文章
- 正则表达式grep、egrep--already
- 用Select查询结果创建ACCESS表
- nginx反向代理和rewrite进行解决跨域问题、去掉url中的一部分字符串,通过nginx正则生成新的url...
- 预编译头文件来自编译器的早期版本_Debug
- PHP读写操作Excel
- python语言中百分号是什么意思_Python中%是什么意思?python中百分号如何使用?...
- shutil模块 python_python之模块之shutil模块
- 经典面试题:断网排查思路
- vue+webpack实践
- python程序员工资高吗_Python程序员必备:EDA数据分析神器,老板疯狂加工资
- 做程序员的老婆应该注意的一些事情
- arm-linux驱动开发学习7
- 特种浓缩分离:生物农药超滤分离提纯过滤技术
- 使用 Python 构建图片搜索引擎
- ASP.NET之Panel控件、FileUpload 控件
- uva 109 SCUD Busters
- 我上网要遵守的规则……
- 身份验证协议和java安全框架
- 数值计算方法--插值
- set setenv