123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- <?php
- namespace app\api\controller;
- use app\common\controller\Api;
- /**
- * 政策集锦
- */
- class WeChat extends Api
- {
- //微信授权配置信息
- private $wechat_config = [
- 'appid' => 'wxe02aa578255f9184 ',
- 'appsecret' => '39ec8add0b8d4ed794e9cb330a334538',
- ];
- public function __construct()
- {
- $this->wechat_config = $this->wechatConfig();
- }
- /**
- * 获取秘钥配置
- * @return [type] 数组
- */
- public function wechatConfig()
- {
- // $wechat_config = array_merge($this->wechat_config, config('wechat.oauth'));
- $wechat_config = $this->wechat_config;
- return $wechat_config;
- }
- /**
- * 获取openid
- * @return string|mixed
- */
- public function getUserAccessUserInfo($code = "")
- {
- if (empty($code)) {
- $baseUrl = request()->url(true);
- $url = $this->getSingleAuthorizeUrl($baseUrl, "123");
- Header("Location: $url");
- exit();
- } else {
- $access_token = $this->getSingleAccessToken($code);
- return $this->getUserInfo($access_token);
- }
- }
- /**
- * 微信授权链接
- * @param string $redirect_uri 要跳转的地址
- * @return [type] 授权链接
- */
- public function getSingleAuthorizeUrl($redirect_url = "", $state = '1')
- {
- $redirect_url = urlencode($redirect_url);
- return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->wechat_config['appid'] . "&redirect_uri=" . $redirect_url . "&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";
- }
- /**
- * 获取token
- * @return [type] 返回token
- */
- public function getSingleAccessToken($code)
- {
- $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->wechat_config['appid'] . '&secret=' . $this->wechat_config['appsecret'] . '&code=' . $code . '&grant_type=client_credential';
- // $appid = $this->wechat_config['appid'];
- // $secret = "39ec8add0b8d4ed794e9cb330a334538";
- // echo $secret;die;
- // $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
- // dump($url);die;
- $access_token = $this->https_request($url);
- dump($access_token);die;
- return $access_token;
- }
- /**
- * 发送curl请求
- * @param $url string
- * @param return array|mixed
- */
- public function https_request($url)
- {
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- $AjaxReturn = curl_exec($curl);
- dump($AjaxReturn);die;
- //获取access_token和openid,转换为数组
- $data = json_decode($AjaxReturn, true);
- curl_close($curl);
- return $data;
- }
- /**
- * @explain
- * 通过code获取用户openid以及用户的微信号信息
- * @return array|mixed
- * @remark
- * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token
- * access_token每日获取次数是有限制的,access_token有时间限制,可以存储到数据库7200s. 7200s后access_token失效
- **/
- public function getUserInfo($access_token = [])
- {
- if (!$access_token) {
- return [
- 'code' => 0,
- 'msg' => '微信授权失败',
- ];
- }
- $userinfo_url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token['access_token'] . '&openid=' . $access_token['openid'] . '&lang=zh_CN';
- $userinfo_json = $this->https_request($userinfo_url);
- //获取用户的基本信息,并将用户的唯一标识保存在session中
- if (!$userinfo_json) {
- return [
- 'code' => 0,
- 'msg' => '获取用户信息失败!',
- ];
- }
- return $userinfo_json;
- }
- /**
- * 发送HTTP请求方法
- * @param string $url 请求URL
- * @param array $params 请求参数
- * @param string $method 请求方法GET/POST
- * @return array $data 响应数据
- */
- function httpCurl($url, $params, $method = 'POST', $header = array(), $multi = false){
- date_default_timezone_set('PRC');
- $opts = array(
- CURLOPT_TIMEOUT => 30,
- CURLOPT_RETURNTRANSFER => 1,
- CURLOPT_SSL_VERIFYPEER => false,
- CURLOPT_SSL_VERIFYHOST => false,
- CURLOPT_HTTPHEADER => $header,
- CURLOPT_COOKIESESSION => true,
- CURLOPT_FOLLOWLOCATION => 1,
- CURLOPT_COOKIE =>session_name().'='.session_id(),
- );
- /* 根据请求类型设置特定参数 */
- switch(strtoupper($method)){
- case 'GET':
- // $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
- // 链接后拼接参数 & 非?
- $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
- break;
- case 'POST':
- //判断是否传输文件
- $params = $multi ? $params : http_build_query($params);
- $opts[CURLOPT_URL] = $url;
- $opts[CURLOPT_POST] = 1;
- $opts[CURLOPT_POSTFIELDS] = $params;
- break;
- default:
- throw new Exception('不支持的请求方式!');
- }
- /* 初始化并执行curl请求 */
- $ch = curl_init();
- curl_setopt_array($ch, $opts);
- $data = curl_exec($ch);
- $error = curl_error($ch);
- curl_close($ch);
- if($error) throw new Exception('请求发生错误:' . $error);
- return $data;
- }
- /**
- * 微信信息解密
- * @param string $appid 小程序id
- * @param string $sessionKey 小程序密钥
- * @param string $encryptedData 在小程序中获取的encryptedData
- * @param string $iv 在小程序中获取的iv
- * @return array 解密后的数组
- */
- function decryptData( $appid , $sessionKey, $encryptedData, $iv ){
- $OK = 0;
- $IllegalAesKey = -41001;
- $IllegalIv = -41002;
- $IllegalBuffer = -41003;
- $DecodeBase64Error = -41004;
- if (strlen($sessionKey) != 24) {
- return $IllegalAesKey;
- }
- $aesKey=base64_decode($sessionKey);
- if (strlen($iv) != 24) {
- return $IllegalIv;
- }
- $aesIV=base64_decode($iv);
- $aesCipher=base64_decode($encryptedData);
- $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
- $dataObj=json_decode( $result );
- if( $dataObj == NULL )
- {
- return $IllegalBuffer;
- }
- if( $dataObj->watermark->appid != $appid )
- {
- return $DecodeBase64Error;
- }
- $data = json_decode($result,true);
- return $data;
- }
- /**
- * 请求过程中因为编码原因+号变成了空格
- * 需要用下面的方法转换回来
- */
- function define_str_replace($data)
- {
- return str_replace(' ','+',$data);
- }
- }
|