paybook/sync-php

一个用于轻松消费Syncfy REST的包

安装: 2,442

依赖项: 0

建议者: 0

安全: 0

星标: 11

关注者: 9

分支: 11

开放问题: 5

类型:

V2.0.1 2024-09-24 17:38 UTC

This package is not auto-updated.

Last update: 2024-09-24 19:43:50 UTC


README

Sync-Paybook-logo

SYNC-PHP

Sync 从授权用户的金融机构获取账户和交易信息,并将其以有组织、易于使用的方式返回给第三方解决方案。

目录

安装

  1. 通过composer安装
  composer require paybook/sync-php

要求

  1. API密钥

当我们创建Paybook Sync账户时,我们被提供了一个API密钥,例如

api_key = 7767a4a04f990e9231bafc949e8ca08a

创建账户时,我们会得到两个API密钥:生产 & 沙盒。它们具有相同的目的,都允许我们实现 Paybook Sync,但 沙盒 允许我们无需真实银行或SAT凭证即可进行操作。

我们可以将此API密钥视为对 Paybook Sync 服务的密码或访问密钥。只有通过它,我们才能开始与同步的机构互动。

注意: 切换到另一个API密钥就像写入新的API密钥一样简单。

2.Webhook

可选 但强烈推荐以实现Paybook Sync功能的完整集成。

信息模型

Paybook Sync的信息模型相当简单。几乎可以将API密钥视为模型中的根元素,从中派生出用户,但让我们将用户理解为那些希望同步Paybook Sync提供的金融机构的实体(个人或公司),我们可以通过以下图表直观地看到这一点

sync-model-image

需要指出的是,Paybook Sync的用户(您,开发者)与API密钥的用户之间的区别:对于每个Paybook Sync用户,都有一个API密钥,并且每个API密钥可以有N个用户。

Users (用户)

用户是对最终用户进行逻辑划分。一种更好的做法是为用户注册以在两端组织其信息并控制。

Catalogs/Sites (目录)

目录是端点的集合,对于其他端点的分类非常重要。在这些目录中,包括允许我们查询通过Paybook Sync同步的可用金融网站。

