paybook / sync-php
一个用于轻松消费Syncfy REST的包
Requires
- rmccue/requests: ^1.7
This package is not auto-updated.
Last update: 2024-09-24 19:43:50 UTC
README
SYNC-PHP
Sync 从授权用户的金融机构获取账户和交易信息,并将其以有组织、易于使用的方式返回给第三方解决方案。
目录
安装
- 通过composer安装
composer require paybook/sync-php
要求
- 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提供的金融机构的实体(个人或公司),我们可以通过以下图表直观地看到这一点
需要指出的是,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回调。每当同步数据更新时,它们都会被激活,帮助你跟上信息的最新变化。
主要优势是它允许你直接在应用程序中接收凭据、交易和附件的最新更新,而无需不断查询它们。
为了开发目的,我们将使用 ngrok 服务,它允许我们创建公共URL来通过互联网公开我们的本地服务器。您可以在其 下载页面 查看如何安装。
现在,我们将使用 PHP 和 Slim 创建一个简单的服务器。
请注意,这些技术仅用于说明目的,开发者可以自由选择他们认为最合适的实现。
创建一个名为 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 KEY 和 TOKEN。
-
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获取信息的理想流程示例,尽管可能性很多,但这是获取信息的理想情况。
对于这一点,如果您决定使用 Sync Widget,您将已省略步骤 2、3 和 4。
图中的步骤如下
- 创建一个用户。 (查看示例)
- 查询站点并选择您想要同步的站点。(查看示例)
- 为该用户和站点创建一个凭据。(查看示例)
- 监控新凭据的状态。(查看示例)
- 创建一个新的webhook,指定您的应用程序中等待更新的端点。(查看示例)
- 等待并处理来自Sync的更新。
- 查询在相应资源中可用的新的信息。
资源和示例
您可以在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”;以下示例涵盖了这两种情况。
普通凭证
正常:只需要用户名和密码的凭据。
// 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" }
$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凭据
// Consultar catálogos $payload = array("id_site"=>"56cf5728784806f72b8b4569"); $response = Sync::run( $token, "/catalogues/sites", $payload, 'GET' );
// 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" } */
// 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; }
// 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 } */
$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" } } ] } ] } ] }
环境
此文件编写时使用的版本
- PHP: 7.1.23
- Composer: 1.10
- rmccue/requests:^1.7
相关链接
- Paybook Sync官方文档。
- 每个资源的参数.
- 响应代码及其含义.
- 通过Postman逐步消费Sync REST API。强烈推荐以了解Paybook Sync账户的结构。
评论和贡献
相信您能提出pull request!👌
由Paybook家族用💙制作。