当前位置: 首页 > news >正文

thinkphp5.1 easywechat4 微信第三方开放平台

需求描述

  1. 当前商城(uid标识)授权第三方开发平台.
  2. 网页授权成功后跳转到另一个商城项目链接并带上当前微信用户信息和微信初始化验证签名.

第三方平台授权

安装easywechat4
$ composer require overtrue/wechat:~4.0 -vvv
引用
use EasyWeChat\Factory;
创建一个跳转到微信扫二维码授权页面
/**
 * 开发平台授权跳转
 *
 * @return void
 */
public function accessView(){
    // 
    $uid = Request()->route('uid' , 0);
    $url = 'http://qgcloud.capsui.com/public/index/wxopen/config?uid=' . $uid;
    $this->assign('url' , $url);
    return $this->fetch();
}
跳转方法(为什么我不写到上一个方法呢 因为微信要求同一个地址)
/**
 * 开发平台跳转授权扫码页
 *
 * @return void
 */
public function config(){
    $uid = Request()->get('uid' , 0);
    $config = [
        'app_id'   => '开放平台第三方平台 APPID',
        'secret'   => '开放平台第三方平台 Secret',
        'token'    => '开放平台第三方平台 Token',
        'aes_key'  => '开放平台第三方平台 AES Key'
    ];
    $openPlatform = Factory::openPlatform($config);
    
    $url = $openPlatform->getPreAuthorizationUrl('http://qgcloud.capsui.com/public/index/wxopen/wxcallback?uid=' . $uid);

    $this->redirect($url);
}
授权回调(注意:扫码确认授权后他第一次回调不会带uid参数,)
引入 
use EasyWeChat\OpenPlatform\Server\Guard;
/**
 * 开发平台授权回调
 *
 * @return void
 */
public function wxcallback(){
    // 这个表是记录授权成功的
    //$Wxpublic   = new Wxpublic;
    // 这个表是记录授权成功后传过来所属uid商城绑定appid
    //$ShopConfig = new ShopConfig;

    $get = Request()->param();
    
    $config = [
        'app_id'   => '开放平台第三方平台 APPID',
        'secret'   => '开放平台第三方平台 Secret',
        'token'    => '开放平台第三方平台 Token',
        'aes_key'  => '开放平台第三方平台 AES Key'
    ];
    $openPlatform = Factory::openPlatform($config);
    $server       = $openPlatform->server;

    
    // 处理授权成功事件-第一次回调
    // 闭包方法!里面调用外面的方法请在use里面填写
    $server->push(function ($message) use ($openPlatform /*, $Wxpublic*/) {
        
        $authCode = $message['AuthorizationCode'];
        $res      = $openPlatform->handleAuthorize($authCode);

        if($res['authorization_info']['authorizer_refresh_token']){
            //授权成功记录到数据库
            //$Wxpublic->insert(['appid' => $res['authorization_info']['authorizer_appid'] , 'createtime' => time()]);
        }

    }, Guard::EVENT_AUTHORIZED);

    // 处理授权取消事件-第一次回调
    // 闭包方法!里面调用外面的方法请在use里面填写
    $server->push(function ($message) use(/*$Wxpublic , $ShopConfig*/) {
        //处理数据库逻辑
        //$Wxpublic::appid($message['AppId'])->delete();
        //$ShopConfig::appid($message['AppId'])->update(['token' => '']);
    }, Guard::EVENT_UNAUTHORIZED);
    
    // 第二次回调会带一个授权code和自定义参数商城id(uid)
    if(isset($get['auth_code']) && isset($get['uid'])){
        
        $res      = $openPlatform->handleAuthorize($get['auth_code']);
        $appid    = $res['authorization_info']['authorizer_appid'];
        //数据库逻辑
        //$isConfig = $Wxpublic::appid($appid)->count();
        
        //if($isConfig){
        //$add = $ShopConfig->where('uid' , $get['uid'])->update(['token' => $appid]);
        //}
    }

    return $server->serve();
}

第三方平台 网页授权&微信JSSDK初始化签名生成

/**
 * 网页授权调起
 *
 * @return void
 */
