微信開放平臺搭建之EasyWeChat

背景

  公司有一個產品,須要用到微信受權登陸及微信消息推送等功能。原本可以簡單的使用公衆號的接口將appid和appsecrect等信息寫到配置文件裏,可是做爲一個產品化的東西,從體驗等各方面來說都不能那麼的順暢。因而打算對接微信開放平臺。本文是基於Laravel的一次微信開放平臺整合記錄,若是可以幫到一些朋友,天然是很是高興的事情。javascript

由浙江百牛信息技術 bainiu.ltd整理髮佈於博客園html

平臺帳號申請

  網址是https://open.weixin.qq.com/  進入後選擇第三方平臺,點擊建立第三方平臺按鈕。以下圖。前端

 

填完基礎的信息後。下一步,選擇必須的服務,此處省略圖,選擇你要用到的服務就好了。下圖是最後一步須要填寫的相關參數信息。登陸受權的發起頁域名爲業務系統部署域名;受權測試公衆號列表是用於測試的公衆號的原始id,用分號隔開;受權事件接收URL是用於接收component_verify_ticket等公衆號受權信息的接口地址,此處先在laravel中寫了個接口地址/notification/openPlatform;公衆號消息校驗Token隨便填一個就能夠了;解密Key填一個在代替公衆號收發消息過程當中使用。必須是長度爲43位的字符串,只能是字母和數字;消息與事件URL這個厲害了,全部公衆號的消息和事件到時候都會轉發到這個接口裏來的,我這邊填/notification/openIndex/$APPID$,後面的$APPID$這個參數到時候會替換成對應公衆號的appid,這裏只是個佔位符,固然路由裏必須得有這個參數。若是是沒有路由系統的一些框架,可能須要經過pathinfo的方式進行傳遞了,這裏不容許使用?appid=1234這種方式進行傳遞;開發域名就是系統部署域名,通常小系統跟登陸受權域名保持一致,分佈式的可能會有多個服務器或者站點來部署;ip地址白名單就不用多說了,就是服務器的ip地址,除了這個ip,其餘的都沒法訪問。java

 

填完上述信息進行保存就OK了。到此整個申請開放平臺的第一步過程就結束了。接下來咱們就要取寫程序,進行測試,騰訊有一套自動化測試系統,經過自動化測試系統纔可以進行全網發佈,下面要開始Coding了,會貼一些關鍵代碼。laravel

 

Coding

  編碼前先到應用的詳情中把AppId和AppSecret拿過來,找個地方先保存起來。git

  編碼這邊用到了一個第三方微信類庫,仍是比較推薦使用的。叫EasyWechat,經過composer把它添加到項目中去。在config文件中先配置下appid和appsecret等信息。github

1
2
3
4
5
6
'open_platform'  => [
         'app_id'    =>  'wxc9c43170xxxx791' ,
         'secret'    =>  '6d36b19b6xxxxxxxxxf531be47f6235a' ,
         'token'     =>  'kftcvr1436942017' ,
         'aes_key'   =>  'ZQnZsLxxxxxxxxxwmmBSTofPzauHBhCIgsVgLGVwncNA'
     ],

  

   先寫幾個路由。redis

Route::any('/notification/openPlatform','Service\OpenPlatformController@notify')->name('notification.openPlatformNotify');    //微信通知,主要是component_verify_ticket等信息
Route::any('/notification/openIndex/{appid}','Service\OpenPlatformController@index')->name('notification.openPlatformIndex');  //全部微信公衆號消息入口,包括文本、圖文、語音、地理位置等各類信息,這個具體實現就至關於作一個公衆號平臺了。
Route::any('/wxcallback','Service\OpenPlatformController@wxcallback')->name('notification.openPlatformCallback');          //受權回調方法,用於保存appid和refresh_token
Route::any('/wxauth','Service\OpenPlatformController@auth')->name('notification.openPlatformAuth');              //預受權頁面
Route::any('/wxtest','Service\OpenPlatformController@test')->name('notification.openPlatformTest');              //測試頁
 

  編寫notify方法。SDK 內部已實現緩存 component_veirfy_ticket,開發者無需另行處理該事件。使用 doctrine/cache 來完成緩存工做,它支持基本目前全部的緩存引擎。默認使用文件緩存,若是要用redis等其餘緩存方式,好比多臺服務器這種狀況。請查閱easywechat官方文檔緩存那部分。chrome

