diff --git a/.env b/.env index 0a797c4..e6d65dd 100644 --- a/.env +++ b/.env @@ -28,4 +28,6 @@ REGIONID=cn-hangzhou SIGNNAME=域展科技 TEMPLATECODE=SMS_176560077 OSS_BUCKET=hphb-storage -OSS_ENDPOINT=oss-cn-beijing.aliyuncs.com +OSS_ENDPOINT=hphb-cdn.uzchain.tech +#OSS_ENDPOINT=oss-cn-beijing.aliyuncs.com + diff --git a/app/common.php b/app/common.php index d89c01a..4288dc2 100644 --- a/app/common.php +++ b/app/common.php @@ -5,88 +5,104 @@ use think\facade\Db; //系统或是代码错误 -const SYSTEM_ERROR_CODE = 999999; +const SYSTEM_ERROR_CODE = 999999; const SYSTEM_ERROR_MESSAGE = "系统繁忙"; -const SUCCESS_CODE = 0; +const SUCCESS_CODE = 0; const SUCCESS_MESSAGE = "操作成功"; -const ERROR_CODE = 1; +const ERROR_CODE = 1; const ERROR_MESSAGE = "具体提示"; -const NEED_LOGIN = 20000; +const NEED_LOGIN = 20000; const NEED_LOGIN_MESSAGE = "需要登录后再操作"; -const MISSING_PARAMETER = 30000; +const MISSING_PARAMETER = 30000; const MISSING_PARAMETER_MESSAGE = "缺少参数"; -const TYPE_PARAMETER = 30001; +const TYPE_PARAMETER = 30001; const TYPE_PARAMETER_MESSAGE = "参数类型错误"; -const TOKEN_ERROR = 40001; +const TOKEN_ERROR = 40001; const TOKEN_ERROR_MESSAGE = "token错误"; -const SIGN_ERROR = 40002; +const SIGN_ERROR = 40002; const SIGN_ERROR_MESSAGE = "签名错误"; -const TIMEOUT_ERROR = 40004; +const TIMEOUT_ERROR = 40004; const TIMEOUT_ERROR_MESSAGE = "数据超时"; // 获取客户端IP -if(!function_exists('get_client_ip')){ - function get_client_ip(){ - if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) +if (! function_exists('get_client_ip')) { + function get_client_ip() + { + if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) { $ip = getenv("HTTP_CLIENT_IP"); - else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) - $ip = getenv("HTTP_X_FORWARDED_FOR"); - else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) - $ip = getenv("REMOTE_ADDR"); - else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) - $ip = $_SERVER['REMOTE_ADDR']; - else - $ip = "unknown"; - return($ip); + } else { + if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) { + $ip = getenv("HTTP_X_FORWARDED_FOR"); + } else { + if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) { + $ip = getenv("REMOTE_ADDR"); + } else { + if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], + "unknown")) { + $ip = $_SERVER['REMOTE_ADDR']; + } else { + $ip = "unknown"; + } + } + } + } + return ($ip); } } -if(!function_exists('show')){ - function show($message = '',$code = ERROR_CODE,$data = [],$appKey="",$httpStatus = 200){ - if($appKey == "" && !empty($GLOBALS['appkey'])){ +if (! function_exists('show')) { + function show($message = '', $code = ERROR_CODE, $data = [], $appKey = "", $httpStatus = 200) + { + if ($appKey == "" && ! empty($GLOBALS['appkey'])) { $appKey = $GLOBALS['appkey']; } - $result = ["code" => $code,"message"=>$message,"data"=>$data]; - if(env("APP_DEBUG")){ - return json($result,$httpStatus); + $result = ["code" => $code, "message" => $message, "data" => $data]; + if (env("APP_DEBUG")) { + return json($result, $httpStatus); } - return json(["RD"=>app\tools\Aes::encrypt(json_encode($result),$appKey)],$httpStatus); + return json(["RD" => app\tools\Aes::encrypt(json_encode($result), $appKey)], $httpStatus); } } /** * 验证手机号是否正确 + * + * @param number $mobile * @author honfei - * @param number $mobile */ -if(!function_exists('is_mobile_number')) { +if (! function_exists('is_mobile_number')) { function is_mobile_number($mobile) { - if (!is_numeric($mobile)) return false; - return (bool)preg_match('#^1[3,4,5,7,8,9]{1}[\d]{9}$#', $mobile); + if (! is_numeric($mobile)) { + return false; + } + return (bool) preg_match('#^1[3,4,5,7,8,9]{1}[\d]{9}$#', $mobile); } } /** * 生成随机字符串 - * @param int $length 生成随机字符串的长度 - * @param string $char 组成随机字符串的字符串 + * + * @param int $length 生成随机字符串的长度 + * @param string $char 组成随机字符串的字符串 * @return string $string 生成的随机字符串 */ -if(!function_exists('strRand')) { - function strRand(int $length = 32, string $char = '0123456789&abcdefghijklmnopqrstuvwxyz@ABCDEFGHIJKLMNOPQRSTUVWXYZ$') - { - if (!is_int($length) || $length < 0) { +if (! function_exists('strRand')) { + function strRand( + int $length = 32, + string $char = '0123456789&abcdefghijklmnopqrstuvwxyz@ABCDEFGHIJKLMNOPQRSTUVWXYZ$' + ) { + if (! is_int($length) || $length < 0) { return false; } $string = ''; @@ -98,57 +114,60 @@ if(!function_exists('strRand')) { } - /** * Discuz 经典双向加密/解密 - * @param string $string 明文 或 密文 - * @param string $operation DECODE表示解密,其它表示加密 - * @param string $key 密匙 - * @param string $expiry 密文有效期 + * + * @param string $string 明文 或 密文 + * @param string $operation DECODE表示解密,其它表示加密 + * @param string $key 密匙 + * @param string $expiry 密文有效期 */ -if(!function_exists('authcode')) { +if (! function_exists('authcode')) { function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { if ($operation == 'DECODE') { $string = str_replace(' ', '+', $string); } - $ckey_length = 4; - $key = md5($key ? $key : env('data_auth_key')); - $keya = md5(substr($key, 0, 16)); - $keyb = md5(substr($key, 16, 16)); - $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : ''; - $cryptkey = $keya . md5($keya . $keyc); - $key_length = strlen($cryptkey); - $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string; + $ckey_length = 4; + $key = md5($key ? $key : env('data_auth_key')); + $keya = md5(substr($key, 0, 16)); + $keyb = md5(substr($key, 16, 16)); + $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, + $ckey_length) : substr(md5(microtime()), -$ckey_length)) : ''; + $cryptkey = $keya.md5($keya.$keyc); + $key_length = strlen($cryptkey); + $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', + $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; $string_length = strlen($string); - $result = ''; - $box = range(0, 255); - $rndkey = []; + $result = ''; + $box = range(0, 255); + $rndkey = []; for ($i = 0; $i <= 255; $i++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } for ($j = $i = 0; $i < 256; $i++) { - $j = ($j + $box[$i] + $rndkey[$i]) % 256; - $tmp = $box[$i]; + $j = ($j + $box[$i] + $rndkey[$i]) % 256; + $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } for ($a = $j = $i = 0; $i < $string_length; $i++) { - $a = ($a + 1) % 256; - $j = ($j + $box[$a]) % 256; - $tmp = $box[$a]; + $a = ($a + 1) % 256; + $j = ($j + $box[$a]) % 256; + $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; - $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); + $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if ($operation == 'DECODE') { - if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) { + if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, + 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { - return $keyc . str_replace('=', '', base64_encode($result)); + return $keyc.str_replace('=', '', base64_encode($result)); } } } @@ -190,31 +209,31 @@ if (!function_exists('aliyun')) { } } */ -if (!function_exists('aliyun')) { +if (! function_exists('aliyun')) { function aliyun($localfile = '', $path = '') { - $config = [ - 'access' => env('ALIYUNSMS.ACCESSKEYID'), + $config = [ + 'access' => env('ALIYUNSMS.ACCESSKEYID'), 'access_key' => env('ALIYUNSMS.ACCESSKEY'), - 'bucket' => 'hphb-storage', - 'url' => 'https://oss-cn-beijing.aliyuncs.com' + 'bucket' => env('ALIYUNSMS.OSS_BUCKET'), + 'url' => env('ALIYUNSMS.OSS_ENDPOINT'), ]; - $path = "r/".$localfile; - $localfile = env("UPLOAD_DIRECTORY").'/' . $localfile;//文件路径,必须是本地的。 - if (!file_exists($localfile)) { + $path = "r/".$localfile; + $localfile = env("UPLOAD_DIRECTORY").'/'.$localfile;//文件路径,必须是本地的。 + if (! file_exists($localfile)) { return ('Not found file'); } if ($path == "") { return ['code' => 1, 'message' => "远程文件名不能为空"]; } - $accessKeyId = $config['access']; + $accessKeyId = $config['access']; $accessKeySecret = $config['access_key']; - $endpoint = $config['url']; + $endpoint = $config['url']; try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint); - $info = $ossClient->uploadFile($config['bucket'], $path, $localfile); - if(empty($info['info']['url'])){ + $info = $ossClient->uploadFile($config['bucket'], $path, $localfile); + if (empty($info['info']['url'])) { return ['code' => 1, 'message' => "上传失败"]; } return ['code' => 0, 'message' => "", 'url' => $info['info']['url']]; @@ -225,58 +244,66 @@ if (!function_exists('aliyun')) { } - function getExt($filename) { - $arr = explode('.',$filename); + $arr = explode('.', $filename); return array_pop($arr); } -function StudentToArray($list = []) : array { - $result = []; +function StudentToArray($list = []): array +{ + $result = []; $result['lastIndex'] = 0; - $result['list']=[]; - foreach($list as $key => $vo){ - if($vo['id']>$result['lastIndex']){ + $result['list'] = []; + foreach ($list as $key => $vo) { + if ($vo['id'] > $result['lastIndex']) { $result['lastIndex'] = $vo['id']; } $result["list"][] = [ - "id"=>$vo['id'], - "hot"=>$vo['hot'], - "avatar"=>$vo['avatar'], - "nickname"=>$vo['nickname'], - "is_disabled"=>$vo['disabled'], - "type"=>$vo["type"], - "identifier"=>$vo['identifier'], - "article_count"=>$vo['article_count'], - "city"=>$vo['city'], - "school"=>$vo['school'], - "age"=>$vo['age'], + "id" => $vo['id'], + "hot" => $vo['hot'], + "avatar" => $vo['avatar'], + "nickname" => $vo['nickname'], + "is_disabled" => $vo['disabled'], + "type" => $vo["type"], + "identifier" => $vo['identifier'], + "article_count" => $vo['article_count'], + "city" => $vo['city'], + "school" => $vo['school'], + "age" => $vo['age'], ]; } - if(count($list)where("id", "IN", $UserIds)->field($getFieldString)->select()->toArray(); + $UserLists = Db::name("app_users")->where("id", "IN", + $UserIds)->field($getFieldString)->select()->toArray(); foreach ($UserLists as $vo) { $getAllUsersMessage[$vo['id']] = $vo; } diff --git a/app/controller/Wechat.php b/app/controller/Wechat.php index 5ba9307..e583cd3 100644 --- a/app/controller/Wechat.php +++ b/app/controller/Wechat.php @@ -2,9 +2,11 @@ namespace app\controller; +use app\model\AppUser; use EasyWeChat\Factory; use EasyWeChat\OfficialAccount\Application; use think\facade\Config; +use think\facade\Db; use think\facade\Request; use think\facade\Route; use think\facade\View; @@ -39,7 +41,7 @@ class Wechat ->domain(true); $this->initWechat(); - return show(SUCCESS_MESSAGE,SUCCESS_CODE,$this->app->oauth->scopes(['snsapi_userinfo'])->redirect($redirect)); + return show(SUCCESS_MESSAGE, SUCCESS_CODE, $this->app->oauth->scopes(['snsapi_userinfo'])->redirect($redirect)); } /** @@ -54,16 +56,20 @@ class Wechat $user = $this->app->oauth->user(); $callback = Request::get('callback'); - $token = '怎样获得一个 token'; - return redirect($callback.'?token='.$token); + $user = AppUser::where('openid', $user->getId())->find(); - // $user 可以用的方法: - // $user->getId(); // 对应微信的 OPENID - // $user->getNickname(); // 对应微信的 nickname - // $user->getName(); // 对应微信的 nickname - // $user->getAvatar(); // 头像网址 - // $user->getOriginal(); // 原始API返回的结果 - // $user->getToken(); // access_token, 比如用于地址共享时使用 + if (! $user) { + $user = AppUser::create([ + 'nickname' => $user->getNickname(), + 'avatar' => $user->getAvatar(), + 'identity' => 1, + 'openid' => $user->getId(), + ]); + } + $tokenData = ['userid' => $user->id, 'loginTime' => time(), 'rankStr' => strRand(5)]; + $token = authcode(json_encode($tokenData), 'ENCODE'); + + return redirect($callback.'?token='.$token); } /** @@ -74,6 +80,13 @@ class Wechat */ public function payment() { + $userId = $GLOBALS['data']['userid']; + if (empty($userId)) { + return show("未登录!", NEED_LOGIN); + } + + $user = AppUser::find($userId); + $notifyUrl = Route::buildUrl('wechat/paid') ->suffix(false) ->domain(true); @@ -85,7 +98,7 @@ class Wechat 'total_fee' => 100, 'notify_url' => $notifyUrl, 'trade_type' => 'JSAPI', - 'openid' => '$openid', + 'openid' => $user->openid, ]); dump($unify); // $prepayId = $unify->prepay_id; diff --git a/app/model/AppUser.php b/app/model/AppUser.php new file mode 100644 index 0000000..5525471 --- /dev/null +++ b/app/model/AppUser.php @@ -0,0 +1,10 @@ +