From a66301c7565673703c1189d6cc0a4eb85ccf6940 Mon Sep 17 00:00:00 2001 From: devil_gong Date: Fri, 24 May 2019 15:59:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/admin/index.html | 48 ++++++++++ .../admin/admin/saveinfo.html | 40 +++++++++ .../index/public/auth_button.html | 1 + .../index/public/auth_text.html | 1 + .../plugins/weixinwebauthorization/Hook.php | 85 ++++++++++++++++++ .../weixinwebauthorization/admin/Admin.php | 85 ++++++++++++++++++ .../weixinwebauthorization/config.json | 30 +++++++ .../weixinwebauthorization/index/Auth.php | 75 ++++++++++++++++ application/tags.php | 6 ++ .../weixinwebauthorization/admin/admin.css | 11 +++ .../2019/05/24/1558681549248354.jpg | Bin 0 -> 8946 bytes 11 files changed, 382 insertions(+) create mode 100755 application/plugins/view/weixinwebauthorization/admin/admin/index.html create mode 100755 application/plugins/view/weixinwebauthorization/admin/admin/saveinfo.html create mode 100755 application/plugins/view/weixinwebauthorization/index/public/auth_button.html create mode 100644 application/plugins/view/weixinwebauthorization/index/public/auth_text.html create mode 100644 application/plugins/weixinwebauthorization/Hook.php create mode 100644 application/plugins/weixinwebauthorization/admin/Admin.php create mode 100644 application/plugins/weixinwebauthorization/config.json create mode 100644 application/plugins/weixinwebauthorization/index/Auth.php create mode 100755 public/static/plugins/css/weixinwebauthorization/admin/admin.css create mode 100644 public/static/upload/images/plugins_weixinwebauthorization/2019/05/24/1558681549248354.jpg diff --git a/application/plugins/view/weixinwebauthorization/admin/admin/index.html b/application/plugins/view/weixinwebauthorization/admin/admin/index.html new file mode 100755 index 000000000..64fa0cc15 --- /dev/null +++ b/application/plugins/view/weixinwebauthorization/admin/admin/index.html @@ -0,0 +1,48 @@ +{{include file="public/header" /}} + + +
+
+ + 微信登录 + 返回 + + +
+
+ +
+ {{if !empty($data['appid'])}} + {{$data.appid}} + {{else /}} + 未填写 + {{/if}} +
+
+
+ +
+ {{if isset($data['auth_type']) and $data['auth_type'] eq 1}} + 弹出授权 + {{else /}} + 静默授权 + {{/if}} +
+
+ + + + 编辑 +
+
+
+ + + +{{include file="public/footer" /}} + \ No newline at end of file diff --git a/application/plugins/view/weixinwebauthorization/admin/admin/saveinfo.html b/application/plugins/view/weixinwebauthorization/admin/admin/saveinfo.html new file mode 100755 index 000000000..e91ad8e42 --- /dev/null +++ b/application/plugins/view/weixinwebauthorization/admin/admin/saveinfo.html @@ -0,0 +1,40 @@ +{{include file="public/header" /}} + + +
+
+ +
+ + 微信登录 + 返回 + + +
+ + +
+ +
+ +
+ {{foreach $is_auth_type_list as $v}} + + {{/foreach}} +
+
+ +
+ +
+
+ +
+
+ + + +{{include file="public/footer" /}} + \ No newline at end of file diff --git a/application/plugins/view/weixinwebauthorization/index/public/auth_button.html b/application/plugins/view/weixinwebauthorization/index/public/auth_button.html new file mode 100755 index 000000000..5e6140958 --- /dev/null +++ b/application/plugins/view/weixinwebauthorization/index/public/auth_button.html @@ -0,0 +1 @@ +微信登录 \ No newline at end of file diff --git a/application/plugins/view/weixinwebauthorization/index/public/auth_text.html b/application/plugins/view/weixinwebauthorization/index/public/auth_text.html new file mode 100644 index 000000000..4363c7ebc --- /dev/null +++ b/application/plugins/view/weixinwebauthorization/index/public/auth_text.html @@ -0,0 +1 @@ +微信登录 \ No newline at end of file diff --git a/application/plugins/weixinwebauthorization/Hook.php b/application/plugins/weixinwebauthorization/Hook.php new file mode 100644 index 000000000..b5b65d2cb --- /dev/null +++ b/application/plugins/weixinwebauthorization/Hook.php @@ -0,0 +1,85 @@ +ButtonHtml($params); + break; + + // 公共顶部小导航钩子-左侧 + case 'plugins_view_header_navigation_top_left' : + $ret = $this->NavTextHtml($params); + break; + + default : + $ret = ''; + } + return $ret; + } + } + + /** + * 登录登录html + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2019-05-24 + * @desc description + * @param array $params [description] + */ + private function ButtonHtml($params = []) + { + return $this->fetch('../../../plugins/view/weixinwebauthorization/index/public/auth_button'); + } + + /** + * 文字登录html + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2019-05-24 + * @desc description + * @param array $params [description] + */ + private function NavTextHtml($params = []) + { + return $this->fetch('../../../plugins/view/weixinwebauthorization/index/public/auth_text'); + } +} +?> \ No newline at end of file diff --git a/application/plugins/weixinwebauthorization/admin/Admin.php b/application/plugins/weixinwebauthorization/admin/Admin.php new file mode 100644 index 000000000..7192552ae --- /dev/null +++ b/application/plugins/weixinwebauthorization/admin/Admin.php @@ -0,0 +1,85 @@ +assign('data', $ret['data']); + return $this->fetch('../../../plugins/view/weixinwebauthorization/admin/admin/index'); + } else { + return $ret['msg']; + } + } + + /** + * 编辑页面 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2019-02-07T08:21:54+0800 + * @param [array] $params [输入参数] + */ + public function saveinfo($params = []) + { + $ret = PluginsService::PluginsData('weixinwebauthorization'); + if($ret['code'] == 0) + { + // 授权方式 + $is_auth_type_list = [ + 0 => array('id' => 0, 'name' => '静默授权', 'checked' => true), + 1 => array('id' => 1, 'name' => '弹出授权'), + ]; + + $this->assign('is_auth_type_list', $is_auth_type_list); + $this->assign('data', $ret['data']); + return $this->fetch('../../../plugins/view/weixinwebauthorization/admin/admin/saveinfo'); + } else { + return $ret['msg']; + } + } + + /** + * 数据保存 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2019-02-07T08:21:54+0800 + * @param [array] $params [输入参数] + */ + public function save($params = []) + { + return PluginsService::PluginsDataSave(['plugins'=>'weixinwebauthorization', 'data'=>$params]); + } +} +?> \ No newline at end of file diff --git a/application/plugins/weixinwebauthorization/config.json b/application/plugins/weixinwebauthorization/config.json new file mode 100644 index 000000000..83f519d81 --- /dev/null +++ b/application/plugins/weixinwebauthorization/config.json @@ -0,0 +1,30 @@ +{ + "base":{ + "plugins":"weixinwebauthorization", + "name":"微信登录", + "logo":"\/static\/upload\/images\/plugins_weixinwebauthorization\/2019\/05\/24\/1558681549248354.jpg", + "author":"Devil", + "author_url":"https:\/\/shopxo.net\/", + "version":"1.0.0", + "desc":"微信授权登录、注册", + "apply_terminal":[ + "pc", + "h5" + ], + "apply_version":[ + "1.5.0" + ], + "is_home":false + }, + "hook":{ + "plugins_view_user_login_info_top":[ + "app\\plugins\\weixinwebauthorization\\Hook" + ], + "plugins_view_user_reg_info_top":[ + "app\\plugins\\weixinwebauthorization\\Hook" + ], + "plugins_view_header_navigation_top_left":[ + "app\\plugins\\weixinwebauthorization\\Hook" + ] + } +} \ No newline at end of file diff --git a/application/plugins/weixinwebauthorization/index/Auth.php b/application/plugins/weixinwebauthorization/index/Auth.php new file mode 100644 index 000000000..b23ac31a7 --- /dev/null +++ b/application/plugins/weixinwebauthorization/index/Auth.php @@ -0,0 +1,75 @@ +assign('msg', 'appid未配置'); + return $this->fetch('public/tips_error'); + } + + // 回调地址 + $redirect_uri = urlencode(PluginsHomeUrl('weixinwebauthorization', 'auth', 'callback')); + + // 授权方式 + $auth_type = (isset($ret['data']['auth_type']) && $ret['data']['auth_type'] == 1) ? 'snsapi_userinfo' : 'snsapi_base'; + + // 授权code + $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$ret['data']['appid'].'&redirect_uri='.$redirect_uri.'&response_type=code&scope='.$auth_type.'&state=login#wechat_redirect'; + return redirect($url); + } else { + $this->assign('msg', $ret['msg']); + return $this->fetch('public/tips_error'); + } + } + + /** + * 回调 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2019-02-07T08:21:54+0800 + * @param [array] $params [输入参数] + */ + public function callback($params = []) + { + echo '
';
+        print_r($params);
+    }
+
+}
+?>
\ No newline at end of file
diff --git a/application/tags.php b/application/tags.php
index 10963e1ee..cdcd9c78f 100755
--- a/application/tags.php
+++ b/application/tags.php
@@ -103,10 +103,12 @@ return array (
   'plugins_view_header_navigation_top_left' => 
   array (
     0 => 'app\\plugins\\touristbuy\\Hook',
+    1 => 'app\\plugins\\weixinwebauthorization\\Hook',
   ),
   'plugins_view_user_login_info_top' => 
   array (
     0 => 'app\\plugins\\touristbuy\\Hook',
+    1 => 'app\\plugins\\weixinwebauthorization\\Hook',
   ),
   'plugins_view_user_reg_info' => 
   array (
@@ -154,5 +156,9 @@ return array (
   array (
     0 => 'app\\plugins\\wallet\\Hook',
   ),
+  'plugins_view_user_reg_info_top' => 
+  array (
+    0 => 'app\\plugins\\weixinwebauthorization\\Hook',
+  ),
 );
 ?>
\ No newline at end of file
diff --git a/public/static/plugins/css/weixinwebauthorization/admin/admin.css b/public/static/plugins/css/weixinwebauthorization/admin/admin.css
new file mode 100755
index 000000000..548dc59f4
--- /dev/null
+++ b/public/static/plugins/css/weixinwebauthorization/admin/admin.css
@@ -0,0 +1,11 @@
+/**
+ * 首页
+ */
+.weixinwebauthorization-content .items {
+    margin: 10px 0 20px 0;
+    border-bottom: 1px dashed #f1f1f1;
+    padding-bottom: 20px;
+}
+.weixinwebauthorization-content .edit-submit {
+    margin-bottom: 20px;
+}
\ No newline at end of file
diff --git a/public/static/upload/images/plugins_weixinwebauthorization/2019/05/24/1558681549248354.jpg b/public/static/upload/images/plugins_weixinwebauthorization/2019/05/24/1558681549248354.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a6b85d46167fb62b4d210d3a19ee39e2a911c05a
GIT binary patch
literal 8946
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

literal 0
HcmV?d00001

-- 
GitLab