微信入口、生成菜单,公众号授权获取用户信息(unionid)

本篇主要存储一次原来自己使用的微信公众号开发的一些小功能

比较常用的为配置微信入口、生成菜单、已经授权登录获取用户信息一些小功能。

不过,最好还是多看微信开发文档。文档地址:跳转微信开发文档

不多说什么了,直接上代码:

<?php
namespace app\index\controller;
/**
 *微信接入类
 */
use think\Controller;

define("TOKEN", "TOKEN");          #微信公众号 TOKEN

class Wx  extends Controller
{
    var $appid     = 'APPID';      #微信公众号appid
    var $appsecret = 'APPSECRET';  #微信公众号appsecret

    #微信入口验证
    public function valid()
    {
        $echoStr = isset($_GET["echostr"])?$_GET["echostr"]:null;

        if($this->checkSignature()){
            echo $echoStr;
            //exit;
        }
        // else{
        //     $this->responseMsg();
        // }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];    
                
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }

    #获取 基础 Access_token  
    public function get_access_token()
    {
#accestoken有7200秒时效,获取后请尽量找地方存储,不要每次调用每次获取
#下面是我存储的accesstoken与失效时间,各位看官大大可以自由存储
$accesstoken = getConfigValue('accesstoken'); $tokentime = getConfigValue('tokentime'); #如果token 的时间已经小于当前时间, 从新获取 if($tokentime < time()) { #获取配置参数 $appId = $this->appid; $appSecret = $this->appsecret; //获取access_token字符串 $tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret; // 如果是企业号用以下URL获取access_token // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret"; $res = $this->https_request($tokenUrl); //提取access_token字符串 解析json字符串 $data = json_decode($res, true); #修改对应存储 model('config')->where('code','accesstoken')->update(['value'=>$data['access_token']]); model('config')->where('code','tokentime')->update(['value'=>time()+7000]); $tokens = $data['access_token']; }else{ $tokens = $accesstoken; } // return $data['access_token']; return $tokens; } #生成菜单 public function makeMenu() { $accessToken = $this->get_access_token(); // $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$accessToken; $data = ' { "button":[ { "type": "view", "name": "单级菜单", "url": "对应路径" }, { "name":"多级菜单", "sub_button":[ { "type":"view", "name":"一级菜单", "url":"最多三个" }, { "type":"view", "name":"二级菜单", "url":"最多五个" } ] } ] }'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$accessToken); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { echo curl_error($ch); } curl_close($ch); echo $tmpInfo; } #授权第一步 获取code public function getReturn() { $appid = $this->appid; #回调地址 $redirect_uri = '回调路径'; #如果拼接字符串 $data = []; $data[0] = $_GET['state']; if(!empty($_GET['recode'])) { $data[1] = $_GET['recode']; } $state = implode(",",$data); #请求授权 $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=".$redirect_uri."response_type=code&scope=snsapi_userinfo&state=$state#wechat_redirect"; header("Location:$url"); die; } #授权登录 并获取授权用户信息 public function getUserCode() { $appid = $this->appid; $secret = $this->appsecret; $code = $_GET["code"]; #获取授权用户对应的openid $get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code'; $json_obj = json_decode(file_get_contents($get_token_url,true),true); #获取授权用户信息 $openid = $json_obj['openid']; // $access_token = $json_obj['access_token']; // $get_user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN'; $get_user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$json_obj['access_token'].'&openid='.$openid.'&lang=zh_CN'; #带有unionid 的授权用户信息 -- 带有unionid 必须用基础access_token 来获取 $accessToken = $this->get_access_token(); $get_user_info_url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$accessToken.'&openid='.$openid.'&lang=zh_CN'; #获得用户的信息 $user_obj = json_decode(file_get_contents($get_user_info_url,true),true); $res = explode(',', $_GET['state']); #对应用户的state[0] 来指定跳转的路径 $loginUrl = "重定向路径"; #根据openid 来查找对应的用户信息 #进行其他操作 #进行重定向 $this->redirect($loginUrl); } # request 请求 private function https_request($url, $data = null) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)){ curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; } }

 

在刚开始微信开发的时候这个类库帮我不少。

有需要的小伙伴可以借鉴。

如有疑问可以留言

大家共同进步哈。

2020年04月21日

posted @ 2020-04-21 16:14  御风琊穹  阅读(916)  评论(0编辑  收藏  举报

春风十里,我喜欢你。可是你喜欢的人不喜欢你,哈哈....
人来人往,莫失莫忘。最终还是选择淡忘于回忆之中...
落日余晖,待你而归。但你终究不是为我而归..
一米阳光,温暖安放;心若向阳,无谓悲伤;轻安喜乐,次第花开 。