From 8d1f68a61cfe53f3b10d53ad54c50a76d87b857b Mon Sep 17 00:00:00 2001 From: gongfuxiang <2499232802@qq.com> Date: Wed, 2 Jan 2019 01:55:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/controller/User.php | 39 +++ extend/base/Wechat.php | 238 ++++++++++++++++++ public/appmini/old/wechat/app.js | 43 ++-- public/appmini/old/wechat/app.json | 4 +- .../appmini/old/wechat/pages/cart/cart.json | 2 - .../appmini/old/wechat/pages/cart/cart.wxml | 66 +++-- .../appmini/old/wechat/pages/login/login.js | 12 +- .../appmini/old/wechat/pages/login/login.wxml | 9 +- .../appmini/old/wechat/pages/login/login.wxss | 10 + 9 files changed, 355 insertions(+), 68 deletions(-) create mode 100644 extend/base/Wechat.php diff --git a/application/api/controller/User.php b/application/api/controller/User.php index 033537560..1593caf1f 100644 --- a/application/api/controller/User.php +++ b/application/api/controller/User.php @@ -102,6 +102,45 @@ class User extends Common } } + /** + * 微信小程序获取用户授权 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-11-06 + * @desc description + */ + public function WechatUserAuth() + { + $result = (new \base\Wechat('111', '222'))->GetAuthSessionKey(input('authcode')); + if($result !== false) + { + return DataReturn('授权登录成功', 0, $result); + } + return DataReturn('授权登录失败', -100); + } + + /** + * 微信小程序获取用户信息 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2018-11-06 + * @desc description + */ + public function WechatUserInfo() + { + $result = (new \base\Wechat('100', '200'))->DecryptData(R('encrypted_data'), input('iv'), input('openid')); + + if(is_array($result)) + { + $result['openid'] = $result['openId']; + $result['referrer']= isset($this->data_post['referrer']) ? intval($this->data_post['referrer']) : 0; + return UserService::AuthUserProgram($result, 'wechat_openid'); + } + return DataReturn('获取用户信息失败', -100); + } + /** * 百度小程序获取用户信息 * @author Devil diff --git a/extend/base/Wechat.php b/extend/base/Wechat.php new file mode 100644 index 000000000..7bbbf0867 --- /dev/null +++ b/extend/base/Wechat.php @@ -0,0 +1,238 @@ +_appid = $app_id; + $this->_appsecret = $app_secret; + } + + /** + * [DecryptData 检验数据的真实性,并且获取解密后的明文] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2017-12-30T18:20:53+0800 + * @param [string] $encrypted_data [加密的用户数据] + * @param [string] $iv [与用户数据一同返回的初始向量] + * @param [string] $openid [解密后的原文] + * @return [array|string] [成功返回用户信息数组, 失败返回错误信息] + */ + public function DecryptData($encrypted_data, $iv, $openid) + { + // 登录授权session + $login_key = 'wechat_user_login_'.$openid; + $session_data = GS($login_key); + if($session_data === false) + { + return 'session key不存在'; + } + $aes_key = base64_decode($session_data['session_key']); + + if(strlen($iv) != 24) + { + return 'iv长度错误'; + } + $aes_iv = base64_decode($iv); + + $aes_cipher = base64_decode($encrypted_data); + $result = openssl_decrypt($aes_cipher, "AES-128-CBC", $aes_key, 1, $aes_iv); + $data = json_decode($result, true); + if($data == NULL) + { + return '数据解密失败'; + } + if($data['watermark']['appid'] != $this->_appid ) + { + return 'appid不匹配'; + } + + // 缓存存储 + $data_key = 'wechat_user_info_'.$openid; + SS($data_key, $data); + + return $data; + } + + /** + * [GetAuthSessionKey 根据授权code获取 session_key 和 openid] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2017-12-30T18:20:53+0800 + * @param [string] $authcode [用户授权码] + * @return [string|boolean] [失败false, 成功返回appid|] + */ + public function GetAuthSessionKey($authcode) + { + // 请求获取session_key + $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$this->_appid.'&secret='.$this->_appsecret.'&js_code='.$authcode.'&grant_type=authorization_code'; + $result = $this->HttpRequestGet($url); + if(!empty($result['openid'])) + { + // 从缓存获取用户信息 + $key = 'wechat_user_login_'.$result['openid']; + + // 缓存存储 + SS($key, $result); + return $result['openid']; + } + return false; + } + + /** + * [MiniQrCodeCreate 二维码创建] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2018-01-02T19:53:10+0800 + * @param [array] $params [输入参数] + * @return [string] [成功返回文件流, 失败则空] + */ + public function MiniQrCodeCreate($params) + { + // 参数校验 + if(empty($params['path'])) + { + return '页面地址不能为空'; + } + $params['width'] = empty($params['width']) ? 1000 : intval($params['width']); + + // 获取access_token + $access_token = $this->GetMiniAccessToken(); + if($access_token === false) + { + return ''; + } + + // 网络请求 + $url = 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token='.$access_token; + $data = [ + 'path' => $params['path'], + 'width' => $params['width'], + ]; + return $this->HttpRequestPost($url, json_encode($data), false); + } + + /** + * [GetMiniAccessToken 获取access_token] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2018-01-02T19:53:42+0800 + */ + private function GetMiniAccessToken() + { + // 缓存key + $key = $this->_appid.'_access_token'; + $result = GS($key); + if($result !== false) + { + if($result['expires_in'] > time()) + { + return $result['access_token']; + } + } + + // 网络请求 + $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->_appid.'&secret='.$this->_appsecret; + $result = $this->HttpRequestGet($url); + if(!empty($result['access_token'])) + { + // 缓存存储 + $result['expires_in'] += time(); + SS($key, $result); + return $result['access_token']; + } + return false; + } + + /** + * [HttpRequestGet get请求] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2018-01-03T19:21:38+0800 + * @param [string] $url [url地址] + * @return [array] [返回数据] + */ + private function HttpRequestGet($url) + { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_TIMEOUT, 500); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curl, CURLOPT_URL, $url); + + $res = curl_exec($curl); + curl_close($curl); + return json_decode($res, true); + } + + /** + * [HttpRequestPost curl模拟post] + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @datetime 2017-09-25T09:10:46+0800 + * @param [string] $url [请求地址] + * @param [array] $data [发送的post数据] + * @param [array] $is_parsing [是否需要解析数据] + * @return [array] [返回的数据] + */ + private function HttpRequestPost($url, $data, $is_parsing = true) + { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_TIMEOUT, 500); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + curl_setopt($curl, CURLOPT_POST, true); + + $res = curl_exec($curl); + if($is_parsing === true) + { + return json_decode($reponse, true); + } + return $res; + } + +} +?> \ No newline at end of file diff --git a/public/appmini/old/wechat/app.js b/public/appmini/old/wechat/app.js index e57f341a4..fa8687fb5 100755 --- a/public/appmini/old/wechat/app.js +++ b/public/appmini/old/wechat/app.js @@ -205,18 +205,6 @@ App({ } }, - /** - * 获取本系统用户信息 - */ - GetMyUserInfo() { - var user = this.GetUserCacheInfo(); - if (user == false) { - return null; - } else { - return user.my_user || null; - } - }, - /** * 从缓存获取用户信息 */ @@ -225,9 +213,6 @@ App({ if ((user || null) == null) { return false; } - if ((user.my_user || null) == null) { - user.my_user = null; - } return user; }, @@ -258,17 +243,21 @@ App({ // 请求授权接口 wx.getSetting({ success(res) { + console.log('app.js 授权部分'); + wx.navigateTo({ + url: "/pages/login/login" + }); if (!res.authSetting['scope.userInfo']) { - wx.authorize({ - scope: 'scope.userInfo', - success() { - $this.user_auth_login(object, method); - }, - fail: (e) => { - wx.hideLoading(); - $this.showToast('授权失败'); - } - }); + // wx.authorize({ + // scope: 'scope.userInfo', + // success() { + // $this.user_auth_login(object, method); + // }, + // fail: (e) => { + // wx.hideLoading(); + // $this.showToast('授权失败'); + // } + // }); } else { $this.user_auth_login(object, method); } @@ -314,7 +303,7 @@ App({ success: (res) => { if (res.code) { wx.request({ - url: $this.get_request_url('GetWechatUserLogin', 'User'), + url: $this.get_request_url('WechatUserAuth', 'user'), method: 'POST', data: { authcode: res.code }, dataType: 'json', @@ -358,7 +347,7 @@ App({ success: function (res) { // 远程解密数据 wx.request({ - url: $this.get_request_url('GetWechatUserInfo', 'User'), + url: $this.get_request_url('WechatUserInfo', 'user'), method: 'POST', data: { encrypted_data: res.encryptedData, iv: res.iv, openid: openid }, dataType: 'json', diff --git a/public/appmini/old/wechat/app.json b/public/appmini/old/wechat/app.json index f22cf359e..955c7c089 100755 --- a/public/appmini/old/wechat/app.json +++ b/public/appmini/old/wechat/app.json @@ -1,8 +1,8 @@ { - "pages": [ + "pages": ["pages/cart/cart", "pages/index/index", "pages/goods-category/goods-category", - "pages/cart/cart", + "pages/user/user", "pages/web-view/web-view", "pages/login/login", diff --git a/public/appmini/old/wechat/pages/cart/cart.json b/public/appmini/old/wechat/pages/cart/cart.json index c75670bbf..312ca36b1 100755 --- a/public/appmini/old/wechat/pages/cart/cart.json +++ b/public/appmini/old/wechat/pages/cart/cart.json @@ -1,7 +1,5 @@ { "enablePullDownRefresh": true, "usingComponents": { - "list-item": "mini-antui/es/list/list-item/index", - "swipe-action": "mini-antui/es/swipe-action/index" } } \ No newline at end of file diff --git a/public/appmini/old/wechat/pages/cart/cart.wxml b/public/appmini/old/wechat/pages/cart/cart.wxml index 9f077a1ee..f370ef7e7 100755 --- a/public/appmini/old/wechat/pages/cart/cart.wxml +++ b/public/appmini/old/wechat/pages/cart/cart.wxml @@ -1,41 +1,39 @@ - - - - - - + + + + + + + + + + + + + + + + {{item.title}} + + + {{spec.type}}:{{spec.value}} + + + + + - + + + - - - - - - - - - {{item.title}} - - - {{spec.type}}:{{spec.value}} - - - - - - - - + - - - - - ¥{{item.price}} - ¥{{item.original_price}} - x{{item.stock}} - + + + ¥{{item.price}} + ¥{{item.original_price}} + x{{item.stock}} - + diff --git a/public/appmini/old/wechat/pages/login/login.js b/public/appmini/old/wechat/pages/login/login.js index 293a89dea..d2a9eddfc 100755 --- a/public/appmini/old/wechat/pages/login/login.js +++ b/public/appmini/old/wechat/pages/login/login.js @@ -20,9 +20,19 @@ Page({ wx.setNavigationBarTitle({title: '手机绑定'}); // 设置用户信息 - this.setData({params: option, user: app.GetUserCacheInfo()}); + this.setData({ + params: option, + user: app.GetUserCacheInfo() || null + }); }, + /** + * 登录授权事件 + */ + get_user_info_event(e) { + console.log(e, e.detail.userInfo) + } + /** * 输入手机号码事件 */ diff --git a/public/appmini/old/wechat/pages/login/login.wxml b/public/appmini/old/wechat/pages/login/login.wxml index b28406139..3737c480e 100755 --- a/public/appmini/old/wechat/pages/login/login.wxml +++ b/public/appmini/old/wechat/pages/login/login.wxml @@ -1,4 +1,4 @@ - +
@@ -7,4 +7,9 @@
-
\ No newline at end of file +
+ + + 确认登录授权,为您提供更优质的服务 + + diff --git a/public/appmini/old/wechat/pages/login/login.wxss b/public/appmini/old/wechat/pages/login/login.wxss index c322498fc..48bd97576 100755 --- a/public/appmini/old/wechat/pages/login/login.wxss +++ b/public/appmini/old/wechat/pages/login/login.wxss @@ -46,4 +46,14 @@ page{ bottom: 34rpx; height: 90rpx; line-height: 90rpx; +} + +/** + 授权登录 +*/ +.wx-login { + padding-top: 30%; +} +.wx-login button { + margin-top: 30rpx; } \ No newline at end of file