公司的业务和海外贸易紧密连接,项目中需要对接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

https://developers.facebook.com/docs/reference/php

6,添加Fackbook登录需要创建应用程序

这里添加有效跳转URI,这里的跳转链接是在功能完善后,部署到线上环境提交给facebook审核需要的,本地测试不需要,例如本地locahost:8080是无法添加跳转URI的

Facebook官方要求提供退出登录取消授权入口,至于这里的数据删除请求网址,笔者发现不是必须的,所以提供退出入口即可,以免审核不通过

7,Facebook 权限列表

https://developers.facebook.com/docs/facebook-login/permissions/

依据项目需求进行合理的申请,用不到的权限不要申请,如果项目需要用到的权限比较多,尽量一次申请不超过2个权限

申请的步骤:

1,添加申请理由, 就是描述一下项目如果使用这个权限和为用户带来哪些作用,尽量用英文描述,因为审核的平台是美国Facebook的客服,是看不懂中文的!

2,录屏,这里需要用到录屏软件,官方有推荐 https://www.apowersoft.cn/free-online-screen-recorder 很好用的一款录屏软件

3,提交申请,Facebook的审核时间还是很及时的,一般不超过3天,两个工作日差不多就给回复了,只不过给到的回复太过于官方了,不够详细,需要多花点时间琢磨!

这里是我们申请成功的权限,新手第一次对接,感觉太南了,太南了。。。

8,这里总结一下,顺便吐槽一下Facebook的API, 没有Google写的详细,有些功能没有,API也没声明,遇到很多坑,折腾了好久,最好打听到是因为隐私政策不予给出,MMP。。。

最后提一下这里用到的 OAuth授权流程,没有接触过的同学先去了解一下,我这里大概说一下。

通过之前创建的应该,可以获取应用编号和应用密钥,通过这两者获取到一个有效期为3个月的token, 每次请求Facebook API的时候必须带着这个token去获取一个临时token,然后通过这个临时token再进行请求最后的接口数据

这里我贴一下php相关代码

授权登录和获取临时访问口令:

 1      $appId = facebook appId;
$appSecret = facebook appSecret;
$callbackUrl = facebook callbackUrl;
$fb = new Facebook\Facebook([
'app_id' => $appId,
'app_secret' => $appSecret,
'default_graph_version' => 'v2.10',
]); $helper = $fb->getRedirectLoginHelper();
try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
} if (! isset($accessToken)) {
if ($helper->getError()) {
header('HTTP/1.0 401 Unauthorized');
echo '请检查账号设置,Facebook账号无法获得授权,详情:' . $helper->getError() . ' ' . $helper->getErrorCode() . ' ' . $helper->getErrorReason() . ' ' . $helper->getErrorDescription() . "\n";
} else {
header('HTTP/1.0 400 Bad Request');
echo 'Bad request';
}
exit;
} $accessToken = $accessToken->getValue();
$oAuth2Client = $fb->getOAuth2Client();
$tokenMetadata = $oAuth2Client->debugToken($accessToken);
$tokenMetadata->validateAppId($appId);
$tokenMetadata->validateExpiration(); $appId = $tokenMetadata->getField('app_id');
$type = $tokenMetadata->getField('type');
$userId = $tokenMetadata->getField('user_id');
$application = $tokenMetadata->getField('application');
$isValid = $tokenMetadata->getField('is_valid');
$expiresAt = $tokenMetadata->getField('data_access_expires_at');
$metadata = [
"app_id" => $appId,
"type"=> $type,
"user_id" => $userId,
"application" => $application,
"expires_at" => $expiresAt,
"is_valid" => $isValid
]; $auth = new Facebook\Authentication\AccessToken($accessToken);
if (! $auth->isLongLived()) {
try {
$accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
} catch (Facebook\Exceptions\FacebookSDKException $e) {
echo "<p>Error getting long-lived access token: " . $e->getMessage() . "</p>\n\n";
exit;
}
}     
$this->cache->set($this->facebookAccessTokenKey,(string) $accessToken );
$this->cache->set($this->facebookKey, json_encode($metadata)); header("Location: {$callbackUrl}");  
   /**
* 获取临时访问口令
* @param $pageId
* @param $access_token
* @return mixed
*/
public function getPageAccessToken($pageId, $access_token)
{
$accessTokenUrl = "https://graph.facebook.com/v4.0/{$pageId}?fields=access_token&access_token={$access_token}";
$pageAccessTokenInfo = curl($accessTokenUrl);
try{
$pageAccessTokenInfo = json_decode($pageAccessTokenInfo, true);
$pageAccessToken = $pageAccessTokenInfo['access_token'];
}catch (Exception $e) {
$this->showResults(-1, null, '获取page_access_token失败!');
} return $pageAccessToken;
}

