微信第三方平臺受權

本文是微信第三方平臺受權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);

相關文章
相關標籤/搜索