微信第三方平台受权

本文是微信第三方平台受权php

1.    写在前面redis

(1)环境:php5.6+easyWechat3.1json

(2)easyWechat目前最新版本是4.0,可是须要php7以上的运行环境。若是是php5.6环境仍是只能用3.1版本。有条件的尽可能可使用最新版本,由于新版本文档更详细,支持的功能更全面;api

(3)具体的接口调用和受权过程以微信开放平台文档(微信开放平台->资源中心->第三方平台,注意不是微信开发者文档)和easyWechat官方文档为主,能够先阅读一下这两个文档,了解一下受权过程;缓存

(4)同时各主流框架都已经支持该插件,详见easyWechat文档;这个demo使用原生的php+easyWechat;服务器

2.    受权须要的准备微信

(1)    微信第三方平台申请以及后台配置;申请:微信第三方平台的相关审核资料填写受权发起地址的域名、受权事件接收URL、服务器的ip白名单;这些都很是重要,后面开发会用到;并且微信审核都会须要必定时间;php7

(2)    域名和服务器,微信受权发起地址和通知地址是须要域名,具体请参考微信第三方平台申请需求;微信开发

受权过程app

(1)    下载easyWechat,参考easyWechat官方文档,使用composer下载;

(2)    配置文件config.php;

$options      = [ 'open_platform' => [ 'app_id'  => 'wx*******',
        'secret'  => '*******',
        'token'   => 'QPh4Dj*****9',
        'aes_key' => 'sdfsof*****dflsdd' ],

    /** * OAuth 配置 * * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login * callback:OAuth受权完成后的回调页地址(若是使用中间件,则随便填写。。。) */
    'oauth' => [ 'scopes' => ['snsapi_userinfo'],
        'callback' => '/callback', //受权回调地址
    ], ]; $appurl = "http://******t/";

 

这里面有第三方平台的相关信息配置,这些都在微信开发者平台中能取到;

(3)    受权入口文件index.php;

<?php /** * 第三方受权 * User: Julian * Date: 2018/6/7 */
include __DIR__ . '/vendor/autoload.php'; // 引入 composer 入口文件

use EasyWeChat\Foundation\Application; include __DIR__ . '/config.php'; // 引入 配置 入口文件

/** * 使用easywechat获取受权跳转地址 */
$app          = new Application($options); $openPlatform = $app->open_platform; $callback     = $appurl.'callbackFromPlatform.php'; //受权成功回调地址
$response     = $openPlatform->pre_auth->redirect($callback); //受权跳转地址
$url          = $response->getTargetUrl(); //注意 这里不能重定向直接跳转,会报发起域名为空的错 放到页面上点击或者跳转
echo "<a href='$url'>点击受权</a>";

    此页面只作了一个受权点击调转,若是会有一个waring:关于时区问题的话能够无论。也能够按照easyWechat官方文档的常见问题处理;

    注意根据微信的官方文档受权过程还包括预受权码等一系列繁琐的验证,这里不用担忧,easyWechat都已经作好了,有兴趣能够看一下他的源码

(4)点击跳转,就会调转到微信的一个受权页,须要公众号的管理员扫码受权;受权结果会经过微信后台配置的受权;事件接收URL异步通知;Demo里面配置的是到message.php;

message.php中参考文档作了一个自定义处理,其实就是在受权结果的返回时写了一个日志;也能够直接返回;这里还包括微信服务器10分钟一次的通知component_verify_ticket

<?php /** * 受权事件接收地址 * User: Julian * Date: 2018/6/7 */

include __DIR__ . '/vendor/autoload.php'; // 引入 composer 入口文件

use EasyWeChat\Foundation\Application; include __DIR__ . '/config.php'; // 引入 配置 入口文件

$app = new Application($options); $openPlatform = $app->open_platform; // 默认处理方式
$openPlatform->server->serve(); // 自定义处理,这里只写了一个日志;受权的信息easychart自动作了缓存

