Files
zyt/server/app/common/service/qywx/QywxPromotionSuiteTicket.php
T
2026-08-05 11:08:02 +08:00

54 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
namespace app\common\service\qywx;
use EasyWeChat\Kernel\Exceptions\RuntimeException;
use EasyWeChat\OpenWork\Contracts\SuiteTicket;
use think\facade\Db;
/** 将企业微信每十分钟推送的 suite_ticket 加密持久化,避免进程/缓存重启后丢失。 */
class QywxPromotionSuiteTicket implements SuiteTicket
{
public function __construct(private readonly string $suiteId)
{
}
public function getTicket(): string
{
$cipher = (string) (Db::name('qywx_promotion_provider_state')
->where('suite_id', $this->suiteId)
->value('suite_ticket_cipher') ?? '');
if ($cipher === '') {
throw new RuntimeException('No suite_ticket found. 请先在企业微信服务商后台配置并验证应用指令回调。');
}
return QywxPromotionCredentialCipher::decrypt($cipher);
}
public function setTicket(string $ticket): static
{
$now = time();
$cipher = QywxPromotionCredentialCipher::encrypt($ticket);
$exists = Db::name('qywx_promotion_provider_state')->where('suite_id', $this->suiteId)->find();
if ($exists) {
Db::name('qywx_promotion_provider_state')->where('suite_id', $this->suiteId)->update([
'suite_ticket_cipher' => $cipher,
'ticket_received_at' => $now,
'update_time' => $now,
]);
} else {
Db::name('qywx_promotion_provider_state')->insert([
'suite_id' => $this->suiteId,
'suite_ticket_cipher' => $cipher,
'ticket_received_at' => $now,
'create_time' => $now,
'update_time' => $now,
]);
}
return $this;
}
}