微信开放平台开发 Tp5 + easyweichat3.X
需求
单位想完善微信公众号场景二维码的功能,又不想原微信公众平台设置的自动回复失效,只能曲线救国,利用微信第三方平台,实现微信公众号,事件接收。
总流程
整体流程,首先甲方爸爸,微信公众平台(公众号),需要授权给微信开放平台(第三方)。甲方爸爸:嗯。我的用户关注取关事件,你给我处理一下。第三方:好的。达成协议之后,第三方平台拿到公众号的相关权限和参数,就可以进行开发啦,微信也会将事件推送推送给第三方平台服务器。
授权
流程
1.公众号管理员登录我们的授权网站
没错。我的网站就是这么简陋
2. 进入微信官方授权网站
点击链接,进入微信官方授权网站。嗯。
3. 公众号管理员微信扫描二维码。
权限可以自行选择。具体可参照 第三方平台的权限说明
4.点击授权
微信就会变成酱紫。微信还会推送给第三方服务器,公众号的授权信息。
web页就会变成酱紫
嗯。还是一样简陋。
授权流程就走完啦。
开发
开发嘛。首先你需要有一个第三方平台的账号 申请网址。需要填写一些基本信息,还有几个容易蒙蒙的点。
- 登录授权的发起页域名 :就是那两个 简陋 的页面的域名;
- 授权测试公众号列表 :测试用的公众号,可以填在里面。主义是原始 ID喔;
- 授权事件接收url :就是当有甲方爸爸公众号 申请授权(取消授权/更新授权),微信通知你的url。微信每隔10分钟还会推送一次 component_verify_ticket;
- 消息与事件接受url:公众号授权之后,第三方平台代为开发,这是微信推送给原公众号的消息,就会推送到第三方服务器上。为了开放平台区分各个消息的来源,url上需要鞋带公众号的appid,格式为 www.abc.com/aaa/APPID/bbb/cgi,需要用路由处理一下。
1.平台class
这次开发用的EasyWeChat SDK,不需要考虑微信繁琐的 开发流程。一定要看文档哦,这里就不再赘述了。
首先,创建平台。
use EasyWeChat\Foundation\Application;
class Platform extends Controller{
protected $openPlatform;
public function __construct()
{
$options = ['open_platform' => config('open_platform')];//open_platform 微信开放平台配置 app_id、secret、token、aes_key
$app = new Application($options);
$this->openPlatform = $app->open_platform;
}
}
2.登录授权的发起页
//预授权页面
public function auth(){
$openPlatform = $this->openPlatform;
$response = $openPlatform->pre_auth->redirect(config('open_redirect'));//open_redirect 授权回调url 第二个丑丑的页面url
$url = $response->getTargetUrl();//获得授权url
echo ' <meta name="referrer" content="origin-when-cross-origin" >
<a style="color: inherit" href="'.$url.'"><p>微信平台绑定</p></a>';
}
直接用浏览器打开授权url无效喔,会报如下错误。一定要从授权页跳转才行
3.开放平台信息接收
接收授权通知以及component_verify_ticket 的接口了
方法
//微信通知,主要是component_verify_ticket等信息
public function notify(){
$openPlatform = $this->openPlatform;
$openPlatform->server->setMessageHandler(function($event) use($openPlatform){
switch ($event->InfoType) {
case Guard::EVENT_AUTHORIZED: // 授权成功
$res = $openPlatform->getAuthorizationInfo($event->AuthorizationCode);
//Save to DB
$appid = $res->authorization_info['authorizer_appid'];
$refresh_token = $res->authorization_info['authorizer_refresh_token'];
DB::table("weixin")->insert(['appid' => $appid,'refresh_token' => $refresh_token,'res'=>json_encode($res)]);
break;
case Guard::EVENT_UPDATE_AUTHORIZED: // 更新授权
//todo
break;
case Guard::EVENT_UNAUTHORIZED: // 取消授权
//删除授权信息
Db::table('weixin')->where(['appid'=>$event['AuthorizerAppid']])->delete();
break;
}
});
$response = $openPlatform->server->serve();
$response->send();
}
授权后的appid 和 authorizer_refresh_token 以后还需要用,保存起来
4.回调页面
第二个丑丑的页面
public function callback(){
$openPlatform = $this->openPlatform;
try{
return 'Success';
}catch (Exception $ex){
abort(404,$ex->getMessage());
}
}
以上,授权的相关代码,就写完啦,可根据自己需求完善。
功能开发
以用户关注取关公众号为例
首先,需要处理下url,加路由,让 APPID 以id参数 接收
Route::rule('weixin/Platform/openindex/:id','weixin/Platform/openindex');
然后就是代码啦
//公众号消息验证
public function openindex($id = 0){
//验证是否有该appid 并取出
$info = Db::table('weixin')->where(['appid'=>$id])->find();
if(!$info){
return false;
}
$openPlatform = $this->openPlatform;
$authorizerAppId = $info['appid'];
$authorizerRefreshToken = $info['refresh_token'];
$app = $openPlatform->createAuthorizerApplication($authorizerAppId, $authorizerRefreshToken);
$app->server->setMessageHandler(function($message) use($app){
switch($message->ToUserName){
//根据不同的appid 写不同的逻辑
case 'APPID1':
if ($message->MsgType == 'event') {//消息类型 为 事件
# code...
try{
switch ($message->Event) {
case 'subscribe'://订阅 带参数订阅 不带参数订阅
//todo
break;
case 'unsubscribe'://取关
//todo
break;
case 'SCAN'://扫描二维码 带参
//todo
break;
}
}catch (Exception $ex){
Log::debug('try:'.json_encode($ex->getMessage()));
}
}
break;
case 'APPID2':
//todo
break;
}
});
$response = $app->server->serve();
$response->send(); // Laravel 里请使用:return $response;
}
至此。就搞定啦!