You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
crmeb_php/crmeb/services/easywechat/subscribe/ProgramSubscribe.php

285 lines
8.4 KiB

<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace crmeb\services\easywechat\subscribe;
use EasyWeChat\Core\AbstractAPI;
use EasyWeChat\Core\AccessToken;
use EasyWeChat\Core\Exceptions\InvalidArgumentException;
/**
* 小程序订阅消息
* Class ProgramSubscribe
* @package crmeb\utils
* @method $this
* @method $this template(string $template_id) 设置模板id
* @method $this withTemplateId(string $template_id) 设置模板id
* @method $this andTemplateId(string $template_id) 设置模板id
* @method $this andTemplate(string $template_id) 设置模板id
* @method $this andUses(string $template_id) 设置模板id
* @method $this to(string $touser) 设置opendid
* @method $this andReceiver(string $touser) 设置opendid
* @method $this withReceiver(string $touser) 设置opendid
* @method $this with(array $data) 设置发送内容
* @method $this andData(array $data) 设置发送内容
* @method $this withData(array $data) 设置发送内容
* @method $this data(array $data) 设置发送内容
* @method $this withUrl(string $page) 设置跳转路径
*/
class ProgramSubscribe extends AbstractAPI
{
/**
* 添加模板接口
*/
const API_SET_TEMPLATE_ADD = 'https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate';
/**
* 删除模板消息接口
*/
const API_SET_TEMPLATE_DEL = 'https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate';
/**
* 获取模板消息列表
*/
const API_GET_TEMPLATE_LIST = 'https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate';
/**
* 获取模板消息分类
*/
const API_GET_TEMPLATE_CATE = 'https://api.weixin.qq.com/wxaapi/newtmpl/getcategory';
/**
* 获取模板消息关键字
*/
const API_GET_TEMPLATE_KEYWORKS = 'https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatekeywords';
/**
* 获取公共模板
*/
const API_GET_PUBLIC_TEMPLATE = 'https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatetitles';
/**
* 发送模板消息
*/
const API_SUBSCRIBE_SEND = 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send';
/**
* Attributes
* @var array
*/
protected $message = [
'touser' => '',
'template_id' => '',
'page' => '',
'data' => [],
];
/**
* Message backup.
*
* @var array
*/
protected $messageBackup;
protected $required = ['template_id', 'touser'];
/**
* ProgramSubscribeService constructor.
* @param AccessToken $accessToken
*/
public function __construct(AccessToken $accessToken)
{
parent::__construct($accessToken);
$this->messageBackup = $this->message;
}
/**
* 获取当前拥有的模板列表
* @return \EasyWeChat\Support\Collection|null
* @throws \EasyWeChat\Core\Exceptions\HttpException
*/
public function getTemplateList()
{
return $this->parseJSON('get', [self::API_GET_TEMPLATE_LIST]);
}
/**
* 获取公众模板列表
* @param string $ids
* @param int $start
* @param int $limit
* @return \EasyWeChat\Support\Collection|null
* @throws \EasyWeChat\Core\Exceptions\HttpException
*/
public function getPublicTemplateList(string $ids, int $start = 0, int $limit = 10)
{
$params = [
'ids' => $ids,
'start' => $start,
'limit' => $limit
];
return $this->parseJSON('get', [self::API_GET_PUBLIC_TEMPLATE, $params]);
}
/**
* 获取模板分类
* @return \EasyWeChat\Support\Collection|null
* @throws \EasyWeChat\Core\Exceptions\HttpException
*/
public function getTemplateCate()
{
return $this->parseJSON('get', [self::API_GET_TEMPLATE_CATE]);
}
/**
* 获取模板标题下的关键词列表
* @param string $tid 模板标题 id,可通过接口获取
* @return \EasyWeChat\Support\Collection|null
* @throws \EasyWeChat\Core\Exceptions\HttpException
*/
public function getPublicTemplateKeywords(string $tid)
{
$params = [
'tid' => $tid
];
return $this->parseJSON('get', [self::API_GET_TEMPLATE_KEYWORKS, $params]);
}
/**
* 添加订阅模板消息
* @param string $tid 模板标题 id,可通过接口获取,也可登录小程序后台查看获取
* @param array $kidList 模板序列号 关键词顺序可以自由搭配(例如 [3,5,4] 或 [4,5,3]),最多支持5个,最少2个关键词组合
* @param string $sceneDesc 服务场景描述,15个字以内
* @return \EasyWeChat\Support\Collection|null
* @throws \EasyWeChat\Core\Exceptions\HttpException
*/
public function addTemplate(string $tid, array $kidList, string $sceneDesc = '')
{
$params = [
'tid' => $tid,
'kidList' => $kidList,
'sceneDesc' => $sceneDesc,
];
return $this->parseJSON('json', [self::API_SET_TEMPLATE_ADD, $params]);
}
/**
* 删除模板消息
* @param string $priTmplId
* @return \EasyWeChat\Support\Collection|null
* @throws \EasyWeChat\Core\Exceptions\HttpException
*/
public function delTemplate(string $priTmplId)
{
$params = [
'priTmplId' => $priTmplId
];
return $this->parseJSON('json', [self::API_SET_TEMPLATE_DEL, $params]);
}
/**
* 发送订阅消息
* @param array $data
* @return \EasyWeChat\Support\Collection|null
* @throws InvalidArgumentException
* @throws \EasyWeChat\Core\Exceptions\HttpException
*/
public function send(array $data = [])
{
$params = array_merge($this->message, $data);
foreach ($params as $key => $value) {
if (in_array($key, $this->required, true) && empty($value) && empty($this->message[$key])) {
throw new InvalidArgumentException("Attribute '$key' can not be empty!");
}
$params[$key] = empty($value) ? $this->message[$key] : $value;
}
$params['data'] = $this->formatData($params['data']);
$this->message = $this->messageBackup;
return $this->parseJSON('json', [self::API_SUBSCRIBE_SEND, $params]);
}
/**
* 设置订阅消息发送data
* @param array $data
* @return array
*/
protected function formatData(array $data)
{
$return = [];
foreach ($data as $key => $item) {
if (is_scalar($item)) {
$value = $item;
} elseif (is_array($item) && !empty($item)) {
if (isset($item['value'])) {
$value = strval($item['value']);
} elseif (count($item) < 2) {
$value = array_shift($item);
} else {
[$value] = $item;
}
} else {
$value = 'error data item.';
}
$return[$key] = ['value' => $value];
}
return $return;
}
/**
* Magic access..
*
* @param $method
* @param $args
* @return $this
*/
public function __call($method, $args)
{
$map = [
'template' => 'template_id',
'templateId' => 'template_id',
'uses' => 'template_id',
'to' => 'touser',
'receiver' => 'touser',
'url' => 'page',
'link' => 'page',
'data' => 'data',
'with' => 'data',
];
if (0 === stripos($method, 'with') && strlen($method) > 4) {
$method = lcfirst(substr($method, 4));
}
if (0 === stripos($method, 'and')) {
$method = lcfirst(substr($method, 3));
}
if (isset($map[$method])) {
$this->message[$map[$method]] = array_shift($args);
}
return $this;
}
}