PHP 网页扫码登录 , 推送模板消息

缘由: 因为老板要做个PC端的微信扫码绑定登录,关注公众号,推送模板消息的功能

框架: ThinkPHP 5

功能: 实现 扫码微信公众号授权登录绑定,推送模板消息

1.正式配置

  准备: 微信公众号(必须申请了服务号) Appid , AppSecret

  配置: 微信公众平台修改:  授权回调地址域名 , JS 接口安全域名 修改为自己的域名

2.测试配置

  在没有申请服务号的公众号的情况下,微信提供了测试账号进行配置测试

  步骤:

    1. 公众平台申请测试账号

    

 

    2. 获取到测试号的 Appid , AppSecret

    

 

    3. 配置 JS 接口安全域名 , 授权回调域名

    

 

 

    4. 关注测试公众号

 

    5. 添加测试模板,获取模板id

    

 

注意: 测试的模板消息内容固定为添加模板时的内容,转到正式环境中后需要根据选择的模板信息配置

 

 

微信网页扫码授权登录:

  微信文档地址:  https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

/**
     * 网页授权
     * 
     */
    public function weChatAuthorization()
    {
        // 要绑定的用户id
        $admin_id = 'id';

        // Appid
        $APPID = '微信公众平台获取的appid';

        // 网页授权回调地址
        $callback_url = '网页授权回调接口'; // 网页授权回调接口
        $redirect = urlencode($callback_url); // 编码

        // 调起微信授权地址
        $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$APPID."&redirect_uri=".$redirect."&response_type=code&scope=snsapi_userinfo&state=".$admin_id."#wechat_redirect";

        // 跳转授权页面
        header('location:'.$url);exit;
    }

    /**
     * 网页授权的回调
     */
    public function callback()
    {
        $APPID = '微信公众平台获取的appid';
        $APPSECRET = '微信公众平台获取的appsecret';

        // 获取当前url的参数部分
        $params = $_SERVER["QUERY_STRING"];    // s=/index/Wxopera/callback&code=code&state=STATE
        // 拆分成数组 得到code
        $arr = explode('&',$params);
        $code = explode('=',$arr[1]);
        $code = $code[1];

        // 得到要绑定的管理员id
        $admin = explode('=',$arr[2]);
        $admin_id = $admin[1];// 通过code获取网页授权access_token
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$APPID&secret=$APPSECRET&code=$code&grant_type=authorization_code";
        $res = $this->http_curl($url);

        // 获取用户信息
        $url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=".$res['access_token']."&openid=".$res['openid']."&lang=zh_CN";
        $userinfo = $this->http_curl($url2);

     // 到此 $userinfo 获取到用户信息
     // 获取到的具体用户信息 请移步微信文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
     // 下面可以进行自己的逻辑处理
 var_dump($userinfo);exit; } /** * curl请求 */ public function http_curl($url, $type = 'get', $res = 'json', $arr = '') { $cl = curl_init(); curl_setopt($cl, CURLOPT_URL, $url); curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, false); if($type == 'post'){ curl_setopt($cl, CURLOPT_POST, 1); curl_setopt($cl, CURLOPT_POSTFIELDS, $arr); } $output = curl_exec($cl); curl_close($cl); return json_decode($output, true); }

微信访问  weChatAuthorization 接口的接口连接

或者将  weChatAuthorization 接口的接口连接 生成二维码   微信扫码访问

 

发送模板消息

微信文档:  https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html#%E5%8F%91%E9%80%81%E6%A8%A1%E6%9D%BF%E6%B6%88%E6%81%AF

   /**
     * 推送模板消息
     * @param  string $openid  接收人的微信openid
     * @param  array $data  模板消息内容     
   * @return mixed
*/ public function do_send($openid) { // 获取 微信接口调用凭证 access_token $access_token = Cache::get('accessToken'); if(!$access_token){ $access_token = $this->accessToken(); } //模板消息 格式化 $json_template = $this->json_tempalte($openid); // 推送消息 $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $access_token; $res = $this->curl_post($url, urldecode($json_template)); return json_decode($res, true); } /** * 获取 access_token * 由于是循环多次进行推送 * 所以需要暂存一下 access_token */ public function accessToken() { $appid = Db::name('config')->where('name','Appid')->value('value'); $appsecret = Db::name('config')->where('name','AppSecret')->value('value'); // 获取 access_token $access_token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret; $json_token = $this->curl_post($access_token_url); $json_token = json_decode($json_token, true); if(!empty($json_token['errcode'])){ $this->error('推送失败,获取微信 access_token 失败'); } // 存入缓存 1小时 Cache::set('accessToken',$json_token['access_token'],3600); return $json_token['access_token']; } /** * 将模板消息json格式化 * @return false|string */ public function json_tempalte($openid) { //模板消息 $template = [ 'touser' => $openid, //接收者openid 'template_id' => "模板id", //模板消息的模板id 'data' =>[ // 数据
          'character_string11' => ['value' => '22'],
          'thing4' => ['value' => '模板名'],
          'time14' => ['value' => date('Y年m月d日 H:i',time())],
         ];
        ];
        return json_encode($template);
    }

    /**
     * curl请求
     * @param $url
     * @param $data
     * @return bool|string
     */
    public function curl_post($url, $data = array())
    {
        $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;
    }

 

发送模板消息传参如下

 

 具体传参请参考微信文档:  https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html#%E5%8F%91%E9%80%81%E6%A8%A1%E6%9D%BF%E6%B6%88%E6%81%AF

 

posted @ 2023-09-08 17:12  徐一一一凡  阅读(46)  评论(0)    收藏  举报