use App\Http\Controllers\Controller;
use EasyWeChat\Core\Exception;
use EasyWeChat\Foundation\Application;
use EasyWeChat\OpenPlatform\Guard;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\Response;

public function notify(){
        $options = ['open_platform' => config('wechat.open_platform')];
        $app = new Application($options);
        $openPlatform = $app->open_platform;

        $server = $openPlatform->server;

        $server->setMessageHandler(function($event) use($openPlatform){
            switch ($event->InfoType) {
                case Guard::EVENT_AUTHORIZED: // 受權成功
                    $res = $openPlatform->getAuthorizationInfo($event->AuthorizationCode);
                    //@TODO 此處須要檢查res是否正常
                    //Save to DB
                    $appid = $res->authorization_info['authorizer_appid'];
                    $refresh_token = $res->authorization_info['authorizer_refresh_token'];
                    DB::table("wechat_platform")->where('app','hr')->update(['appid' => $appid,'refresh_token' => $refresh_token]);

                    break;
                case Guard::EVENT_UPDATE_AUTHORIZED:    // 更新受權
                    //
                    break;
                case Guard::EVENT_UNAUTHORIZED: // 取消受權
                    //
                    break;

            }
        });

        $response = $server->serve();
        return $response;
    }
 

  編寫預受權頁面。這裏前端要寫個頁面,在頁面中加上超連接,必須在同一個域名下。連接到auth方法。api

                                    <a style="color: inherit" href="http://hr.hackcat.com/wxauth"><p>微信平臺綁定</p></a>

這邊會跳轉到微信的受權頁。彈出一個受權二維碼,公衆號帳號的主人掃一下受權一下會跳回到下面的回調頁面。

public function auth(){
        $options = ['open_platform' => config('wechat.open_platform')];
        $app = new Application($options);
        $openPlatform = $app->open_platform;
        $response = $openPlatform->pre_auth->redirect('http://hr.hackcat.com/wxcallback');
        return $response;
    }
 

  編寫受權回調頁面。這裏主要是保存 authorizer_appid和authorizer_refresh_token信息,用於從此api的調用。

public function wxcallback(){
        $options = ['open_platform' => config('wechat.open_platform')];
        $app = new Application($options);
        $openPlatform = $app->open_platform;


        try{
            $res = $openPlatform->getAuthorizationInfo($authorizationCode = null);
            $appid = $res->authorization_info['authorizer_appid'];
            $refresh_token = $res->authorization_info['authorizer_refresh_token'];

            DB::table("wechat_platform")->where('app','hr')->update(['appid' => $appid,'refresh_token' => $refresh_token]);

            return 'Success';
        }catch (Exception $ex){
            abort(404,$ex->getMessage());
        }
    }
 
 public function test(){
        $options = ['open_platform' => config('wechat.open_platform')];
        $app = new Application($options);
        $openPlatform = $app->open_platform;
        $authInfo = DB::table("wechat_platform")->where('app','hr')->first();

        $app = $openPlatform->createAuthorizerApplication($authInfo->appid, $authInfo->refresh_token);
        $userService = $app->user;
        $user = $userService->get("oSQ2Ks_6ns0ahqKvzO_voIzbMdjI");
        dd($user);

    }
 

上面的是測試方法,用於測試保存的appid和refresh_token是否工做。

 

這一篇就到此爲止吧,期間mac的chrome奔潰了N次,重複寫了好幾遍,都快怒了。

 PS: 這個系統因爲用不到消息管理,因此去掉了權限的消息管理功能,全網發佈的時候就不用寫消息管理的測試了。若是有朋友遇到了全網發佈時候測試問題,歡迎留言。

原文:http://www.javashuo.com/article/p-dzlkmnic-ez.html

相關文章
相關標籤/搜索