唤起授权对话框,我们的业务权限是 manage_pages 和 publish_pages ,权限不同的自行更改!

   /**
* 获取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成功!

系统集成Facebook授权发布帖子以及获取帖子评论等功能的更多相关文章

  1. InstallShield集成安装MSDE2000最小版本(二) fishout特许授权发布

    原文:InstallShield集成安装MSDE2000最小版本(二) fishout特许授权发布 原帖地址:http://blog.csdn.net/fishout/archive/2009/10/ ...

  2. InstallShield集成安装MSDE2000最小版本(三) fishout特许授权发布

    原文:InstallShield集成安装MSDE2000最小版本(三) fishout特许授权发布 原帖地址:http://blog.csdn.net/fishout/archive/2009/11/ ...

  3. Java爬虫Ins博主所有帖子的点赞和评论导出excel

    前言 某天朋友说,能不能帮忙扒下ins的博主帖子,要所有帖子的点赞和评论,我本来准备让会python的同事写的,最后还是自己顺手写了,本来一开始准备用nodejs或者js写的,想着前端本地测试代理和导 ...

  4. 请求facebook授权时,返回错误

    在请求facebook授权时,返回如下错误:所提供的网址不被应用程序配置所接纳.:应用程序的设置不允许一个或多个所提供的链接.它必须与网站的URL或Canvas的URL相符,或该域必须是应用程序的一个 ...

  5. facebook代码发布

     facebook代码发布 2011-08-09 20:34:02 分类: LINUX 所有提交的代码每周二打包一次. 只要多一分努力,终于一天会发生改变. 星期二的代码发布,需要所有的提交过代码的工 ...

  6. InstallShield集成安装MSDE2000最小版本(一) fishout特许授权发布

    原文:InstallShield集成安装MSDE2000最小版本(一) fishout特许授权发布 原帖地址:http://blog.csdn.net/fishout/archive/2009/10/ ...

  7. 微信小程序仿朋友圈功能开发(发布、点赞、评论等功能)

    微信小程序仿朋友圈功能开发(发布.点赞.评论等功能) 1.项目分析 项目整体分为三个部分 发布 展示 详情页 graph LR 朋友圈发布 --内容发布--> 内容展示 内容展示 --点击展示卡 ...

  8. React 17 发布候选版本, 没有添加新功能

    React 17 发布候选版本, 没有添加新功能 React v17.0 Release Candidate: No New Features https://reactjs.org/blog/202 ...

  9. atitit.获取北京时间CST 功能api总结 O7

    atitit.获取北京时间CST 功能api总结 O7 1. 获取cst时间(北京时间)两布:1.抓取url timtstamp >>format 到cst 1 2. 设置本机时间  se ...

随机推荐

  1. P1986 元旦晚会——贪心或差分约束系统

    P1986 元旦晚会 每个人可能属于不同的声部,每个声部最少要有c[i]个人发声: 求最少需要多少话筒: 首先贪心,将所有声部的区间按照右端点大小排序,如果右端点相同,左端点从小到大排序: 贪心每次选 ...

  2. AWS API Gateway Swagger定义

    导出Swagger接口定义文件 在AWS API Gateway界面上,可以导出swagger接口定义文件. 而后利用Node js swagger-ui 依赖,生成swagger接口地址 Cloud ...

  3. GB∕T 35658平台过检 已通过最新的部标JT/T 808-2019, JT/T 809-2019标准检测

    2019年交通部GPS平台检测标准发生了重大变化, 原来的796平台功能标准, 变更为GB/T35658标准, 这个标准其实2017年就公布了, 实际上还是796标准, 但是检测项目,以前是可选的, ...

  4. 前端代码规范-Javascript

    命名规范 ECMAScript 规范中标识符采用驼峰大小写格式,驼峰命名法由小(大)写字母开始,后续每个单词首字母都大写.根据首字母是否大写,分为两种方式: Pascal Case 大驼峰式命名法:首 ...

  5. 4)抽象方法不能为private,final或者static,为什么?

    抽象方法的最实质的意 义在于被未来的子类覆盖实现掉.它自己是个空方法.private的实质意义在于本类其他方法调用它.你自己是个空方法,别人调用你有什么用?所以 abstract和private在一起 ...

  6. 使用spring profile实现多环境切换

    第一步: applicationContext.xml <!--环境配置开始--> <beans profile="production"> <con ...

  7. ML_Review_LDA(Ch5)

    Note sth about LDA(Linear Discriminant Analysis) 这篇来说说LDA的复习,LDA在第二次作业的博客中也提及了,但是那是作业思考,所以决定再开一篇只说LD ...

  8. DELPHI搭建centos开发环境

    DELPHI搭建centos7开发环境 关闭防火墙 搭建开发环境,还是直接关闭LINUX防火墙,省事. 否则,使用到的网络端口号,都要在防火墙开放,麻烦. systemctl disable fire ...

  9. SQLite3中的日期时间函数使用小结

    代码如下: import sqlite3conn = sqlite3.connect('/tmp/sqlite.db')cur = conn.cursor() 接下来干嘛呢?建一张表吧.这里需要注意的 ...

  10. Chrome和火狐插件让数以百万计用户隐私数据泄露

      https://tech.163.com/19/0721/12/EKK1PRAU00097U7R.html   网易科技讯7月21日消息,据国外媒体报道,流行浏览器诸如广告拦截等扩展功能,已经遭利 ...