全栈小学生 0e47055ccb v1.0.0-beta.1
2023-04-15 17:12:49 +08:00

429 lines
10 KiB
PHP

<?php
/*
* This file is part of the overtrue/wechat.
*
* (c) overtrue <i@overtrue.me>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace EasyWeChat\OfficialAccount\Card;
use EasyWeChat\Kernel\BaseClient;
use EasyWeChat\Kernel\Traits\InteractsWithCache;
/**
* Class Client.
*
* @author overtrue <i@overtrue.me>
*/
class Client extends BaseClient
{
use InteractsWithCache;
/**
* @var string
*/
protected $url;
/**
* Ticket cache key.
*
* @var string
*/
protected $ticketCacheKey;
/**
* Ticket cache prefix.
*
* @var string
*/
protected $ticketCachePrefix = 'easywechat.official_account.card.api_ticket.';
/**
* 获取卡券颜色.
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
*/
public function colors()
{
return $this->httpGet('card/getcolors');
}
/**
* 卡券开放类目查询接口.
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
*/
public function categories()
{
return $this->httpGet('card/getapplyprotocol');
}
/**
* 创建卡券.
*
* @param string $cardType
* @param array $attributes
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function create($cardType = 'member_card', array $attributes = [])
{
$params = [
'card' => [
'card_type' => strtoupper($cardType),
strtolower($cardType) => $attributes,
],
];
return $this->httpPostJson('card/create', $params);
}
/**
* 查看卡券详情.
*
* @param string $cardId
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function get($cardId)
{
$params = [
'card_id' => $cardId,
];
return $this->httpPostJson('card/get', $params);
}
/**
* 批量查询卡列表.
*
* @param int $offset
* @param int $count
* @param string $statusList
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function list($offset = 0, $count = 10, $statusList = 'CARD_STATUS_VERIFY_OK')
{
$params = [
'offset' => $offset,
'count' => $count,
'status_list' => $statusList,
];
return $this->httpPostJson('card/batchget', $params);
}
/**
* 更改卡券信息接口 and 设置跟随推荐接口.
*
* @param string $cardId
* @param string $type
* @param array $attributes
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function update($cardId, $type, array $attributes = [])
{
$card = [];
$card['card_id'] = $cardId;
$card[strtolower($type)] = $attributes;
return $this->httpPostJson('card/update', $card);
}
/**
* 删除卡券接口.
*
* @param string $cardId
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function delete($cardId)
{
$params = [
'card_id' => $cardId,
];
return $this->httpPostJson('card/delete', $params);
}
/**
* 创建二维码.
*
* @param array $cards
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function createQrCode(array $cards)
{
return $this->httpPostJson('card/qrcode/create', $cards);
}
/**
* ticket 换取二维码图片.
*
* @param string $ticket
*
* @return array
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function getQrCode($ticket)
{
$baseUri = 'https://mp.weixin.qq.com/cgi-bin/showqrcode';
$params = [
'ticket' => $ticket,
];
$response = $this->requestRaw($baseUri, 'GET', $params);
return [
'status' => $response->getStatusCode(),
'reason' => $response->getReasonPhrase(),
'headers' => $response->getHeaders(),
'body' => strval($response->getBody()),
'url' => $baseUri.'?'.http_build_query($params),
];
}
/**
* 通过ticket换取二维码 链接.
*
* @param string $ticket
*
* @return string
*/
public function getQrCodeUrl($ticket)
{
return sprintf('https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s', $ticket);
}
/**
* 创建货架接口.
*
* @param string $banner
* @param string $pageTitle
* @param bool $canShare
* @param string $scene [SCENE_NEAR_BY 附近,SCENE_MENU 自定义菜单,SCENE_QRCODE 二维码,SCENE_ARTICLE 公众号文章,
* SCENE_H5 h5页面,SCENE_IVR 自动回复,SCENE_CARD_CUSTOM_CELL 卡券自定义cell]
* @param array $cardList
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function createLandingPage($banner, $pageTitle, $canShare, $scene, $cardList)
{
$params = [
'banner' => $banner,
'page_title' => $pageTitle,
'can_share' => $canShare,
'scene' => $scene,
'card_list' => $cardList,
];
return $this->httpPostJson('card/landingpage/create', $params);
}
/**
* 图文消息群发卡券.
*
* @param string $cardId
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function getHtml($cardId)
{
$params = [
'card_id' => $cardId,
];
return $this->httpPostJson('card/mpnews/gethtml', $params);
}
/**
* 设置测试白名单.
*
* @param array $openids
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function setTestWhitelist($openids)
{
$params = [
'openid' => $openids,
];
return $this->httpPostJson('card/testwhitelist/set', $params);
}
/**
* 设置测试白名单(by username).
*
* @param array $usernames
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function setTestWhitelistByName(array $usernames)
{
$params = [
'username' => $usernames,
];
return $this->httpPostJson('card/testwhitelist/set', $params);
}
/**
* 获取用户已领取卡券接口.
*
* @param string $openid
* @param string $cardId
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function getUserCards($openid, $cardId = '')
{
$params = [
'openid' => $openid,
'card_id' => $cardId,
];
return $this->httpPostJson('card/user/getcardlist', $params);
}
/**
* 设置微信买单接口.
* 设置买单的 card_id 必须已经配置了门店,否则会报错.
*
* @param string $cardId
* @param bool $isOpen
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function setPayCell($cardId, $isOpen = true)
{
$params = [
'card_id' => $cardId,
'is_open' => $isOpen,
];
return $this->httpPostJson('card/paycell/set', $params);
}
/**
* 设置自助核销接口
* 设置买单的 card_id 必须已经配置了门店,否则会报错.
*
* @param string $cardId
* @param bool $isOpen
* @param bool $verifyCod
* @param bool $remarkAmount
*
* @return mixed
*/
public function setPayConsumeCell($cardId, $isOpen = true, $verifyCod = false, $remarkAmount = false)
{
$params = [
'card_id' => $cardId,
'is_open' => $isOpen,
'need_verify_cod' => $verifyCod,
'need_remark_amount' => $remarkAmount,
];
return $this->httpPostJson('card/selfconsumecell/set', $params);
}
/**
* 增加库存.
*
* @param string $cardId
* @param int $amount
*
* @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string
*/
public function increaseStock($cardId, $amount)
{
return $this->updateStock($cardId, $amount, 'increase');
}
/**
* 减少库存.
*
* @param string $cardId
* @param int $amount
*
* @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string
*/
public function reduceStock($cardId, $amount)
{
return $this->updateStock($cardId, $amount, 'reduce');
}
/**
* 修改库存接口.
*
* @param string $cardId
* @param int $amount
* @param string $action
*
* @return mixed
*
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
protected function updateStock($cardId, $amount, $action = 'increase')
{
$key = 'increase' === $action ? 'increase_stock_value' : 'reduce_stock_value';
$params = [
'card_id' => $cardId,
$key => abs($amount),
];
return $this->httpPostJson('card/modifystock', $params);
}
}