系统集成Facebook授权发布帖子以及获取帖子评论等功能
程序员文章站
2022-04-14 21:58:49
公司的业务和海外贸易紧密连接,项目中需要对接Facebook、Google、Twitter相关API,下面详细描述一下我们对接Facebook中遇到的问题 1,注册Facebook账户,Facebook账户注册还是比较麻烦的,有IP限制,一个IP不能注册多个账户,很容易被封。注册完之后会有身份审核过 ......
公司的业务和海外贸易紧密连接,项目中需要对接facebook、google、twitter相关api,下面详细描述一下我们对接facebook中遇到的问题
1,注册facebook账户,facebook账户注册还是比较麻烦的,有ip限制,一个ip不能注册多个账户,很容易被封。注册完之后会有身份审核过程,这个过程尽量用真实身份,审核成功后就可以申请成为facebook开发者了。
2,成为facebook开发者之后,创建应用,获取应用编号和应用密钥,完善邮箱等官方需要提供的信息
3,完成公司验证,签署合同条款
4,创建测试帐号,项目需求需要的可以多创建几个测试帐号,互相加为好友
测试帐号可以在本地开发中使用,没有任何权限限制,所有的功能模块都可以通过测试帐号实现,在功能开发完成后,部署到一台线上的测试环境进行facebook的审核,线上域名必须添加ssl加密
5,添加fackbook登录,facebook登录api提供了sdk和图谱两种方式进行登录,在实际的开发中两者需要结合进行开发,我们是用下载的php版本的sdk, 使用 composer来获取依赖包,建议不要使用git去拉取代码,可能有些依赖包需要手动去安装,避免出现目明其妙的报错,下面是官方提供的sdk
6,添加fackbook登录需要创建应用程序
这里添加有效跳转uri,这里的跳转链接是在功能完善后,部署到线上环境提交给facebook审核需要的,本地测试不需要,例如本地locahost:8080是无法添加跳转uri的
facebook官方要求提供退出登录取消授权入口,至于这里的数据删除请求网址,笔者发现不是必须的,所以提供退出入口即可,以免审核不通过
7,facebook 权限列表
依据项目需求进行合理的申请,用不到的权限不要申请,如果项目需要用到的权限比较多,尽量一次申请不超过2个权限
申请的步骤:
1,添加申请理由, 就是描述一下项目如果使用这个权限和为用户带来哪些作用,尽量用英文描述,因为审核的平台是美国facebook的客服,是看不懂中文的!
2,录屏,这里需要用到录屏软件,官方有推荐 很好用的一款录屏软件
3,提交申请,facebook的审核时间还是很及时的,一般不超过3天,两个工作日差不多就给回复了,只不过给到的回复太过于官方了,不够详细,需要多花点时间琢磨!
这里是我们申请成功的权限,新手第一次对接,感觉太南了,太南了。。。
8,这里总结一下,顺便吐槽一下facebook的api, 没有google写的详细,有些功能没有,api也没声明,遇到很多坑,折腾了好久,最好打听到是因为隐私政策不予给出,mmp。。。
最后提一下这里用到的 oauth授权流程,没有接触过的同学先去了解一下,我这里大概说一下。
通过之前创建的应该,可以获取应用编号和应用密钥,通过这两者获取到一个有效期为3个月的token, 每次请求facebook api的时候必须带着这个token去获取一个临时token,然后通过这个临时token再进行请求最后的接口数据
这里我贴一下php相关代码
授权登录和获取临时访问口令:
1 $appid = facebook appid; 2 $appsecret = facebook appsecret; 3 $callbackurl = facebook callbackurl; 4 $fb = new facebook\facebook([ 5 'app_id' => $appid, 6 'app_secret' => $appsecret, 7 'default_graph_version' => 'v2.10', 8 ]); 9 10 $helper = $fb->getredirectloginhelper(); 11 try { 12 $accesstoken = $helper->getaccesstoken(); 13 } catch(facebook\exceptions\facebookresponseexception $e) { 14 echo 'graph returned an error: ' . $e->getmessage(); 15 exit; 16 } catch(facebook\exceptions\facebooksdkexception $e) { 17 echo 'facebook sdk returned an error: ' . $e->getmessage(); 18 exit; 19 } 20 21 if (! isset($accesstoken)) { 22 if ($helper->geterror()) { 23 header('http/1.0 401 unauthorized'); 24 echo '请检查账号设置,facebook账号无法获得授权,详情:' . $helper->geterror() . ' ' . $helper->geterrorcode() . ' ' . $helper->geterrorreason() . ' ' . $helper->geterrordescription() . "\n"; 25 } else { 26 header('http/1.0 400 bad request'); 27 echo 'bad request'; 28 } 29 exit; 30 } 31 32 $accesstoken = $accesstoken->getvalue(); 33 $oauth2client = $fb->getoauth2client(); 34 $tokenmetadata = $oauth2client->debugtoken($accesstoken); 35 $tokenmetadata->validateappid($appid); 36 $tokenmetadata->validateexpiration(); 37 38 $appid = $tokenmetadata->getfield('app_id'); 39 $type = $tokenmetadata->getfield('type'); 40 $userid = $tokenmetadata->getfield('user_id'); 41 $application = $tokenmetadata->getfield('application'); 42 $isvalid = $tokenmetadata->getfield('is_valid'); 43 $expiresat = $tokenmetadata->getfield('data_access_expires_at'); 44 $metadata = [ 45 "app_id" => $appid, 46 "type"=> $type, 47 "user_id" => $userid, 48 "application" => $application, 49 "expires_at" => $expiresat, 50 "is_valid" => $isvalid 51 ]; 52 53 $auth = new facebook\authentication\accesstoken($accesstoken); 54 if (! $auth->islonglived()) { 55 try { 56 $accesstoken = $oauth2client->getlonglivedaccesstoken($accesstoken); 57 } catch (facebook\exceptions\facebooksdkexception $e) { 58 echo "<p>error getting long-lived access token: " . $e->getmessage() . "</p>\n\n"; 59 exit; 60 } 61 } 62 63 65 $this->cache->set($this->facebookaccesstokenkey,(string) $accesstoken ); 66 $this->cache->set($this->facebookkey, json_encode($metadata)); 67 68 header("location: {$callbackurl}");
1 /** 2 * 获取临时访问口令 3 * @param $pageid 4 * @param $access_token 5 * @return mixed 6 */ 7 public function getpageaccesstoken($pageid, $access_token) 8 { 9 $accesstokenurl = "https://graph.facebook.com/v4.0/{$pageid}?fields=access_token&access_token={$access_token}"; 10 $pageaccesstokeninfo = curl($accesstokenurl); 11 try{ 12 $pageaccesstokeninfo = json_decode($pageaccesstokeninfo, true); 13 $pageaccesstoken = $pageaccesstokeninfo['access_token']; 14 }catch (exception $e) { 15 $this->showresults(-1, null, '获取page_access_token失败!'); 16 } 17 18 return $pageaccesstoken; 19 }
唤起授权对话框,我们的业务权限是 和 ,权限不同的自行更改!
,权限不同的自行更改!
/** * 获取facebook授权code */ public function bindaction(){ $redirecturl = facebook redirecturl; $appid = facebook appid; $appsecret = facebook appsecret; $fb = new facebook\facebook([ 'app_id' => $appid, 'app_secret' => $appsecret, 'default_graph_version' => 'v2.10', ]); $helper = $fb->getredirectloginhelper(); $permissions = ['manage_pages','publish_pages']; $codeurl = $helper->getloginurl($redirecturl, $permissions); $this->showresults(1, ['url' => $codeurl]); }
完整的发帖代码
/** * facebook分享发布 */ public function facebookshareaction() { $data = getpost('data');//一次请求中只能有一个选项 1,分享链接, 2单张图片链接, 3,多张图片id $content['message'] = $data['message']; if ($data['link']) { $content['link'] = $data['link']; } else if ($data['url']) { $content['link'] = ''; $content['url'] = $data['url']; } else if ($data['attached_media']) { $content['link'] = ''; $content['url'] = ''; $media = explode(',', $data['attached_media']); if (count($media) >= 10) { $this->showresults(-2, null, '一次上传最多不能超过9张图片!'); } foreach ($media as $mediaid) { $temp[] = ['media_fbid' => $mediaid]; } $content['attached_media'] = json_encode($temp); } $appid = facebook appid; $appsecret = facebook appsecret; $fbaccesstoken = $this->cache->get($this->facebookaccesstokenkey); if (!$fbaccesstoken) { $this->showresults(-1, null, '请先绑定facebook账号!'); } $fb = new facebook\facebook([ 'app_id' => $appid, 'app_secret' => $appsecret, 'default_graph_version' => 'v2.3', ]); try { $response = $fb->get( '/me/accounts', $fbaccesstoken ); } catch(facebookexceptionsfacebookresponseexception $e) { echo 'graph returned an error: ' . $e->getmessage(); exit; } catch(facebookexceptionsfacebooksdkexception $e) { echo 'facebook sdk returned an error: ' . $e->getmessage(); exit; } $accountinfo = $response->getbody(); $accountinfo = json_decode($accountinfo, true); $pageid = $accountinfo['data'][0]['id']; $accesstoken = $accountinfo['data'][0]['access_token']; $pageaccesstoken = $this->getpageaccesstoken($pageid, $accesstoken); try { $response = $fb->post( '/' . $pageid . '/feed', $content, $pageaccesstoken ); } catch(facebookexceptionsfacebookresponseexception $e) { echo 'graph returned an error: ' . $e->getmessage(); exit; } catch(facebookexceptionsfacebooksdkexception $e) { echo 'facebook sdk returned an error: ' . $e->getmessage(); exit; } $info = $response->getbody(); $info = json_decode($info, true); $this->showresults(1, ['data' => ['id' => $info['id']]]); }
最后祝大家对接api成功!
上一篇: PHP函数in_array()使用详解
下一篇: 百度网盘搜索工具_2019