tonyjude

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

唤起授权对话框,我们的业务权限是 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成功!

 

分类:

技术点:

相关文章:

  • 2021-12-08
  • 2022-01-08
  • 2021-05-13
  • 2021-11-04
  • 2021-10-16
  • 2021-11-17
  • 2021-11-17
  • 2019-10-08
猜你喜欢
  • 2021-10-15
  • 2021-06-12
  • 2021-12-03
  • 2021-08-22
  • 2021-08-16
  • 2021-12-01
  • 2021-10-05
相关资源
相似解决方案