stiply / stiply-php-sdk
Stiply API 的官方 PHP SDK
Requires
- php: ^7.3 || ^8.0
- guzzlehttp/guzzle: ^6.5 || ^7.3
- illuminate/support: ^6.0 || ^7.0 || ^8.0
- symfony/http-kernel: ^4.0 || ^5.3
Requires (Dev)
- brainmaestro/composer-git-hooks: ^2.8
- fakerphp/faker: ^1.9.1
- friendsofphp/php-cs-fixer: ^3.1
- phpunit/phpunit: ^9.3
This package is auto-updated.
Last update: 2024-09-29 06:14:19 UTC
README
使用 PHP 编写的官方库,用于使用 Stiply API。
目录
需求
- PHP >= 7.2.0
安装
此库可通过 Composer 获取
composer require stiply/stiply-php-sdk
使用
此库的主要目的是简化与 Stiply API 的交互。设置 HTTP 客户端和执行请求的任务由 SDK 处理。相反,您只需调用 \Stiply\Api
实例上的专用方法即可获取所需响应。快速示例
<?php
$tokens = new \My\Custom\TokenRepository();
$api = \Stiply\Api::create($tokens);
// Returns an instance of \Stiply\Ping
$result = $api->ping(['ping_value' => 'pong']);
echo $result['ping_value']; // Or "$result->ping_value"
echo $result['status_code'];
如你所见,在成功的情况下,将返回一个数据对象,其中包含来自 Stiply API 的响应体作为其属性。
配置
默认情况下,\Stiply\Api
实例配置为使用 Stiply API 的 v1.1 版本,该版本需要 OAuth2 进行身份验证/授权。但是,如果您想针对另一个 API 版本和身份验证/授权方式,可以通过 \Stiply\Config\Config
的单例实例来更改此设置。
<?php
// We want to target the "v1" version of the Stiply API instead
$config = \Stiply\Config\Config::getInstance();
$config->set('version', 'v1');
$config->set('auth', 'basic');
$tokens = new \My\Custom\TokenRepository();
$api = \Stiply\Api::create($tokens);
// Use "$api" to interact with the Stiply API
这里有一些需要注意的事项
$config
变量指向\Stiply\Config\Config
的单例实例。在任何时候都应只存在一个配置对象,因为它由 SDK 本身以及可能由 SDK 的用户使用来自定义一些可配置选项(例如 API 版本和身份验证方法)。- 建议在创建新的
\Stiply\Api
实例之前自定义任何配置选项,因为一些配置选项(例如 "guzzle"、"base_url")仅在创建新的\Stiply\Api
实例时才会被认可。 - SDK 在内部使用 Guzzle 来执行所有 HTTP 请求。因此,可以在创建客户端时自定义一些特定的 Guzzle 请求选项。但这很少是必要的,并且应小心覆盖 SDK 本身设置的任何选项(例如 "base_uri")。
> 重要:如果您使用 SDK 并且遇到消息为 "cURL 错误 60:SSL 证书问题:无法获取本地颁发者证书..." 的 \Stiply\Exceptions\StiplyException
,则可能是您的服务器 SSL 证书有问题或完全缺失。如果您在本地测试 SDK 并且不想被此错误打扰,可以像这样更新 "guzzle" 配置选项:$config->set('guzzle', ['verify' => false])
。这将禁用 SSL 证书验证。然而,这是不安全的,我们不推荐这样做。
身份验证
SDK 故意不关心与 Stiply API 连接的身份验证/授权部分。因此,实现合适的身份验证/授权策略是 SDK 用户的唯一责任。这里采取的方法是向 \Stiply\Api
实例提供一个实现 \Stiply\Contracts\Auth\TokenRepository
的实例。此实现应通过 \My\Custom\TokenRepository#token
方法返回有效的身份验证令牌。
<?php
namespace My\Custom;
use Stiply\Contracts\Auth\TokenRepository as TokenRepositoryContract;
class TokenRepository implements TokenRepositoryContract
{
/**
* Return a Stiply compatible auth token.
*
* @return string
*/
public function token() : string
{
// Your custom logic for generating a suitable auth token for use with
// the Stiply API. In case of API version "v1.1" this would mean
// providing a valid (personal) access token using OAuth, in case of API
// version "v1" this would mean the base64 encoded combination of
// "username:password"
return $token;
}
}
然后应在创建新的 \Stiply\Api
实例时提供您自定义的令牌存储库实例。
<?php
$tokens = new \My\Custom\TokenRepository();
$api = \Stiply\Api::create($tokens);
// Use "$api" to interact with the Stiply API
然后,每次SDK向Stiply API发出请求时,都会负责构造适当的授权头。
重要:如果您想自定义默认的授权配置,请确保指定的“版本”和“授权”选项兼容。例如,Stiply API的“v1”版本只能与“basic”授权(或某些合作伙伴的“jwt”)配合使用,而“v1.1”版本只能与“oauth”授权配合使用。如果SDK检测到版本/授权选项不匹配,将抛出一个
\Stiply\Exceptions\AuthException
实例。
可用方法
当前所有API端点都在SDK的以下相应方法中表示:
$result = $api->ping($parameters);
ping Stiply API。如果成功,$result
将是一个包含Stiply API响应体的\Stiply\Ping
实例的属性。$parameters
是一个包含以下键/值对的数组
键 | 值 | 描述 |
---|---|---|
ping_value | string | 如果响应成功,则相同的字符串将出现在$result->ping_value 上。 |
$result = $api->createSignRequest($parameters);
创建一个新的签名请求。如果成功,$result
将是一个包含Stiply API响应体的\Stiply\CreateSignRequest
实例的属性。$parameters
是一个包含以下键/值对的数组
键 | 值 | 描述 |
---|---|---|
file | resource | 应签名的文档(DOC、DOCX或PDF)。 |
filename | string | 文档的文件名,包括扩展名。此必须与实际文档的文件名匹配,否则上传文档将失败。 |
term | string | 代表签署期限的两位代码(“1d” = 1天,“2w” = 2周,“3m” = 3个月)。 |
doc_name (可选) | string | 文档的名称。请注意,这不仅仅是文件的名称,而是文档的标签。 |
message (可选) | string | 要包含在发送给签署者的邮件中的消息。 |
comment (可选) | string | 内部使用的注释。 |
external_key (可选,唯一) | string | 您内部使用的密钥,以便您不必将Stiply签名请求密钥保存在本地数据库中。然而,您的外部密钥必须是唯一的。 |
call_back_url (可选) | string | Stiply在最后一个签署者签署文档时调用的URL。请注意,必须在回调URL中添加?key={sign_request_key} 。 |
$result = $api->createSigner($signRequest, $parameters);
为给定的签名请求创建一个新的签署者。
先决条件
- 签名请求必须存在
- 签名请求尚未发送
如果成功,$result
将是一个包含Stiply API响应体的\Stiply\CreateSigner
实例的属性。$signRequest
是一个表示签名请求键的字符串。$parameters
是一个包含以下键/值对的数组
键 | 值 | 描述 |
---|---|---|
signer_email | string | 签署者的电子邮件地址。 |
signer_signature_fields | array | 包含签名字段信息的数组,使用标签或坐标。 |
signer_text_fields (可选) | array | 包含文本字段信息的数组,使用标签或坐标。 |
auth_method (可选) | string | 签署者的认证方法。目前,“sms”、“emandate”和“idin”是有效的选项。 |
cell_phone_number (可选) | int 或string | 如果将 auth_method 设置为 "sms",则需要提供签名人 的手机号码。未将 auth_method 设置为 "sms" 时,手机号码不会被保存。电话号码需要包含国家代码,例如:31655136642 。 |
emandate (可选) | array | 当 auth_method 设置为 "emandate" 时,您可以添加可选的 emandate 数组。 |
idin (可选) | array | 当 auth_method 设置为 "idin" 时,您可以添加可选的 idin 数组。 |
language (可选) | string | 签名人收到的通信中使用的两位字母语言代码。 |
role (可选) | string | 签名人可以有不同的角色。默认情况下,签名人需要明确签署文档。当将 "cc" 作为角色值设置时,签名人应仅能复制(cc)。 |
invitation_method (可选) | string | 如果您想自己邀请签名人,应将 invitation_method 设置为 "custom"。在这种情况下,Stiply 不会向签名人发送带有签署请求的邮件。相反,当您发送签署请求时,API 将返回一个唯一的签署链接,您可以将其提供给签名人。 |
message (可选) | string | 您可以向签名人发送特定消息,该消息将覆盖发送给签名人邮件中的签署请求消息。 |
$result = $api->sendSignRequest($signRequest);
发送指定的签署请求。
先决条件
- 签名请求必须存在
- 签名请求尚未发送
- 签署请求至少有 1 个签名人且至少有 1 个签名字段
成功时,$result
将是 \Stiply\SendSignRequest
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签署请求的键。
$result = $api->getSignedDocument($signRequest);
获取与给定签署请求关联的签署文档。
先决条件
- 签名请求必须存在
- 签署请求已被所有签名人签署
成功时,$result
将是 \Stiply\GetSignedDocument
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签署请求的键。
$result = $api->getProofDocument($signRequest);
获取与给定签署请求关联的证明文档。
先决条件
- 签名请求必须存在
- 签署请求已被所有签名人签署
成功时,$result
将是 \Stiply\GetProofDocument
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签署请求的键。
$result = $api->sendReminder($signRequest);
向给定签署请求的当前签名人发送提醒邮件。
先决条件
- 签名请求必须存在
- 签署请求已发送
成功时,$result
将是 \Stiply\SendReminder
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签署请求的键。
$result = $api->extendTerm($signRequest, $parameters);
延长给定签署请求的期限。
先决条件
- 签名请求必须存在
- 签署请求已发送
- 签署请求的当前期限已过期
成功时,$result
将是 \Stiply\ExtendTerm
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签署请求的键。 $parameters
是一个包含以下键/值对的数组
键 | 值 | 描述 |
---|---|---|
term | string | 代表签署期限的两位代码(“1d” = 1天,“2w” = 2周,“3m” = 3个月)。 |
$result = $api->getSignRequestKey($key);
使用给定的外部键(您本地的键)获取签署请求键。
先决条件
- 签名请求必须存在
成功时,$result
将是 \Stiply\GetSignRequestKey
的一个实例,它将 Stiply API 的响应体作为其属性。 $key
是一个字符串,表示签署请求的外部键(您本地的键)。
$result = $api->getSignRequest($signRequest);
获取给定的签名请求。
先决条件
- 签名请求必须存在
成功时,$result
将是 \Stiply\GetSignRequest
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签名请求的键。
$result = $api->deleteSignRequest($signRequest);
删除给定的签名请求。
先决条件
- 签名请求必须存在
成功时,$result
将是 \Stiply\DeleteSignRequest
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签名请求的键。
$result = $api->getSigner($signRequest, $signer);
获取给定签名请求的给定签名人。
先决条件
- 签名请求必须存在
- 签名人必须存在
成功时,$result
将是 \Stiply\GetSigner
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签名请求的键。 $signer
是一个字符串,表示签名人键。
$result = $api->updateSigner($signRequest, $signer, $parameters);
更新尚未签名的签名人电子邮件地址和/或电话号码。在更新时需要同时提交这两个值。如果您只想更新其中一个,只需提交另一个的原始值。
请注意,如果签名人已经收到签名请求邮件,并且在之后更新了签名人电子邮件地址,签名人邮件中的链接将不再有效。签名人不会在新电子邮件地址上收到新的签名请求邮件。请使用 \Stiply\Api#sendReminder
在电子邮件地址更新后进行此操作。如果您只更新电话号码,原始签名链接仍然有效,因此不需要提醒。
先决条件
- 签名请求必须存在
- 签名人必须存在
- 签名人未签署
成功时,$result
将是 \Stiply\UpdateSigner
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签名请求的键。 $signer
是一个字符串,表示签名人键。 $parameters
是一个数组,包含以下键/值对
键 | 值 | 描述 |
---|---|---|
new_email | string | 签名人新的电子邮件地址,将发送提醒邮件。此值将永久替换签名人电子邮件地址。 |
new_cell_phone_number | int 或string | 签名人新的电话号码,将发送身份验证短信。此值将永久替换签名人电话号码。 |
$result = $api->deleteSigner($signRequest, $signer);
删除给定的签名人。
先决条件
- 签名请求必须存在
- 签名请求尚未发送
- 签名人必须存在
成功时,$result
将是 \Stiply\DeleteSigner
的一个实例,它将 Stiply API 的响应体作为其属性。 $signRequest
是一个字符串,表示签名请求的键。 $signer
是一个字符串,表示签名人键。
示例
以下示例演示了如何使用 SDK 创建新的签名请求、添加签名人,并最终发送签名请求。
首先,我们将创建 \Stiply\Api
类的新实例,然后我们可以使用它来与 Stiply API 通信
<?php
$tokens = new \My\Custom\TokenRepository();
$api = \Stiply\Api::create($tokens);
接下来,我们将创建一个新的签名请求
<?php
// Previously discussed code is here
$result = $api->createSignRequest([
'file' => \file_get_contents('/some/path/to/a/valid/document/foo.pdf'),
'filename' => 'foo.pdf', // Without this uploading the doc will fail!
'term' => '1w',
'doc_name' => 'SDK Test',
'comment' => 'Testing the SDK',
]);
$key = $result['data']['signRequest']['key'];
现在我们可以将一个签名人添加到新创建的签名请求中
<?php
// Previously discussed code is here
$result = $api->createSigner($key, [
'signer_email' => 'signer@stiply.nl',
'signer_signature_fields' => [['name' => 'signature_0']],
'auth_method' => 'sms',
'cell_phone_number' => 31612345678,
]);
重要 假设我们之前上传的文档
foo.pdf
包含一个或多个格式为{{signature_0}}
的标签。
最后,我们可以将签名请求发送给第一个(在这种情况下是唯一的)签名人
<?php
// Previously discussed code is here
$result = $api->sendSignRequest($key);
这位签名人现在应该会收到一封包含链接的邮件,该链接指向我们的查看器应用程序,可以在其中数字签名上传的文档。
总结来说,创建新的签名请求、添加单个签署者和发送签名请求的完整代码可能看起来像这样
<?php
$tokens = new \My\Custom\TokenRepository();
$api = \Stiply\Api::create($tokens);
// Create a new sign request and upload the document to be signed
$result = $api->createSignRequest([
'file' => \file_get_contents('/some/path/to/a/valid/document/foo.pdf'),
'filename' => 'foo.pdf', // Without this uploading the doc will fail!
'term' => '1w',
'doc_name' => 'SDK Test',
'comment' => 'Testing the SDK',
]);
// We will need the sign request key for the next steps
$key = $result['data']['signRequest']['key'];
// Create a new signer for the sign request referred to by "$key"
$result = $api->createSigner($key, [
'signer_email' => 'signer@stiply.nl',
'signer_signature_fields' => [['name' => 'signature_0']],
'auth_method' => 'sms',
'cell_phone_number' => 31612345678,
]);
// Send the sign request referred to by "$key"
$result = $api->sendSignRequest($key);
测试
可以模拟\Stiply\Api
的一个实例。这可能在您自己的测试目的中很有用
<?php
$tokens = new \My\Custom\TokenRepository();
$handler = new \GuzzleHttp\Handler\MockHandler([
new Response(200, [], \json_encode([...])),
]);
$api = \Stiply\Api::mock($tokens, $handler);
// Perform your own testing
还可以查看相关的Guzzle 文档。