public function htmlAccess(){
    $appid = Request()->get('appid' , 0);
    
    $config = [
        'app_id'   => '开放平台第三方平台 APPID',
        'secret'   => '开放平台第三方平台 Secret',
        'token'    => '开放平台第三方平台 Token',
        'aes_key'  => '开放平台第三方平台 AES Key'
    ];
    $openPlatform = Factory::openPlatform($config);
    $data         = $openPlatform->getAuthorizer($appid);
    $appid        = $data['authorization_info']['authorizer_appid'];
    $refreshToken = $data['authorization_info']['authorizer_refresh_token'];

    $officialAccount = $openPlatform->officialAccount($appid , $refreshToken);
    $oauth           = $officialAccount->oauth;
    
    // 回调授权地址
    $url      = "http://qgcloud.capsui.com/public/index/wxopen/callbackOpenid";
    $response = $officialAccount->oauth->scopes(['snsapi_userinfo'])->redirect($url)->send();

}
网页授权回调方法
/**
 * 网页授权回调
 *
 * @return void
 */
public function callbackOpenid(){
    $appid = Request()->get('appid' , null);
    
    $config = [
        'app_id'   => '开放平台第三方平台 APPID',
        'secret'   => '开放平台第三方平台 Secret',
        'token'    => '开放平台第三方平台 Token',
        'aes_key'  => '开放平台第三方平台 AES Key'
    ];
    $openPlatform = Factory::openPlatform($config);
    $data         = $openPlatform->getAuthorizer($appid);
    
    $appid        = $data['authorization_info']['authorizer_appid'];
    $refreshToken = $data['authorization_info']['authorizer_refresh_token'];
    
    // 获取微信用户信息 如openid nickname等信息
    $officialAccount = $openPlatform->officialAccount($appid , $refreshToken);
    $oauth           = $officialAccount->oauth;
    $user            = $oauth->user();
    
    // 处理wxconfig初始化JSSDK
    $officialAccount->jssdk->setUrl('http://quguoshop.capsui.com/');
    $wxconfig = $officialAccount->jssdk->buildConfig(['chooseWXPay'], $debug = true, $beta = false, $json = true);

    $ShopConfig = new ShopConfig;
    $shopInfo   = $ShopConfig::appid($appid)->find();
    
    // 注意 这里我是带参数跳转到其他TP5项目里面再用缓存处理一下
    $url = 'http://quguoshop.capsui.com/public/wxoauthCallback?data=' . json_encode($user->toArray()) . '&token=' . $shopInfo['id'] . '&wxconfig=' . $wxconfig;
    $this->redirect($url);
}

相关文章:

  • java 实现每次从list中取5000条数据放入新list
  • BZOJ5018[Snoi2017]英雄联盟——DP
  • configparser , subprocess , xlrd , xlwt , xml , 面向对象
  • 开发基于以太坊智能合约的DApp
  • 面向对象学习小结
  • 代码生成器技术乱弹九,代码变变变,代码生成器之度量
  • Format 函数,%f,%d,%x,%p。 浮点型小数点位取值
  • axios一些书签
  • linux就该这么学 第一天学习笔记
  • 递归函数中,return的误区
  • vagrant 本地添加box 支持带版本号
  • ES6:解构赋值
  • 百度,内容质量部面试(一面+二面)面经
  • 浅谈Redis五种数据结构的底层原理
  • 程序清单4.2_praise1.c程序_《C Primer Plus》P62
  • 网络传输文件的问题
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS实用技巧干货
  • eclipse(luna)创建web工程
  • egg(89)--egg之redis的发布和订阅
  • iOS 颜色设置看我就够了
  • JS变量作用域
  • k8s 面向应用开发者的基础命令
  • laravel with 查询列表限制条数
  • 飞驰在Mesos的涡轮引擎上
  • 回顾 Swift 多平台移植进度 #2
  • 今年的LC3大会没了?
  • 排序算法之--选择排序
  • 如何胜任知名企业的商业数据分析师?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 收藏好这篇,别再只说“数据劫持”了
  • 数据可视化之 Sankey 桑基图的实现
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一些css基础学习笔记
  • 硬币翻转问题,区间操作
  • ​Java并发新构件之Exchanger
  • ​queue --- 一个同步的队列类​
  • #Java第九次作业--输入输出流和文件操作
  • $jQuery 重写Alert样式方法
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (java)关于Thread的挂起和恢复
  • (Matlab)使用竞争神经网络实现数据聚类
  • (NSDate) 时间 (time )比较
  • (poj1.2.1)1970(筛选法模拟)
  • (力扣)1314.矩阵区域和
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)LINQ之路
  • ..回顾17,展望18
  • .Family_物联网
  • .Net - 类的介绍
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET简谈设计模式之(单件模式)