凭据(凭据

凭据是指授权访问第三方网站所需的信息。凭据在输入时会被加密,并且在任何端点中不可用。从这个端点提取的信息将仅作为补充。

创建凭据至少需要有一个注册用户。

账户(账户

账户是最终用户交易数据的存储库,通常按类型和/或账户编号等特征进行分类。账户和交易信息可以从第三方网站恢复,并每天更新一次。

交易(交易

交易是与账户相关的金融活动,反映了最终用户在特定网站上的收入或支出。Sync可以恢复的历史信息量因来源而异,但通常可以提供60天的交易记录。

附件(附件

附件是与账户或交易相关的文件。附件的可用性和类型根据来源而异。

总结

从用户可以创建凭据,每个用户和机构都有唯一的凭据。创建凭据后,将自动创建相应的账户,这允许轻松管理同一机构同一用户的多个账户。

最后但同样重要的是,还有交易,它们依赖于各自的账户。一些交易附有我们称之为附件或“附件文档”的文件,这些文件是Paybook Sync信息模型中的最后一环。

实现

包含库并声明你的API密钥。

require __DIR__.'./vendor/autoload.php';
define('API_KEY', '<TU_API_KEY>');
use Paybook\Sync\Sync;

注意:不要将API密钥直接写入你的代码或纯文本中,因为这是一种不安全的做法。

库包括以下方法

  • Sync.auth()
// Crear una sesión para un usuario
$token = Sync::auth(
    array("api_key" => API_KEY), // Tu API KEY
    array("id_user"=>$id_user) // ID de usuario
);

注意:进行身份验证需要有一个已创建的用户,从中获得id_user,请参阅此示例

  • Sync.run()
// Consumir un recurso de Sync
$response = Sync::run(
    $token, // Autenticación
    "/credentials", // Recurso
    null, // Parametros
    'GET' // Método HTTP
);

它使用以下HTTP方法

根据资源和要执行的操作,库中的方法、HTTP方法和认证元素(在认证部分解释)将使用不同的方法。

你可以在资源和示例中了解更多关于每个的方法。

实现Webhook

Webhook是向指定URL发送的HTTP回调。每当同步数据更新时,它们都会被激活,帮助你跟上信息的最新变化。

主要优势是它允许你直接在应用程序中接收凭据、交易和附件的最新更新,而无需不断查询它们。

alt

为了开发目的,我们将使用 ngrok 服务,它允许我们创建公共URL来通过互联网公开我们的本地服务器。您可以在其 下载页面 查看如何安装。

现在,我们将使用 PHPSlim 创建一个简单的服务器。

请注意,这些技术仅用于说明目的,开发者可以自由选择他们认为最合适的实现。

创建一个名为 server.php 的文件,并包含以下代码

<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/vendor/autoload.php';

$app = AppFactory::create();

$app->post('/webhook', function (Request $request, Response $response, $args) {
    $response->getBody()->write("Hello from my webhook!");
    return $response;
});

$app->run();

完成上述步骤后,使用命令 composer require slim/slim slim/psr7 安装 slim,然后使用命令 php -S server.php 运行我们的服务器

警告: 内置的Web服务器旨在辅助应用程序开发。它也可能会在受控环境中用于测试目的或应用程序演示。它不是一个功能齐全的Web服务器。不应将其用于公共网络。

最后,使用以下命令运行 ngrok: <path-to>/ngrok http 3000,我们的服务器即可准备就绪,监听webhook更新。

ngrok提供的URL是您在创建webhook时需要发送的相同URL,例如在这个 示例 中。

注意: ngrok 只应在开发期间使用,不建议在生产环境中以这种方式使用。

Sync小部件

Sync小部件可以用来通过您的 前端 用几行代码轻松地 创建更新激活 证书的同步。访问 官方仓库 以实现它,强烈推荐。

主要优点是它提供了一个强大的界面,可以帮助您在实施中节省步骤。

身份验证

在Paybook Sync API中,有两个认证元素: API KEYTOKEN

  • API KEY: 当开发者在Paybook Sync注册时,会授予一个主密钥,如 要求 部分所示。

  • TOKEN: Token是一个易变的操作密钥,在五分钟的不活动后过期,其作用范围限于User级别,专为在FrontEnd级别进行操作而设计。它与一个用户直接相关,并且只能查询或更新该用户的信息(与API key不同,后者可以查询所有信息)。实际上,它是API key和用户的组合。

出于安全考虑,强烈建议使用Token,因为它可以限制信息访问仅限于相应的用户。

对Paybook Sync API的所有请求都必须进行认证,具体取决于要操作的资源,将使用哪个认证密钥。

获取会话令牌

$token = Sync::auth(
  array("api_key" => API_KEY), // Tu API KEY
  array("id_user"=>$id_user) // ID de usuario
);

响应

  print_r($token);
  // #Imprime: { token: "d5b33dcf996ac34fd2fa56782d72bff6"}

你可以在资源和示例中了解更多关于每个的方法。

信息流

在本节中,我们将查看从Paybook Sync API获取信息的理想流程示例,尽管可能性很多,但这是获取信息的理想情况。

data-flow-img

对于这一点,如果您决定使用 Sync Widget,您将已省略步骤 2、3 和 4。

图中的步骤如下

  1. 创建一个用户。 (查看示例)
  2. 查询站点并选择您想要同步的站点。(查看示例
  3. 为该用户和站点创建一个凭据。(查看示例
  4. 监控新凭据的状态。(查看示例
  5. 创建一个新的webhook,指定您的应用程序中等待更新的端点。(查看示例
  6. 等待并处理来自Sync的更新。
  7. 查询在相应资源中可用的新的信息。

资源和示例

您可以在paybook官方文档中了解更多关于每个资源参数的信息。

用户

查询用户

$response = Sync::run(
    array("api_key" => SYNC_API_KEY),
    '/users', 
    array(), 
    'GET'
);

返回

[
  {
      "id_user": "5df859c4a7a6442757726ef4",
      "id_external": "ELSAN090909",
      "name": "El Santo",
      "dt_create": 1576556996,
      "dt_modify": null
  },
  {
      "id_user": "5e061a673e0acd77bf7d3c7b",
      "id_external": "BLDM140389",
      "name": "Blue Demon",
      "dt_create": 1577458279,
      "dt_modify": null
  }
]

查询特定用户

 $response = Sync::run(
  array("api_key" => API_KEY),
  '/users', 
  array("id_user"=>'5df859c4a7a6442757726ef4'), 
  'GET'
);

返回

[
  {
      "id_user": "5df859c4a7a6442757726ef4",
      "id_external": "ELSAN090909",
      "name": "El Santo",
      "dt_create": 1576556996,
      "dt_modify": null
  }
]

创建用户

$response = Sync::run(
  array("api_key" => API_KEY),
  '/users', 
  array(
      "id_external"=> 'MIST030794',
      "name"=> 'Rey Misterio'
  ), 
  'POST'
);
$id_user = $response->id_user;

返回

{
    "id_user": "5e06694b93f4a91cb218f28f",
    "id_external": "MIST030794",
    "name": "Rey Misterio",
    "dt_create": 1577478475,
    "dt_modify": null
}

更新用户

$response = Sync::run(
  array("api_key" => API_KEY),
  "/users/$id_user", 
  array(
      "name"=> 'El Santo Jr.'
  ), 
  'PUT'
);

返回

  {
      "id_user": "5df859c4a7a6442757726ef4",
      "id_external": "ELSAN090909",
      "name": "El Santo Jr.",
      "dt_create": 1576556996,
      "dt_modify": 1576557005
  }

删除用户

注意: 这将删除用户的所有信息。

$response = Sync::run(
  array("api_key" => API_KEY),
  "/users/$id_user", 
  array(), 
  'DELETE'
);

返回

{
  "rid": "d337e963-680f-4009-85dc-ab439bfdc771",
  "code": 200,
  "errors": null,
  "status": true,
  "message": null,
  "response": true
}

目录

机构目录

Paybook Sync为用户提供了一个可同步的机构目录。

// Consultar catálogos
$response = Sync::run(
  $token,
  "/catalogues/sites", 
  null,
  'GET'
);

返回

[
  {
      "id_site": "56cf5728784806f72b8b4568",
      "id_site_organization": "56cf4ff5784806152c8b4567",
      "id_site_organization_type": "56cf4f5b784806cf028b4568",
      "id_site_type": "5b285177056f2911c13dbce1",
      "is_business": 1,
      "is_personal": 1,
      "version": 1,
      "name": "Normal",
      "credentials": [
          {
              "name": "username",
              "type": "text",
              "label": "Username",
              "required": true,
              "username": true,
              "token": false,
              "validation": null
          },
          {
              "name": "password",
              "type": "password",
              "label": "Password",
              "required": true,
              "username": false,
              "token": false,
              "validation": null
          }
      ],
      "endpoint": "/v1/credentials"
  },
  {
      "id_site": "56cf5728784806f72b8b4569",
      "id_site_organization": "56cf4ff5784806152c8b4567",
      "id_site_organization_type": "56cf4f5b784806cf028b4568",
      "id_site_type": "5b285177056f2911c13dbce1",
      "is_business": 1,
      "is_personal": 1,
      "version": 1,
      "name": "Token",
      "credentials": [
          {
              "name": "username",
              "type": "text",
              "label": "Username",
              "required": true,
              "username": true,
              "token": false,
              "validation": null
          },
          {
              "name": "password",
              "type": "password",
              "label": "Password",
              "required": true,
              "username": false,
              "token": false,
              "validation": null
          }
      ],
      "endpoint": "/v1/credentials"
  },
  {
      "id_site": "572ba390784806060f8b458b",
      "id_site_organization": "56cf4ff5784806152c8b4567",
      "id_site_organization_type": "56cf4f5b784806cf028b4568",
      "id_site_type": "5b285177056f2911c13dbce1",
      "is_business": 1,
      "is_personal": 1,
      "version": 1,
      "name": "Token & captcha",
      "credentials": [
          {
              "name": "username",
              "type": "text",
              "label": "Username",
              "required": true,
              "username": true,
              "token": false,
              "validation": null
          },
          {
              "name": "password",
              "type": "password",
              "label": "Password",
              "required": true,
              "username": false,
              "token": false,
              "validation": null
          }
      ],
      "endpoint": "/v1/credentials"
  }
  .
  .
  .
]

凭证

您可以在此处了解更多关于响应代码及其含义。

每个机构都有自己的凭据,一些机构需要安全步骤“双因素认证”或“TWOFA”;以下示例涵盖了这两种情况。

普通凭证

正常:只需要用户名密码的凭据。

  1. 创建正常凭据
  // Consultar catálogos
$payload = array("id_site"=>"5da784f1f9de2a06483abec1");
$response = Sync::run(
  $token,
  "/catalogues/sites", 
  $payload,
  'GET'
);
$site = $response[0];
print_r($site)
/* Algo como esto:
{
    "id_site": "56cf5728784806f72b8b4568",
    .
    .
    .
    "credentials": [
        {
            "name": "username",
            "type": "text",
            "label": "Username",
            "required": true,
            "username": true,
            "token": false,
            "validation": null
        },
        {
            "name": "password",
            "type": "password",
            "label": "Password",
            "required": true,
            "username": false,
            "token": false,
            "validation": null
        }
    ],
    "endpoint": "/v1/credentials"
}
*/
$credentials = array();
$credentials[$site->credentials[0]->name] = 'ACM010101ABC';
$credentials[$site->credentials[1]->name] = 'test';
$payload['credentials'] = $credentials;
$normalCredential = Sync::run(
  $token,
  "/credentials", 
  $payload,
  'POST'
);

返回

{
   "id_credential":"5e17c432d7288d358a039141",
   "id_job_uuid":"5e17c4325d4f6077171c0253",
   "id_job":"5e17c4325d4f6077171c0254",
   "is_new":1,
   "username":"A**********C",
   "ws":"wss://sync.paybook.com/v1/status/5e17c4325d4f6077171c0254",
   "status":"https://sync.paybook.com/v1/jobs/5e17c4325d4f6077171c0254/status",
   "twofa":"https://sync.paybook.com/v1/jobs/5e17c4325d4f6077171c0254/twofa"
}
  1. 监控凭据状态
$response = Sync::run(
  $token,
  "/credentials", 
  null,
  'GET'
);

返回

[
   {
      "id_credential":"5e17c432d7288d358a039141",
      "id_user":"5e17c430b021255889294af7",
      "id_environment":"574894bf7848066d138b4570",
      "id_external":"",
      "id_site":"56cf5728784806f72b8b4568",
      "id_site_organization":"56cf4ff5784806152c8b4567",
      "id_site_organization_type":"56cf4f5b784806cf028b4568",
      "id_organization":"56cf4ff5784806152c8b4567",
      "is_authorized":1,
      "is_locked":0,
      "is_twofa":0,
      "can_sync":0,
      "ready_in":86377,
      "username":"A**********C",
      "code":200,
      "keywords":null,
      "dt_authorized":1578615866,
      "dt_execute":1578615858,
      "dt_ready":1578702266,
      "dt_refresh":null
   }
]

TWOFA凭据

  1. 查询目录中的Twofa站点
// Consultar catálogos
$payload = array("id_site"=>"56cf5728784806f72b8b4569");
$response = Sync::run(
  $token,
  "/catalogues/sites", 
  $payload,
  'GET'
);
  1. 创建凭据
// Crear credenciales con Token o Autenticación de dos pasos
$twofaSite = $response[0];
$credentials = array();
$credentials[$twofaSite->credentials[0]->name] = 'test';
$credentials[$twofaSite->credentials[1]->name] = 'test';
$payload['credentials'] = $credentials;
$twofaCredential = Sync::run(
  $token,
  "/credentials", 
  $payload,
  'POST'
);
/* Regresa:
{
  id_credential: "5e27c17ca2fc48614c41b33e",
  id_job_uuid: "5e27c17ce6fea94c7c6b4193",
  id_job: "5e27c17ce6fea94c7c6b4194",
  is_new: 1,
  username: "t**t",
  ws: "wss://sync.paybook.com/v1/status/5e27c17ce6fea94c7c6b4194",
  status: "https://sync.paybook.com/v1/jobs/5e27c17ce6fea94c7c6b4194/status",
  twofa: "https://sync.paybook.com/v1/jobs/5e27c17ce6fea94c7c6b4194/twofa"
}
*/
  1. 查询凭据状态并验证其为TWOFA
// Consulta Status Credenciales twofa
$id_job = $twofaCredential->id_job;
$response = Sync::run(
  $token,
  "/jobs/$id_job/status", 
  null,
  'GET'
);
/* Regresa:
[
  {
      code: 100
  },
  {
      code: 101
  },
  {
      code: 410,
      address: "https://sync.paybook.com/v1/jobs/5e27c17ce6fea94c7c6b4194/twofa",
      twofa: [
          {
              name: "token",
              type: "text",
              label: "Enter any number sequence as a token"
          }
      ]
  }
]
*/
$is_twofa = False;
if($response[sizeof($response)->code] == 410) {
  $is_twofa = True;
}
  1. 发送TWOFA
// Manda TWOFA
$twofaToken = array("twofa" => array());
$twofaToken["twofa"][$response[2]->twofa[0]->name] = "123456";
$twofa = Sync::run(
  $token,
  "/jobs/$id_job/twofa", 
  $twofaToken, 
  'POST'
);
/* Regresa:
{
  rid: "ea1e848d-6ec2-454d-b296-0fe2b6c958c2",
  code: 200,
  errors: null,
  status: true,
  message: null,
  response: true
}
*/
  1. 重新查询状态
$id_job = $credential->id_job;
$response = Sync::run(
  $token,
  "/jobs/$id_job/status", 
  null,
  'GET'
);
/* Regresa:
[
  {
      code: 100
  },
  {
      code: 101
  },
  {
      code: 410,
      address: "https://sync.paybook.com/v1/jobs/5e27c17ce6fea94c7c6b4194/twofa",
      twofa: [
          {
              name: "token",
              type: "text",
              label: "Enter any number sequence as a token"
          }
      ]
  },
  {
      code: 102
  },
  {
      code: 200
  }
]
*/

查询凭证

$response = Sync::run(
  $token,
  "/credentials", 
  null,
  'GET'
);

返回

[
   {
      "id_credential":"5e17c432d7288d358a039141",
      "id_user":"5e17c430b021255889294af7",
      "id_environment":"574894bf7848066d138b4570",
      "id_external":"",
      "id_site":"56cf5728784806f72b8b4568",
      "id_site_organization":"56cf4ff5784806152c8b4567",
      "id_site_organization_type":"56cf4f5b784806cf028b4568",
      "id_organization":"56cf4ff5784806152c8b4567",
      "is_authorized":1,
      "is_locked":0,
      "is_twofa":0,
      "can_sync":0,
      "ready_in":86377,
      "username":"t**t",
      "code":200,
      "keywords":null,
      "dt_authorized":1578615866,
      "dt_execute":1578615858,
      "dt_ready":1578702266,
      "dt_refresh":null
   }
]

删除凭证

$id_credential = $credential->id_credential;
$response = Sync::run(
  $token,
  "/credentials/$id_credential", 
  null,
  'DELETE'
);

返回

{
   "rid":"c241efe0-03a6-41cb-9e8e-73d6e0a779c1",
   "code":200,
   "errors":null,
   "status":true,
   "message":null,
   "response":true
}

查询凭证变更历史

// Despues de crear una credencial (como en ejemplos anteriores)
$id_job = $twofaCredential->id_job;
$response = Sync::run(
  $token,
  "/jobs/$id_job/status", 
  null,
  'GET'
);

返回

[
   {
      "code":100
   },
   {
      "code":101
   },
   {
      "code":102
   },
   {
      "code":200
   }
]

您可以在此处查看每个代码的含义。

账户

查询特定用户的账户

$response = Sync::run(
  $token,
  "/accounts", 
  array("id_credential"=>$id_credential),
  'GET'
);

返回

[
  {
    "id_account":"3406d3750b215b9a7f8b4523",
    "id_user":"15f98da7784606ef028b4598",
    "id_external":"37f98da4584806ef028b4567",
    "id_credential":"4806d33c0b234af8028b478b",
    "id_site":"98cf5728784839f72b8b449f",
    "id_site_organization":"29cf4ff5784806152c8b4548",
    "name":"My Bank Account",
    "number":null,
    "balance":1200,
    "site":{
        "id_site":"12cf5728784883f72b8b495f",
        "name":"The Bank",
        "avatar":"/images/8574c68f0b212a194a8c1819/avatar",
        "cover":"/images/5944c68f0b212a194a8c3949/cover",
        "small_cover":"/images/59454c68f0b212a194a8c5719/small_cover"
    },
    "dt_refresh":1460816581
  }
]

交易

查询特定用户的交易

$response = Sync::run(
  $token,
  "/transactions", 
  array(
      "id_credential"=>$id_credential,
      "limit"=>5
  ),
  'GET'
);

返回

[
  {
    "id_transaction": "5b64940bcaaf237edf60ce7a",
    "id_account": "5703f88223428348328b45db",
    "id_account_type": "520d3aa93b8e778e0d000000",
    "id_credential": "5e1d5734e849507b770c5007",
    "id_currency": "523a25953b8e77910e8b456c",
    "id_disable_type": "5bcff1e77d8b6b44380f6da2",
    "id_external": "",
    "id_site": "56cf5728784806f72b8b4568",
    "id_site_organization": "56cf4ff5784806152c8b4567",
    "id_site_organization_type": "56cf4f5b784806cf028b4568",
    "id_user": "5df7e5f40437a90a8d5037a0",
    "is_account_disable": 0,
    "is_deleted": 0,
    "is_disable": 1,
    "is_pending": 0,
    "description": "ACME Checking Transaction 20",
    "amount": 26,
    "currency": "MXN",
    "attachments": [],
    "extra": null,
    "reference": null,
    "keywords": null,
    "dt_transaction": 1533099600,
    "dt_refresh": 1561500261,
    "dt_disable": 1561500261,
    "dt_deleted": null
  },
  {
      "id_transaction": "5b686fd6caaf237ddc20304a",
      "id_account": "5703f88223428348328b45db",
      "id_account_type": "520d3aa93b8e778e0d000000",
      "id_credential": "5e1d5734e849507b770c5007",
      "id_currency": "523a25953b8e77910e8b456c",
      "id_disable_type": "5bcff1e77d8b6b44380f6da2",
      "id_external": "",
      "id_site": "56cf5728784806f72b8b4568",
      "id_site_organization": "56cf4ff5784806152c8b4567",
      "id_site_organization_type": "56cf4f5b784806cf028b4568",
      "id_user": "5df7e5f40437a90a8d5037a0",
      "is_account_disable": 0,
      "is_deleted": 0,
      "is_disable": 1,
      "is_pending": 0,
      "description": "ACME Checking Transaction 20",
      "amount": 49,
      "currency": "MXN",
      "attachments": [],
      "extra": null,
      "reference": null,
      "keywords": null,
      "dt_transaction": 1533099600,
      "dt_refresh": 1559007370,
      "dt_disable": 1559007370,
      "dt_deleted": null
  },
  .
  .
  .
]

根据某些搜索参数查询交易数量

$response = Sync::run(
  $token,
  "/transactions/count", 
  array("id_credential"=>$id_credential),
  'GET'
);

返回

{
  "count": 140
}

Webhook

创建Webhook

$response = Sync::run(
  array("api_key" => API_KEY),
  "/webhooks", 
  array(
      "url"=>'http://mydomain.ngrok.io/webhook'; // Tu endpoint donde recibiras la devolución de llamada, 
      "events"=>array("credential_create","credential_update","refresh")
  ),
  'POST'
);

返回

{
   "id_webhook":"5e17c4746cee651e7b03df34",
   "id_user":null,
   "events":[
      "credential_create",
      "credential_update",
      "refresh"
   ],
   "url":"http://8e763e9e.ngrok.io/webhook",
   "delay":0,
   "dt_created":1578615924,
   "dt_modified":null
}

查询Webhook

$response = Sync::run(
  array("api_key" => API_KEY),
  "/webhooks", 
  null,
  'GET'
);

返回

[
   {
      "id_webhook":"5e17c4746cee651e7b03df34",
      "id_user":null,
      "is_disabled":0,
      "events":[
         "credential_create",
         "credential_update",
         "refresh"
      ],
      "url":"http://8e763e9e.ngrok.io/webhook",
      "delay":0,
      "ct_failed":0,
      "dt_created":"2020-01-10T00:25:24+00:00",
      "dt_modified":null
   }
]

删除Webhook

$id_webhook = $response->id_webhook;
$response = Sync::run(
  array("api_key" => API_KEY),
  "/webhooks/$id_webhook", 
  null,
  'DELETE'
);

返回

{
   "rid":"faea7aad-5db5-4d8e-b0c3-57a975c18ea2",
   "code":200,
   "errors":null,
   "status":true,
   "message":null,
   "response":true
}

附件(Attachments)

查询特定用户的附件

$response = Sync::run(
  $token,
  "/attachments", 
  array("id_credential"=>$id_credential),
  'GET'
);

返回

[
   {
      "id_attachment":"5db073b4caaf236a6a4c2eb5",
      "id_account":"5db073b1caaf236a6a4c2acc",
      "id_user":"5e17c430b021255889294af7",
      "id_external":"",
      "id_attachment_type":"56bcdfca784806d1378b4567",
      "id_transaction":"5db073b1caaf236a6a4c2acd",
      "is_valid":1,
      "file":"4B2B511C-A29E-4CDF-8AD3-143515CF6152.xml",
      "mime":null,
      "url":"/attachments/5db073b4caaf236a6a4c2eb5",
      "keywords":[
         "3.3",
         "emitidas",
         "i",
         "timbrefiscaldigital",
         "vigente"
      ],
      "dt_refresh":1571844997
   },
   {
      "id_attachment":"5db073b4caaf236a6a4c2eb6",
      "id_account":"5db073b1caaf236a6a4c2acc",
      "id_user":"5e17c430b021255889294af7",
      "id_external":"",
      "id_attachment_type":"56bcdfca784806d1378b4567",
      "id_transaction":"5db073b1caaf236a6a4c2ace",
      "is_valid":1,
      "file":"27D33E8C-0120-4F98-ACCD-1C0DBA9D794F.xml",
      "mime":null,
      "url":"/attachments/5db073b4caaf236a6a4c2eb6",
      "keywords":[
         "001",
         "002",
         "3.3",
         "i",
         "impuestos",
         "recibidas",
         "retenciones",
         "timbrefiscaldigital",
         "traslados",
         "vigente"
      ],
      "dt_refresh":1571844997
   },
   .
   .
   .
]

返回附件

$attachment = $response[0];
$attachmentUrl = $attachment->url;
$response = Sync::run(
  $token,
  $attachmentUrl, 
  null,
  'GET'
);

返回

<?xml version="1.0" encoding="utf-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd" Version="3.3" Serie="C" Folio="78" Fecha="2019-01-24T06:15:49" FormaPago="99" NoCertificado="0000100000040090000" Certificado="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" SubTotal="810.18" Descuento="0.00" Moneda="MXN" Total="810.18" TipoDeComprobante="I" MetodoPago="PUE" LugarExpedicion="00000" Sello="CjGJ6Uz6jWQ6wFyn8SEvRVCOCZq2sRtTAsUkLJjrs8vPSHfeEs+bMBhNnZ+7gLE5gSO+FU+IA64d+I9w98DEop24GRNDoWPxRGvX7SON4p47Ygna/rCWynyjCw8kYqRtBHxypwh0HGFLoNx+ulK+WcOXG7F3Nx2I+EPTg6jn1VvwBm1c1iat1Zgnhcna2ZJyZA3cRFOBhNONocr+qAF8zTtHSoJNYmolOlyIC9akyIPfrNl/ALgni4k1KwpEcr4HsyqVabUDW47vH5TqSNfFz+ZY3bZZZf7FLdTBn8So984+vbomWg/rP7OCBALI/u/+kIkgotm4TF/ImuGjUeKITw==">
    <cfdi:Emisor Rfc="ACM010101ABC" Nombre="ACME CORP" RegimenFiscal="601"/>
    <cfdi:Receptor Rfc="EKU9003173C9" Nombre="ESCUELA KEMPER URGATE SA DE CV" UsoCFDI="P01"/>
    <cfdi:Conceptos>
        <cfdi:Concepto ClaveProdServ="00195316" Cantidad="1" ClaveUnidad="H87" Unidad="PZA" Descripcion="PRODUCTO 1" ValorUnitario="810.18" Importe="810.18" Descuento="0"></cfdi:Concepto>
    </cfdi:Conceptos>
    <cfdi:Complemento>
        <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/timbrefiscaldigital/TimbreFiscalDigitalv11.xsd" Version="1.1" UUID="4B2B511C-A29E-4CDF-8AD3-143515CF6152" FechaTimbrado="2019-10-11T02:43:34" SelloCFD="CjGJ6Uz6jWQ6wFyn8SEvRVCOCZq2sRtTAsUkLJjrs8vPSHfeEs+bMBhNnZ+7gLE5gSO+FUz6jWQ6wFyn8SEvRVCOCZq2sWPxRGvX7SON4p47Ygna/rCWynyjCw8kYqRtBHxypwh0HGFLoNx+ulK+WcOXG7F3Nx2I+EPTg6jn1Vvz6jWQ6wFyn8SEvRVCOCZq2s3cRFOBhNONocr+qAF8zTtHSoJNYmolOlyIC9akyIPfrNl/ALgni4k1KwpEcr4HsyqVabz6jWQ6wFyn8SEvRVCOCZq2sf7FLdTBn8So984+vbomWg/rP7OCBALI/u/+kIkgotm4TF/ImuGjUeKITw==" NoCertificadoSAT="00001000000407657133" SelloSAT="W82etl3ZwAEDP7qT705tkK7jryQU5WCFUIOw1nmDyy5/iaxsOVuDPVyhK7fQMRG6A6x9WHGYjkMDZ0DkOnq1vcClr2Sn5yOLdWd9VYf6hg6e/RiLTn1mSUni/47rWNbyODfcom3hmKasclgBEYZL6unymQD2bsUfMc0L5ODZ5/AfK36/bYVeakauL1NxXMZ2Zc4RrX5Zd5AkF04VB6UWqDL2/zuCGDccA6/MsJR2BeXnq/hQ1I8WNSNGcy1OzBukQqRbhe9hIRit58F/ZtTtFnzyeT3Tknu9MIZFq/7D+tw0TxUziC+g2n86iiKRXnRJQvlowqKmkPGO8jMefrx8pg==" RfcProvCertif="ACM100625MC0"/>
    </cfdi:Complemento>
</cfdi:Comprobante>

返回从附件提取的信息

$attachment = $response[0];
$attachmentUrl = $attachment->url;
$response = Sync::run(
  $token,
  $attachmentUrl."/extra", 
  null,
  'GET'
);

返回

{
    "id_attachment": "5db073b4caaf236a6a4c2eb5",
    "id_user": "5df7e5f40437a90a8d5037a0",
    "id_external": "",
    "is_valid": 1,
    "file": "4B2B511C-A29E-4CDF-8AD3-143515CF6152.xml",
    "mime": null,
    "extra": [
        {
            "n": "CFDI:COMPROBANTE",
            "a": {
                "XMLNS:CFDI": "http://www.sat.gob.mx/cfd/3",
                "XMLNS:XSI": "http://www.w3.org/2001/XMLSchema-instance",
                "XSI:SCHEMALOCATION": "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd",
                "VERSION": "3.3",
                "SERIE": "C",
                "FOLIO": "78",
                "FECHA": "2019-01-24T06:15:49",
                "FORMAPAGO": "99",
                "NOCERTIFICADO": "0000100000040090000",
                "CERTIFICADO": "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",
                "SUBTOTAL": "810.18",
                "DESCUENTO": "0.00",
                "MONEDA": "MXN",
                "TOTAL": "810.18",
                "TIPODECOMPROBANTE": "I",
                "METODOPAGO": "PUE",
                "LUGAREXPEDICION": "00000",
                "SELLO": "CjGJ6Uz6jWQ6wFyn8SEvRVCOCZq2sRtTAsUkLJjrs8vPSHfeEs+bMBhNnZ+7gLE5gSO+FU+IA64d+I9w98DEop24GRNDoWPxRGvX7SON4p47Ygna/rCWynyjCw8kYqRtBHxypwh0HGFLoNx+ulK+WcOXG7F3Nx2I+EPTg6jn1VvwBm1c1iat1Zgnhcna2ZJyZA3cRFOBhNONocr+qAF8zTtHSoJNYmolOlyIC9akyIPfrNl/ALgni4k1KwpEcr4HsyqVabUDW47vH5TqSNfFz+ZY3bZZZf7FLdTBn8So984+vbomWg/rP7OCBALI/u/+kIkgotm4TF/ImuGjUeKITw=="
            },
            "c": [
                {
                    "n": "CFDI:EMISOR",
                    "a": {
                        "RFC": "ACM010101ABC",
                        "NOMBRE": "ACME CORP",
                        "REGIMENFISCAL": "601"
                    }
                },
                {
                    "n": "CFDI:RECEPTOR",
                    "a": {
                        "RFC": "EKU9003173C9",
                        "NOMBRE": "ESCUELA KEMPER URGATE SA DE CV",
                        "USOCFDI": "P01"
                    }
                },
                {
                    "n": "CFDI:CONCEPTOS",
                    "c": [
                        {
                            "n": "CFDI:CONCEPTO",
                            "a": {
                                "CLAVEPRODSERV": "00195316",
                                "CANTIDAD": "1",
                                "CLAVEUNIDAD": "H87",
                                "UNIDAD": "PZA",
                                "DESCRIPCION": "PRODUCTO 1",
                                "VALORUNITARIO": "810.18",
                                "IMPORTE": "810.18",
                                "DESCUENTO": "0"
                            }
                        }
                    ]
                },
                {
                    "n": "CFDI:COMPLEMENTO",
                    "c": [
                        {
                            "n": "TFD:TIMBREFISCALDIGITAL",
                            "a": {
                                "XMLNS:TFD": "http://www.sat.gob.mx/TimbreFiscalDigital",
                                "XMLNS:XSI": "http://www.w3.org/2001/XMLSchema-instance",
                                "XSI:SCHEMALOCATION": "http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/timbrefiscaldigital/TimbreFiscalDigitalv11.xsd",
                                "VERSION": "1.1",
                                "UUID": "4B2B511C-A29E-4CDF-8AD3-143515CF6152",
                                "FECHATIMBRADO": "2019-10-11T02:43:34",
                                "SELLOCFD": "CjGJ6Uz6jWQ6wFyn8SEvRVCOCZq2sRtTAsUkLJjrs8vPSHfeEs+bMBhNnZ+7gLE5gSO+FUz6jWQ6wFyn8SEvRVCOCZq2sWPxRGvX7SON4p47Ygna/rCWynyjCw8kYqRtBHxypwh0HGFLoNx+ulK+WcOXG7F3Nx2I+EPTg6jn1Vvz6jWQ6wFyn8SEvRVCOCZq2s3cRFOBhNONocr+qAF8zTtHSoJNYmolOlyIC9akyIPfrNl/ALgni4k1KwpEcr4HsyqVabz6jWQ6wFyn8SEvRVCOCZq2sf7FLdTBn8So984+vbomWg/rP7OCBALI/u/+kIkgotm4TF/ImuGjUeKITw==",
                                "NOCERTIFICADOSAT": "00001000000407657133",
                                "SELLOSAT": "W82etl3ZwAEDP7qT705tkK7jryQU5WCFUIOw1nmDyy5/iaxsOVuDPVyhK7fQMRG6A6x9WHGYjkMDZ0DkOnq1vcClr2Sn5yOLdWd9VYf6hg6e/RiLTn1mSUni/47rWNbyODfcom3hmKasclgBEYZL6unymQD2bsUfMc0L5ODZ5/AfK36/bYVeakauL1NxXMZ2Zc4RrX5Zd5AkF04VB6UWqDL2/zuCGDccA6/MsJR2BeXnq/hQ1I8WNSNGcy1OzBukQqRbhe9hIRit58F/ZtTtFnzyeT3Tknu9MIZFq/7D+tw0TxUziC+g2n86iiKRXnRJQvlowqKmkPGO8jMefrx8pg==",
                                "RFCPROVCERTIF": "ACM100625MC0"
                            }
                        }
                    ]
                }
            ]
        }
    ]
}

环境

此文件编写时使用的版本

相关链接

  1. Paybook Sync官方文档
  2. 每个资源的参数.
  3. 响应代码及其含义.
  4. 通过Postman逐步消费Sync REST API。强烈推荐以了解Paybook Sync账户的结构。

评论和贡献

相信您能提出pull request!👌

由Paybook家族用💙制作。