new-admin-api/vendor/overtrue/wechat/src/Card/Card.php

892 lines
22 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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.
*/
/**
* Card.php.
*
* @author overtrue <i@overtrue.me>
* @copyright 2016 overtrue <i@overtrue.me>
*
* @see https://github.com/overtrue
* @see http://overtrue.me
*/
namespace EasyWeChat\Card;
use Doctrine\Common\Cache\Cache;
use Doctrine\Common\Cache\FilesystemCache;
use EasyWeChat\Core\AbstractAPI;
use EasyWeChat\Support\Arr;
use Psr\Http\Message\ResponseInterface;
class Card extends AbstractAPI
{
/**
* Cache.
*
* @var Cache
*/
protected $cache;
/**
* Ticket cache key.
*
* @var string
*/
protected $ticketCacheKey;
/**
* Ticket cache prefix.
*
* @var string
*/
protected $ticketCachePrefix = 'overtrue.wechat.card_api_ticket.';
const API_GET_COLORS = 'https://api.weixin.qq.com/card/getcolors';
const API_CREATE_CARD = 'https://api.weixin.qq.com/card/create';
const API_CREATE_QRCODE = 'https://api.weixin.qq.com/card/qrcode/create';
const API_SHOW_QRCODE = 'https://mp.weixin.qq.com/cgi-bin/showqrcode';
const API_GET_CARD_TICKET = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket';
const API_CREATE_LANDING_PAGE = 'https://api.weixin.qq.com/card/landingpage/create';
const API_DEPOSIT_CODE = 'https://api.weixin.qq.com/card/code/deposit';
const API_GET_DEPOSIT_COUNT = 'https://api.weixin.qq.com/card/code/getdepositcount';
const API_CHECK_CODE = 'https://api.weixin.qq.com/card/code/checkcode';
const API_GET_HTML = 'https://api.weixin.qq.com/card/mpnews/gethtml';
const API_SET_TEST_WHITE_LIST = 'https://api.weixin.qq.com/card/testwhitelist/set';
const API_GET_CODE = 'https://api.weixin.qq.com/card/code/get';
const API_CONSUME_CARD = 'https://api.weixin.qq.com/card/code/consume';
const API_DECRYPT_CODE = 'https://api.weixin.qq.com/card/code/decrypt';
const API_GET_CARD_LIST = 'https://api.weixin.qq.com/card/user/getcardlist';
const API_GET_CARD = 'https://api.weixin.qq.com/card/get';
const API_LIST_CARD = 'https://api.weixin.qq.com/card/batchget';
const API_UPDATE_CARD = 'https://api.weixin.qq.com/card/update';
const API_SET_PAY_CELL = 'https://api.weixin.qq.com/card/paycell/set';
const API_MODIFY_STOCK = 'https://api.weixin.qq.com/card/modifystock';
const API_UPDATE_CODE = 'https://api.weixin.qq.com/card/code/update';
const API_DELETE_CARD = 'https://api.weixin.qq.com/card/delete';
const API_DISABLE_CARD = 'https://api.weixin.qq.com/card/code/unavailable';
const API_ACTIVATE_MEMBER_CARD = 'https://api.weixin.qq.com/card/membercard/activate';
const API_ACTIVATE_MEMBER_USER_FORM = 'https://api.weixin.qq.com/card/membercard/activateuserform/set';
const API_GET_MEMBER_USER_INFO = 'https://api.weixin.qq.com/card/membercard/userinfo/get';
const API_UPDATE_MEMBER_CARD_USER = 'https://api.weixin.qq.com/card/membercard/updateuser';
const API_CREATE_SUB_MERCHANT = 'https://api.weixin.qq.com/card/submerchant/submit';
const API_UPDATE_SUB_MERCHANT = 'https://api.weixin.qq.com/card/submerchant/update';
const API_GET_SUB_MERCHANT = 'https://api.weixin.qq.com/card/submerchant/get';
const API_LIST_SUB_MERCHANT = 'https://api.weixin.qq.com/card/submerchant/batchget';
const API_GET_CATEGORIES = 'https://api.weixin.qq.com/card/getapplyprotocol';
const API_ACTIVATE_GENERAL_CARD = 'https://api.weixin.qq.com/card/generalcard/activate';
const API_UPDATE_GENERAL_CARD_USER = 'https://api.weixin.qq.com/card/generalcard/updateuser';
/**
* 获取卡券颜色.
*
* @return \EasyWeChat\Support\Collection
*/
public function getColors()
{
return $this->parseJSON('get', [self::API_GET_COLORS]);
}
/**
* 创建卡券.
*
* @param string $cardType
* @param array $baseInfo
* @param array $especial
* @param array $advancedInfo
*
* @return \EasyWeChat\Support\Collection
*/
public function create($cardType = 'member_card', array $baseInfo = [], array $especial = [], array $advancedInfo = [])
{
$params = [
'card' => [
'card_type' => strtoupper($cardType),
strtolower($cardType) => array_merge(['base_info' => $baseInfo], $especial, ['advanced_info' => $advancedInfo]),
],
];
return $this->parseJSON('json', [self::API_CREATE_CARD, $params]);
}
/**
* 创建二维码.
*
* @param array $cards
*
* @return \EasyWeChat\Support\Collection
*/
public function QRCode(array $cards = [])
{
return $this->parseJSON('json', [self::API_CREATE_QRCODE, $cards]);
}
/**
* ticket 换取二维码图片.
*
* @param string $ticket
*
* @return array
*/
public function showQRCode($ticket = null)
{
$params = [
'ticket' => $ticket,
];
$http = $this->getHttp();
/** @var ResponseInterface $response */
$response = $http->get(self::API_SHOW_QRCODE, $params);
return [
'status' => $response->getStatusCode(),
'reason' => $response->getReasonPhrase(),
'headers' => $response->getHeaders(),
'body' => strval($response->getBody()),
'url' => self::API_SHOW_QRCODE.'?'.http_build_query($params),
];
}
/**
* 通过ticket换取二维码 链接.
*
* @param string $ticket
*
* @return string
*/
public function getQRCodeUrl($ticket)
{
return self::API_SHOW_QRCODE.'?ticket='.$ticket;
}
/**
* 获取 卡券 Api_ticket.
*
* @param bool $refresh 是否强制刷新
*
* @return string $apiTicket
*/
public function getAPITicket($refresh = false)
{
$key = $this->getTicketCacheKey();
$ticket = $this->getCache()->fetch($key);
if (!$ticket || $refresh) {
$result = $this->parseJSON('get', [self::API_GET_CARD_TICKET, ['type' => 'wx_card']]);
$this->getCache()->save($key, $result['ticket'], $result['expires_in'] - 500);
return $result['ticket'];
}
return $ticket;
}
/**
* 微信卡券JSAPI 卡券发放.
*
* @param array $cards
*
* @return string
*/
public function jsConfigForAssign(array $cards)
{
return json_encode(array_map(function ($card) {
return $this->attachExtension($card['card_id'], $card);
}, $cards));
}
/**
* 生成 js添加到卡包 需要的 card_list 项.
*
* @param string $cardId
* @param array $extension
*
* @return string
*/
public function attachExtension($cardId, array $extension = [])
{
$timestamp = time();
$ext = [
'code' => Arr::get($extension, 'code'),
'openid' => Arr::get($extension, 'openid', Arr::get($extension, 'open_id')),
'timestamp' => $timestamp,
'outer_id' => Arr::get($extension, 'outer_id'),
'balance' => Arr::get($extension, 'balance'),
'fixed_begintimestamp' => Arr::get($extension, 'fixed_begintimestamp'),
'outer_str' => Arr::get($extension, 'outer_str'),
];
$ext['signature'] = $this->getSignature(
$this->getAPITicket(),
$timestamp,
$cardId,
$ext['code'],
$ext['openid'],
$ext['balance']
);
return [
'cardId' => $cardId,
'cardExt' => json_encode($ext),
];
}
/**
* 生成签名.
*
* @return string
*/
public function getSignature()
{
$params = func_get_args();
sort($params, SORT_STRING);
return sha1(implode($params));
}
/**
* 创建货架接口.
*
* @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 \EasyWeChat\Support\Collection
*/
public function createLandingPage($banner, $pageTitle, $canShare, $scene, $cardList)
{
$params = [
'banner' => $banner,
'page_title' => $pageTitle,
'can_share' => $canShare,
'scene' => $scene,
'card_list' => $cardList,
];
return $this->parseJSON('json', [self::API_CREATE_LANDING_PAGE, $params]);
}
/**
* 导入code接口.
*
* @param string $cardId
* @param array $code
*
* @return \EasyWeChat\Support\Collection
*/
public function deposit($cardId, $code)
{
$params = [
'card_id' => $cardId,
'code' => $code,
];
return $this->parseJSON('json', [self::API_DEPOSIT_CODE, $params]);
}
/**
* 查询导入code数目.
*
* @param string $cardId
*
* @return \EasyWeChat\Support\Collection
*/
public function getDepositedCount($cardId)
{
$params = [
'card_id' => $cardId,
];
return $this->parseJSON('json', [self::API_GET_DEPOSIT_COUNT, $params]);
}
/**
* 核查code接口.
*
* @param string $cardId
* @param array $code
*
* @return \EasyWeChat\Support\Collection
*/
public function checkCode($cardId, $code)
{
$params = [
'card_id' => $cardId,
'code' => $code,
];
return $this->parseJSON('json', [self::API_CHECK_CODE, $params]);
}
/**
* 查询Code接口.
*
* @param string $code
* @param bool $checkConsume
* @param string $cardId
*
* @return \EasyWeChat\Support\Collection
*/
public function getCode($code, $checkConsume, $cardId)
{
$params = [
'code' => $code,
'check_consume' => $checkConsume,
'card_id' => $cardId,
];
return $this->parseJSON('json', [self::API_GET_CODE, $params]);
}
/**
* 核销Code接口.
*
* @param string $code
* @param string $cardId
*
* @return \EasyWeChat\Support\Collection
*/
public function consume($code, $cardId = null)
{
if (28 === strlen($code) && $cardId && 28 !== strlen($cardId)) {
list($code, $cardId) = [$cardId, $code];
}
$params = [
'code' => $code,
];
if ($cardId) {
$params['card_id'] = $cardId;
}
return $this->parseJSON('json', [self::API_CONSUME_CARD, $params]);
}
/**
* Code解码接口.
*
* @param string $encryptedCode
*
* @return \EasyWeChat\Support\Collection
*/
public function decryptCode($encryptedCode)
{
$params = [
'encrypt_code' => $encryptedCode,
];
return $this->parseJSON('json', [self::API_DECRYPT_CODE, $params]);
}
/**
* 图文消息群发卡券.
*
* @param string $cardId
*
* @return \EasyWeChat\Support\Collection
*/
public function getHtml($cardId)
{
$params = [
'card_id' => $cardId,
];
return $this->parseJSON('json', [self::API_GET_HTML, $params]);
}
/**
* 设置测试白名单.
*
* @param array $openids
*
* @return \EasyWeChat\Support\Collection
*/
public function setTestWhitelist($openids)
{
$params = [
'openid' => $openids,
];
return $this->parseJSON('json', [self::API_SET_TEST_WHITE_LIST, $params]);
}
/**
* 设置测试白名单(by username).
*
* @param array $usernames
*
* @return \EasyWeChat\Support\Collection
*/
public function setTestWhitelistByUsername($usernames)
{
$params = [
'username' => $usernames,
];
return $this->parseJSON('json', [self::API_SET_TEST_WHITE_LIST, $params]);
}
/**
* 获取用户已领取卡券接口.
*
* @param string $openid
* @param string $cardId
*
* @return \EasyWeChat\Support\Collection
*/
public function getUserCards($openid, $cardId = '')
{
$params = [
'openid' => $openid,
'card_id' => $cardId,
];
return $this->parseJSON('json', [self::API_GET_CARD_LIST, $params]);
}
/**
* 查看卡券详情.
*
* @param string $cardId
*
* @return \EasyWeChat\Support\Collection
*/
public function getCard($cardId)
{
$params = [
'card_id' => $cardId,
];
return $this->parseJSON('json', [self::API_GET_CARD, $params]);
}
/**
* 批量查询卡列表.
*
* @param int $offset
* @param int $count
* @param string $statusList
*
* @return \EasyWeChat\Support\Collection
*/
public function lists($offset = 0, $count = 10, $statusList = 'CARD_STATUS_VERIFY_OK')
{
$params = [
'offset' => $offset,
'count' => $count,
'status_list' => $statusList,
];
return $this->parseJSON('json', [self::API_LIST_CARD, $params]);
}
/**
* 更改卡券信息接口 and 设置跟随推荐接口.
*
* @param string $cardId
* @param string $type
* @param array $baseInfo
* @param array $especial
*
* @return \EasyWeChat\Support\Collection
*/
public function update($cardId, $type, $baseInfo = [], $especial = [])
{
$card = [];
$card['card_id'] = $cardId;
$card[$type] = [];
$cardInfo = [];
if ($baseInfo) {
$cardInfo['base_info'] = $baseInfo;
}
$card[$type] = array_merge($cardInfo, $especial);
return $this->parseJSON('json', [self::API_UPDATE_CARD, $card]);
}
/**
* 设置微信买单接口.
* 设置买单的 card_id 必须已经配置了门店,否则会报错.
*
* @param string $cardId
* @param bool $isOpen
*
* @return \EasyWeChat\Support\Collection
*/
public function setPayCell($cardId, $isOpen = true)
{
$params = [
'card_id' => $cardId,
'is_open' => $isOpen,
];
return $this->parseJSON('json', [self::API_SET_PAY_CELL, $params]);
}
/**
* 增加库存.
*
* @param string $cardId
* @param int $amount
*
* @return \EasyWeChat\Support\Collection
*/
public function increaseStock($cardId, $amount)
{
return $this->updateStock($cardId, $amount, 'increase');
}
/**
* 减少库存.
*
* @param string $cardId
* @param int $amount
*
* @return \EasyWeChat\Support\Collection
*/
public function reduceStock($cardId, $amount)
{
return $this->updateStock($cardId, $amount, 'reduce');
}
/**
* 修改库存接口.
*
* @param string $cardId
* @param int $amount
* @param string $action
*
* @return \EasyWeChat\Support\Collection
*/
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->parseJSON('json', [self::API_MODIFY_STOCK, $params]);
}
/**
* 更改Code接口.
*
* @param string $code
* @param string $newCode
* @param array $cardId
*
* @return \EasyWeChat\Support\Collection
*/
public function updateCode($code, $newCode, $cardId = [])
{
$params = [
'code' => $code,
'new_code' => $newCode,
'card_id' => $cardId,
];
return $this->parseJSON('json', [self::API_UPDATE_CODE, $params]);
}
/**
* 删除卡券接口.
*
* @param string $cardId
*
* @return \EasyWeChat\Support\Collection
*/
public function delete($cardId)
{
$params = [
'card_id' => $cardId,
];
return $this->parseJSON('json', [self::API_DELETE_CARD, $params]);
}
/**
* 设置卡券失效.
*
* @param string $code
* @param string $cardId
*
* @return \EasyWeChat\Support\Collection
*/
public function disable($code, $cardId = '')
{
$params = [
'code' => $code,
'card_id' => $cardId,
];
return $this->parseJSON('json', [self::API_DISABLE_CARD, $params]);
}
/**
* 会员卡接口激活.
*
* @param array $info
*
* @return \EasyWeChat\Support\Collection
*/
public function activate($info = [], $cardType = 'member_card')
{
if ('general_card' === $cardType) {
return $this->parseJSON('json', [self::API_ACTIVATE_GENERAL_CARD, $info]);
}
return $this->parseJSON('json', [self::API_ACTIVATE_MEMBER_CARD, $info]);
}
/**
* 设置开卡字段接口.
*
* @param string $cardId
* @param array $requiredForm
* @param array $optionalForm
*
* @return \EasyWeChat\Support\Collection
*/
public function activateUserForm($cardId, array $requiredForm = [], array $optionalForm = [])
{
$params = array_merge(['card_id' => $cardId], $requiredForm, $optionalForm);
return $this->parseJSON('json', [self::API_ACTIVATE_MEMBER_USER_FORM, $params]);
}
/**
* 拉取会员信息接口.
*
* @param string $cardId
* @param string $code
*
* @return \EasyWeChat\Support\Collection
*/
public function getMemberCardUser($cardId, $code)
{
$params = [
'card_id' => $cardId,
'code' => $code,
];
return $this->parseJSON('json', [self::API_GET_MEMBER_USER_INFO, $params]);
}
/**
* 更新会员信息.
*
* @param array $params
*
* @return \EasyWeChat\Support\Collection
*/
public function updateMemberCardUser(array $params = [])
{
return $this->parseJSON('json', [self::API_UPDATE_MEMBER_CARD_USER, $params]);
}
/**
* 更新通用员信息.
*
* @param array $params
*
* @return \EasyWeChat\Support\Collection
*/
public function updateGeneralCardUser(array $params = [])
{
return $this->parseJSON('json', [self::API_UPDATE_GENERAL_CARD_USER, $params]);
}
/**
* 添加子商户.
*
* @param array $info
*
* @return \EasyWeChat\Support\Collection
*/
public function createSubMerchant(array $info = [])
{
$params = [
'info' => Arr::only($info, [
'brand_name',
'logo_url',
'protocol',
'end_time',
'primary_category_id',
'secondary_category_id',
'agreement_media_id',
'operator_media_id',
'app_id',
]),
];
return $this->parseJSON('json', [self::API_CREATE_SUB_MERCHANT, $params]);
}
/**
* 更新子商户.
*
* @param int $merchantId
* @param array $info
*
* @return \EasyWeChat\Support\Collection
*/
public function updateSubMerchant($merchantId, array $info = [])
{
$params = [
'info' => array_merge(['merchant_id' => $merchantId],
Arr::only($info, [
'brand_name',
'logo_url',
'protocol',
'end_time',
'primary_category_id',
'secondary_category_id',
'agreement_media_id',
'operator_media_id',
'app_id',
])),
];
return $this->parseJSON('json', [self::API_UPDATE_SUB_MERCHANT, $params]);
}
/**
* 获取子商户信息.
*
* @param int $merchantId
*
* @return \EasyWeChat\Support\Collection
*/
public function getSubMerchant($merchantId)
{
return $this->parseJSON('json', [self::API_GET_SUB_MERCHANT, ['merchant_id' => $merchantId]]);
}
/**
* 批量获取子商户信息.
*
* @param int $beginId
* @param int $limit
* @param string $status
*
* @return \EasyWeChat\Support\Collection
*/
public function listSubMerchants($beginId = 0, $limit = 50, $status = 'CHECKING')
{
$params = [
'begin_id' => $beginId,
'limit' => $limit,
'status' => $status,
];
return $this->parseJSON('json', [self::API_LIST_SUB_MERCHANT, $params]);
}
/**
* 卡券开放类目查询接口.
*
* @return \EasyWeChat\Support\Collection
*/
public function getCategories()
{
return $this->parseJSON('get', [self::API_GET_CATEGORIES]);
}
/**
* Set cache manager.
*
* @param \Doctrine\Common\Cache\Cache $cache
*
* @return $this
*/
public function setCache(Cache $cache)
{
$this->cache = $cache;
return $this;
}
/**
* Return cache manager.
*
* @return \Doctrine\Common\Cache\Cache
*/
public function getCache()
{
return $this->cache ?: $this->cache = new FilesystemCache(sys_get_temp_dir());
}
/**
* Set Api_ticket cache prifix.
*
* @param string $prefix
*
* @return $this
*/
public function setTicketCachePrefix($prefix)
{
$this->ticketCachePrefix = $prefix;
return $this;
}
/**
* Set Api_ticket cache key.
*
* @param string $cacheKey
*
* @return $this
*/
public function setTicketCacheKey($cacheKey)
{
$this->ticketCacheKey = $cacheKey;
return $this;
}
/**
* Get ApiTicket token cache key.
*
* @return string
*/
public function getTicketCacheKey()
{
if (is_null($this->ticketCacheKey)) {
return $this->ticketCachePrefix.$this->getAccessToken()->getAppId();
}
return $this->ticketCacheKey;
}
/**
* Set current url.
*
* @param string $url
*
* @return Card
*/
public function setUrl($url)
{
$this->url = $url;
return $this;
}
}