diff --git a/README.md b/README.md index 16b8456..1bc3730 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,26 @@ suite_api.get_corp_token(auth_corpid, permanent_code) suite_api.auth_url(code, uri, state="suite") ``` +## 企业号登录授权 + +```ruby + # 获取登录授权URL + # state default 'qy_wechat', option + # 此处授权回调时会传递auth_code、expires_in,auth_code用于get_login_info(获取企业号管理员登录信息)接口使用 + group_client.auth_login.auth_login_url("redirect_uri", "state") + + # 获取应用提供商凭证 + # provider_secret:提供商的secret,在提供商管理页面可见 + # 此处会返回:provider_access_token(已通过Rails.cache缓存7100s) + group_client.auth_login.get_provider_token(provider_secret) + + # 通过传递provider_access_token,获取企业号管理员登录信息 + group_client.auth_login.get_login_info(auth_code, provider_access_token) + + # 通过传递provider_secret,获取企业号管理员登录信息 + group_client.auth_login.get_login_info_by_secret(auth_code, provider_secret) +``` + ### 应用套件的回调通知处理 Wiki: http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AC%AC%E4%B8%89%E6%96%B9%E5%9B%9E%E8%B0%83%E5%8D%8F%E8%AE%AE diff --git a/lib/qy_wechat_api/api/auth_login.rb b/lib/qy_wechat_api/api/auth_login.rb new file mode 100644 index 0000000..84477ef --- /dev/null +++ b/lib/qy_wechat_api/api/auth_login.rb @@ -0,0 +1,59 @@ +# 登录授权流程说明 +# encoding: utf-8 +module QyWechatApi + module Api + class AuthLogin < Base + + # 服务商引导用户进入登录授权页 服务可以在自己的网站首页中放置“微信企业号登录”的入口,引导用户(指企业号系统管理员者)进入登录授权页。 + # 网址为: https://qy.weixin.qq.com/cgi-bin/loginpage?corp_id=xxxx&redirect_uri=xxxxx&state=xxxx + # 服务商需要提供corp_id,跳转uri和state参数,其中uri需要经过一次urlencode作为参数,state用于服务商自行校验session,防止跨域攻击。 + # 授权回调时会传递: + # auth_code=xxx&expires_in=600,auth_code用于get_login_info(获取企业号管理员登录信息)接口使用 + def auth_login_url(redirect_uri, state="qy_wechat") + require "erb" + redirect_uri = ERB::Util.url_encode(redirect_uri) + "#{QyWechatApi::SUITE_ENDPOINT}/loginpage?corp_id=#{corp_id}&redirect_uri=#{redirect_uri}&state=#{state}" + end + + # 获取应用提供商凭证 + # https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token + def get_provider_token(provider_secret) + cache_key = "auth_login-#{corp_id}-get_provider_token" + Rails.cache.fetch(cache_key, expires_in: 7100.seconds) do + payload = {corpid: corp_id, provider_secret: provider_secret} + url = base_url("get_provider_token") + res = QyWechatApi.http_post_without_token(url, payload) + token = res.result["provider_access_token"] + if token.blank? + Rails.cache.delete(cache_key) + raise res.errors + else + token + end + end + end + + # 通过传递provider_access_token,获取企业号管理员登录信息 + # https://qyapi.weixin.qq.com/cgi-bin/service/get_login_info?provider_access_token=enLSZ5xxxxxxJRL + def get_login_info(auth_code, provider_access_token) + url = base_url("get_login_info", {provider_access_token: provider_access_token}) + QyWechatApi.http_post_without_token(url, {auth_code: auth_code}) + end + + # 通过传递provider_secret,获取企业号管理员登录信息 + def get_login_info_by_secret(auth_code, provider_secret) + token = get_provider_token(provider_secret) + get_login_info(auth_code, token) + end + + private + + def base_url(api, params={}) + params = params.to_query + params = "?#{params}" if params.present? + "#{QyWechatApi::ENDPOINT_URL}/service/#{api}#{params}" + end + + end + end +end diff --git a/lib/qy_wechat_api/client.rb b/lib/qy_wechat_api/client.rb index f0cac12..5d06160 100644 --- a/lib/qy_wechat_api/client.rb +++ b/lib/qy_wechat_api/client.rb @@ -62,6 +62,11 @@ module QyWechatApi Api::Js.new(get_access_token, corp_id) end + # 企业号登录授权 + def auth_login + Api::AuthLogin.new(nil, corp_id) + end + private def security_redis_key(key) -- libgit2 0.21.0