* * 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 */ 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 * * @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 * * @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); } /** * 创建二维码. * * @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). * * @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); } }