$openPlatform->server->setMessageHandler(function($event ) use ($openPlatform){ // 事件类型常量定义在 \EasyWeChat\OpenPlatform\Guard 类里
    $myfile = fopen("log.txt", "a"); switch ($event->InfoType) { case 'authorized':
            $authorizationInfo = $openPlatform->getAuthorizationInfo($event->AuthorizationCode)->authorization_info; $txt = "受权成功!appid:" . $authorizationInfo["authorizer_appid"] . '  token'.$authorizationInfo["authorizer_access_token"]; fwrite($myfile, $txt."\n"); break; case 'unauthorized':
            $txt = "受权取消!\n"; fwrite($myfile, $txt); break; case 'updateauthorized':
            $authorizationInfo = $openPlatform->getAuthorizationInfo($event->AuthorizationCode)->authorization_info; $txt = "更新受权!appid:" . $authorizationInfo["authorizer_appid"] . '  token'.$authorizationInfo["authorizer_access_token"]; fwrite($myfile, $txt."\n"); break; case 'component_verify_ticket':
            //十分钟通知一次的component_verify_ticket
            $txt = "component_verify_ticket!\n"; fwrite($myfile, $txt); break; default:
            $txt = "default!\n"; fwrite($myfile, $txt); break; } fclose($myfile); }); //若是不用自定义处理的话能够直接返回
$openPlatform->server->serve();

关于受权结果的返回带的authorizer_appid、authorizer_access_token、authorizer_refresh_token以及component_verify_ticket,easyWechat会本身缓存起来,而后在调用的时候取出,同时根据文档也支持redis等缓存,没有配置的话就默认文件缓存;

(5)受权完成以后会跳转到受权以前配置的回调地址,demo里面配置的是callbackFromPlatform.php,具体逻辑见代码注释;这里要注意的是:

  受权的微信公众号微信后台的开发者模式 “启用”;

  受权的微信公众号相关接口必定要调用权限这个在受权者的公众号后台均可以看到;

以上两点保证了受权以后才能正常调用相关的接口;

<?php /** * 受权给第三方平台以后的回调 * User: Julian * Date: 2018/6/7 */

include __DIR__ . '/vendor/autoload.php'; // 引入 composer 入口文件
include __DIR__ . '/config.php'; // 引入 配置 入口文件

use EasyWeChat\Foundation\Application; $app          = new Application($options); $openPlatform = $app->open_platform; //受权返会的受权信息 //$authorizationInfo['authorizer_appid'] 受权的公众号的appid //$authorizationInfo["authorizer_access_token"] 受权的公众号的access_token 有效时间是2小时 //$authorizationInfo["authorizer_refresh_token"] 受权的公众号的refresh_token 用做失效时候的刷新
$authorizationInfo = $openPlatform->getAuthorizationInfo()->authorization_info; var_dump($authorizationInfo); //代替受权的公众号调用接口 必须保证该公众号后台已经有该接口的调用权限 不然会报api unauthorized hint //获取微信ip 直接用accesstoken调用接口
$url = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token='.$authorizationInfo["authorizer_access_token"]; var_dump(curlGet($url)); $wechat = $app->open_platform->createAuthorizerApplication($authorizationInfo['authorizer_appid'], $authorizationInfo["authorizer_refresh_token"]); //用封装的方法调用接口
$userService = $wechat->user; $userList = $userService->lists($nextOpenId = null); var_dump($userList);die; function curlGet($url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); $res = curl_exec($ch); curl_close($ch); if($res) { return $res; } else { return json_encode([ "code"    => 400,
            "message" => "接口返回异常" ]); } }

 

6.受权以后掉demo里面写了两种调用方式,一种是easyWechat中封装好的,一种是直接根据微信文档调用;咱们发现调用接口其实只须要一个参数,也就是受权以后的返回的authorizer_access_token,须要注意的是authorizer_access_token的有限期只有两个小时,并且天天都会有额定刷新次数,这里建议本身作个缓存,authorizer_access_token到期以后用authorizer_refresh_token刷新;具体操做见微信开放平台的api第五条(https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1453779503&token=&lang=zh_CN);

相关文章
相关标签/搜索