admin/addon/wechat/model/Wechat.php

960 lines
37 KiB
PHP
Raw Permalink 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
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都云之牛科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.com
* =========================================================
*/
namespace addon\wechat\model;
use addon\wxoplatform\model\OpenPlatform;
use addon\wxoplatform\model\Oplatform;
use EasyWeChat\Factory;
use EasyWeChat\Kernel\Messages\Article;
use EasyWeChat\Kernel\Messages\Text;
use EasyWeChat\Kernel\Messages\News;
use EasyWeChat\Kernel\Messages\NewsItem;
use app\model\BaseModel;
use think\facade\Cache;
/**
* 微信公众号
*/
class Wechat extends BaseModel
{
public $app;//微信公众对象
private $site_id;//站点
//公众号类型
public $service_type = array (
0 => "订阅号",
1 => "由历史老帐号升级后的订阅号",
2 => "服务号",
);
//公众号认证类型
public $verify_type = array (
-1 => "未认证",
0 => "微信认证",
1 => "新浪微博认证",
2 => "腾讯微博认证",
3 => "已资质认证通过但还未通过名称认证",
4 => "已资质认证通过、还未通过名称认证,但通过了新浪微博认证",
5 => "已资质认证通过、还未通过名称认证,但通过了腾讯微博认证",
);
//business_info 说明
public $business_type = array (
'open_store' => "是否开通微信门店功能",
'open_scan' => "是否开通微信扫商品功能",
'open_pay' => "是否开通微信支付功能",
'open_card' => "是否开通微信卡券功能",
'open_shake' => "是否开通微信摇一摇功能",
);
public function __construct($site_id = 1)
{
$this->site_id = $site_id;
// $response = $this->app->server->serve();
// 将响应输出
// $response->send();exit; // Laravel 里请使用return $response;
}
/**
* 授权实例
*/
public function app()
{
$config_model = new Config();
$config_result = $config_model->getWechatConfig($this->site_id);
$config = $config_result[ "data" ];
if (!empty($config)) {
$config_info = $config[ "value" ];
}
//授权方式 手动授权 或 自动授权(通过开放平台)
$auth_type = $config_info[ "is_authopen" ] ?? '';
if ($auth_type == "1") {
$oplatform_model = new Oplatform();
$config_info[ 'type' ] = 'wechat';
$this->app = $oplatform_model->app($config_info);
} else {
$config = [
'app_id' => $config_info[ "appid" ] ?? '',
'secret' => $config_info[ "appsecret" ] ?? '',
'token' => $config_info[ "token" ] ?? '', // Token
'aes_key' => $config_info[ 'encodingaeskey' ] ?? '', // EncodingAESKey兼容与安全模式下请一定要填写
// 指定 API 调用返回结果的类型array(default)/collection/object/raw/自定义类名
'response_type' => 'array',
/**
* 日志配置
*
* level: 日志级别, 可选为debug/info/notice/warning/error/critical/alert/emergency
* permission日志文件权限(可选)默认为null若为null值,monolog会取0644
* file日志文件位置(绝对路径!!!),要求可写权限
*/
'log' => [
'level' => 'debug',
'permission' => 0777,
'file' => 'runtime/log/wechat/easywechat.logs',
],
];
if (empty($config[ 'app_id' ]) || empty($config[ 'secret' ])) {
throw new \Exception('商家公众号配置有误,请联系平台管理员');
}
$this->app = Factory::officialAccount($config);
}
return $this->app;
}
/**
* 创建微信菜单
* @param $buttons
*/
public function menu($buttons)
{
try {
$result = $this->app()->menu->create($buttons);
if ($result[ 'errcode' ] == 0) {
return $this->success();
} else {
return $this->error($result, $result[ "errmsg" ]);
}
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* 拉取粉丝列表
* @param $nextOpenId
* @return \multitype
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
*/
public function user($nextOpenId = null)
{
try {
$result = $this->app()->user->list($nextOpenId); // $nextOpenId 可选
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* 查询多个粉丝信息
* @param $user_list 数组 [$openId1, $openId2, ...]
*/
public function selectUser($user_list)
{
try {
$result = $this->app()->user->select($user_list); // $nextOpenId 可选
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* 得到粉丝信息
*/
public function getUser($openId)
{
try {
$result = $this->app()->user->get($openId); // $nextOpenId 可选
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* TODO
* 根据 Code 获取用户 session 信息
* @param $param
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
*/
public function authCodeToOpenid($params = [])
{
try {
if (empty($_REQUEST[ "code" ])) {
$auth_result = $this->getAuthCode(request()->url(true));
if ($auth_result[ "code" ] >= 0) {
Header("Location: " . $auth_result[ "data" ]);
} else {
return $auth_result;
}
}
$user = $this->app()->oauth->user();//获取授权用户
$data = [
'openid' => $user->getId(),
'userinfo' => [
'avatarUrl' => $user->getAvatar(),
'nickName' => $user->getNickname()
]
];
return $this->success($data);
} catch (\Exception $e) {
if (property_exists($e, 'body')) {
return $this->handleError($e->body[ 'errcode' ], $e->body[ 'errmsg' ]);
}
return $this->error([], $e->getMessage());
}
}
/**
* 根据code获取授权信息
* @param $code
* @return array
*/
public function getAuthByCode($params)
{
try {
$user = $this->app()->oauth->userByCode($params[ 'code' ]);//获取授权用户
$original = $user->getOriginal();
$data = [
'openid' => $original[ 'openid' ],
'userinfo' => [
'avatarUrl' => $original[ 'headimgurl' ] ?? '',
'nickName' => $original[ 'nickname' ] ?? ''
]
];
if (isset($original[ 'unionid' ])) {
$data[ 'unionid' ] = $original[ 'unionid' ];
}
return $this->success($data);
} catch (\Exception $e) {
if (property_exists($e, 'body')) {
return $this->handleError($e->body[ 'errcode' ], $e->body[ 'errmsg' ]);
}
return $this->error([], $e->getMessage());
}
}
/**
* 获取公众号网页授权code
* @param $redirect
* @param string $scopes snsapi_base:静默授权 snsapi_userinfo:用户授权
* @return array
*/
public function getAuthCode($redirect, $scopes = 'snsapi_base')
{
try {
$response = $this->app()->oauth->scopes([ $scopes ])->redirect($redirect);
return $this->success($response->getTargetUrl());
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* 获取永久二维码
* @return unknown
*/
public function getQrcode($uid)
{
$result = $this->app()->qrcode->forever($uid);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
$url = $this->app()->qrcode->url($result[ 'data' ][ 'ticket' ]);
if (isset($url[ 'errcode' ]) && $url[ 'errcode' ] != 0) {
return $this->error($url, $url[ "errmsg" ]);
}
return $this->success($url);
}
/**
* 获取临时二维码
* @param $scene
* @return array
*/
public function getTempQrcode($scene, $seconds)
{
try {
$result = $this->app()->qrcode->temporary($scene, $seconds);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
$url = $this->app()->qrcode->url($result[ 'ticket' ]);
if (isset($url[ 'errcode' ]) && $url[ 'errcode' ] != 0) {
return $this->handleError($url[ 'errcode' ], $url[ "errmsg" ]);
}
return $this->success($url);
} catch (\Exception $e) {
if (property_exists($e, 'body')) {
return $this->handleError($e->body[ 'errcode' ], $e->body[ 'errmsg' ]);
}
return $this->error([], $e->getMessage());
}
}
/**
* 获取jssdk配置
* @param unknown $url
*/
public function getJssdkConfig($url)
{
try {
$this->app()->jssdk->setUrl($url);
$res = $this->app->jssdk->buildConfig([], false, false, false);
return $this->success($res);
} catch (\Exception $e) {
if (property_exists($e, 'body')) {
return $this->handleError($e->body[ 'errcode' ], $e->body[ 'errmsg' ]);
}
return $this->error([], $e->getMessage());
}
}
/********************************************************** 数据统计与分析start *******************************************************************/
/********************************************************** 数据统计与分析end *******************************************************************/
/*******************************************************************************微信接口连接开始*****************************************************/
/*******************************************************************************微信接口连接结束*****************************************************/
/***************************************************************** 微信公众号 统计 start *****************************************************************************************/
/***************************************************************** 微信公众号 统计 end *****************************************************************************************/
/****************************************************************************** 数据统计与分析***********************************************************/
/**
* 获取用户增减数据, 最大时间跨度7;
* @param $from
* @param $to
*/
public function userSummary($from, $to)
{
try {
$result = $this->app()->data_cube->userSummary($from, $to);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error([], $result[ "errmsg" ]);
}
return $this->success($result[ "list" ]);
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* 获取累计用户数据, 最大时间跨度7
* @param $from
* @param $to
*/
public function userCumulate($from, $to)
{
try {
$result = $this->app()->data_cube->userCumulate($from, $to);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error([], $result[ "errmsg" ]);
}
return $this->success($result[ "list" ]);
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* 获取接口分析分时数据, 最大时间跨度1;
* @param $from
* @param $to
* @return array|\multitype
*/
public function interfaceSummaryHourly($from, $to)
{
try {
$result = $this->app()->data_cube->interfaceSummaryHourly($from, $to);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error([], $result[ "errmsg" ]);
}
return $this->success($result[ "list" ]);
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/**
* 获取接口分析数据, 最大时间跨度30;
* @param $from
* @param $to
* @return array|\multitype
*/
public function interfaceSummary($from, $to)
{
try {
$result = $this->app()->data_cube->interfaceSummary($from, $to);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error([], $result[ "errmsg" ]);
}
return $this->success($result[ "list" ]);
} catch (\Exception $e) {
return $this->error([], $e->getMessage());
}
}
/****************************************************************************** 数据统计与分析***********************************************************/
/****************************************************************************** 素材start***********************************************************/
/**
* 上传图片
* @param $path
* @return array
*/
function uploadImage($path)
{
$result = $this->app()->material->uploadImage($path);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/**
* 上传语音
* @param $path
* @return array
*/
function uploadVoice($path)
{
$result = $this->app()->material->uploadVoice($path);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/**
* 上传视频
* @param $path
* @return array
*/
function uploadVideo($path)
{
$result = $this->app()->material->uploadVideo($path);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/**
* 上传缩略图
* @param $path
* @return array
*/
function uploadThumb($path)
{
$result = $this->app()->material->uploadThumb($path);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/**
* 上传图文
* @param $data
*/
public function uploadArticle($data)
{
$article_data = [];
foreach ($data as $k => $v) {
$article_data[] = new Article($v);
}
$result = $this->app()->material->uploadArticle($article_data);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/**
* 修改图文
* @param $mediaId
* @param $data 文章详情
* @param int $index 多图文中的第几篇
* @return array
*/
public function updateArticle($mediaId, $data, $index = 0)
{
$result = $this->app()->material->updateArticle($mediaId, $data, $index);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/**
* 上传图文消息图片
* @param $path
* @return array
* @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
*/
public function uploadArticleImage($path)
{
$result = $this->app()->material->uploadArticleImage($path);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/**
* 获取永久素材
* @param $mediaId
* @return array
*/
public function getMaterial($mediaId)
{
$result = $this->app()->material->get($mediaId);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/**
* 删除永久素材
* @param $mediaId
* @return array
*/
public function deleteMaterial($mediaId)
{
$result = $this->app()->material->delete($mediaId);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/****************************************************************************** 素材end***********************************************************/
/****************************************************************************** 回复start***********************************************************/
/**
* 用户事件
* @return array
*/
public function relateWeixin()
{
$server = $this->app->server;
$message = $server->getMessage();
if (isset($message[ 'MsgType' ])) {
switch ( $message[ 'MsgType' ] ) {
case 'event':
$this->app->server->push(function($res) {
if ($res[ 'Event' ] == 'subscribe') {
// 关注公众号
$Userstr = $this->getUser($res[ 'FromUserName' ]);
//获取用户信息
$wechat_user = $this->app->user->get($res[ 'FromUserName' ]);
if (preg_match("/^qrscene_/", $res[ 'EventKey' ])) {
$source_uid = substr($res[ 'EventKey' ], 8);
$_SESSION[ 'source_uid' ] = $source_uid;
} elseif (!empty($_SESSION[ 'source_uid' ])) {
$source_uid = $_SESSION[ 'source_uid' ];
} else {
$source_uid = 0;
}
if (preg_match("/^qrscene_key_/", $res[ 'EventKey' ])) {
//新增2021.06.02
$key = substr($res[ 'EventKey' ], 12);
$cache = Cache::get('wechat_' . $key);
if (!empty($cache)) {
Cache::set('wechat_' . $key, $wechat_user);
}
}
if (preg_match("/^verify_/", $res[ 'EventKey' ])) {
$cache = Cache::get($res[ 'EventKey' ]);
if (empty($cache)) {
Cache::set($res[ 'EventKey' ], $wechat_user, 7200);
}
}
$nickname_decode = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $wechat_user[ 'nickname' ]);
$headimgurl = $wechat_user[ 'headimgurl' ];
$sex = $wechat_user[ 'sex' ];
$language = $wechat_user[ 'language' ];
$country = $wechat_user[ 'country' ];
$province = $wechat_user[ 'province' ];
$city = $wechat_user[ 'city' ];
$district = "";
$openid = $wechat_user[ 'openid' ];
$nickname = $wechat_user[ 'nickname' ];
if (!empty($wechat_user[ 'unionid' ])) {
$unionid = $wechat_user[ 'unionid' ];
} else {
$unionid = '';
}
$memo = $wechat_user[ 'remark' ];
$data = array (
'site_id' => $this->site_id,
'nickname' => $nickname,
'nickname_decode' => $nickname_decode,
'headimgurl' => $headimgurl,
'sex' => $sex,
'language' => $language,
'country' => $country,
'province' => $province,
'city' => $city,
'district' => $district,
'openid' => $openid,
'unionid' => $unionid,
'groupid' => '',
'is_subscribe' => 1,
'remark' => $memo,
'subscribe_time' => $wechat_user[ 'subscribe_time' ] ?? 0,
'subscribe_scene' => $wechat_user[ 'subscribe_scene' ] ?? 0,
'unsubscribe_time' => $wechat_user[ 'unsubscribe_time' ] ?? 0,
'update_date' => time()
);
$fans = new Fans();
$fans_info = $fans->getFansInfo([ [ 'openid', '=', $openid ], [ 'site_id', '=', $this->site_id ] ]);
if (empty($fans_info[ 'data' ])) {
$fans->addFans($data);
} else {
$fans->editFans($data, [ [ 'openid', '=', $openid ], [ 'site_id', '=', $this->site_id ] ]);
}
//获取关注发送消息内容
$replay = new Replay();
$replay_content = $replay->getWechatFollowReplay($this->site_id);
return new Text($replay_content[ 'data' ]);
} else if ($res[ 'Event' ] == 'unsubscribe') {
//取消关注
$fans = new Fans();
$openid = $res[ 'FromUserName' ];
$fans->unfollowWechat((string) $openid);
} else if ($res[ 'Event' ] == 'unsubscribe') {
//取消关注
$fans = new Fans();
$openid = $res[ 'FromUserName' ];
$fans->unfollowWechat((string) $openid);
} else if ($res[ 'Event' ] == 'SCAN') {
// SCAN事件 - 用户已关注时的事件推送 - 扫描带参数二维码事件
$openid = $res[ 'FromUserName' ];
$data = $res[ 'EventKey' ];
if (preg_match("/^key_/", $data)) {
$key = substr($data, 4);
$cache = Cache::get('wechat_' . $key);
if (!empty($cache)) {
$wechat_user = $this->app->user->get($res[ 'FromUserName' ]);
Cache::set('wechat_' . $key, $wechat_user);
}
}
if (preg_match("/^verify_/", $res[ 'EventKey' ])) {
$cache = Cache::get($res[ 'EventKey' ]);
if (empty($cache)) {
$wechat_user = $this->app->user->get($res[ 'FromUserName' ]);
Cache::set($res[ 'EventKey' ], $wechat_user, 7200);
}
}
return new Text('扫码成功。');
} else if ($res[ 'Event' ] == 'CLICK') {
// CLICK事件 - 自定义菜单事件
$openid = $res[ 'FromUserName' ];
$data = $res[ 'EventKey' ];
if (strpos($res[ 'EventKey' ], 'MATERIAL_GRAPHIC_MESSAGE_') === 0) {
$material_id = substr($res[ 'EventKey' ], 25);
$material_type = 1;
} else if (strpos($res[ 'EventKey' ], 'MATERIAL_PICTURE_') === 0) {
$material_id = substr($res[ 'EventKey' ], 17);
$material_type = 2;
} else if (strpos($res[ 'EventKey' ], 'MATERIAL_TEXT_MESSAGE_') === 0) {
$material_id = substr($res[ 'EventKey' ], 22);
$material_type = 5;
}
$material = new Material();
$media_info = $material->getMaterialInfo([ [ 'id', '=', $material_id, 'type', '=', $material_type ] ]);
$media_info = $media_info[ 'data' ];
if ($media_info) {
$value = json_decode($media_info[ 'value' ], true);
if ($material_type == 1) {
//图文
$url = __ROOT__;
$url = $url . '/index.php/wechat/api/auth/wechatArticle?id=' . $media_info[ 'id' ];
$items = [
new NewsItem([
'title' => $value[ 0 ][ 'title' ],
'description' => strip_tags($value[ 0 ][ 'content' ]),
'url' => $url,
'image' => $value[ 0 ][ 'cover' ][ 'path' ],
]),
];
return new News($items);
} else if ($material_type == 2) {
//图片
} else if ($material_type == 5) {
//文字
return new Text($value[ 'content' ]);
}
}
} else if ($res[ 'Event' ] == 'weapp_audit_success') {
// 小程序审核通过 自动发布
if (addon_is_exit('wxoplatform')) {
$weapp_original = $res[ 'ToUserName' ];
$site_info = model('config')->getInfo([ [ 'app_module', '=', 'shop' ], [ 'config_key', '=', 'WEAPP_CONFIG' ], [ 'value', 'like', '%is_authopen%' ], [ 'value', 'like', '%' . $weapp_original . '%' ] ], 'site_id');
if (!empty($site_info)) {
// 先将审核中的变更为审核成功
model('weapp_audit_record')->update([ 'status' => 1, 'audit_time' => time() ], [ [ 'status', '=', 0 ], [ 'site_id', '=', $site_info[ 'site_id' ] ] ]);
$platform = new OpenPlatform($site_info[ 'site_id' ]);
$result = $platform->release();
if ($result[ 'code' ] >= 0) {
model('weapp_audit_record')->update([ 'status' => 5, 'release_time' => time() ], [ [ 'status', '=', 1 ], [ 'site_id', '=', $site_info[ 'site_id' ] ] ]);
}
}
}
}
});
$response = $this->app->server->serve();
// 将响应输出
return $response->send();
break;
case 'text':
$this->app->server->push(function($res) {
$replay = new Replay();
$rule = $replay->getSiteWechatKeywordsReplay($res[ 'Content' ], $this->site_id);
if ($rule[ 'data' ]) {
if ($rule[ 'data' ][ 'type' ] == 'text') {
//文字
return new Text($rule[ 'data' ][ 'reply_content' ]);
} else {
$material = new Material();
$media_info = $material->getMaterialInfo([ [ 'media_id', '=', $rule[ 'data' ][ 'media_id' ] ] ]);
$media_info = $media_info[ 'data' ];
if ($media_info) {
$material_type = $media_info[ 'type' ];
$value = json_decode($media_info[ 'value' ], true);
if ($material_type == 1) {
$url = __ROOT__;
$url = $url . '/index.php/wechat/api/auth/wechatArticle?id=' . $media_info[ 'id' ];
$items = [
new NewsItem([
'title' => $value[ 0 ][ 'title' ],
'description' => strip_tags($value[ 0 ][ 'content' ]),
'url' => $url,
'image' => $value[ 0 ][ 'cover' ][ 'path' ],
]),
];
return new News($items);
} else if ($material_type == 2) {
//图片
}
}
}
}
});
$response = $this->app->server->serve();
// 将响应输出
return $response->send();
break;
case 'image':
// return '收到图片消息';
break;
case 'voice':
// return '收到语音消息';
break;
case 'video':
// return '收到视频消息';
break;
case 'location':
//return '收到坐标消息';
break;
case 'link':
//return '收到链接消息';
break;
case 'file':
///return '收到文件消息';
// ... 其它消息
default:
//return '收到其它消息';
break;
}
}
$response = $this->app->server->serve();
return $response->send();
}
/****************************************************************************** 回复end***********************************************************/
/****************************************************************************** 模板消息start ***********************************************************/
/**
* 添加模板消息
* @param unknown $shortId
*/
public function getTemplateId($shortId)
{
try {
$res = $this->app()->template_message->addTemplate($shortId);
if (isset($res[ 'errcode' ]) && $res[ 'errcode' ] == 0) return $res;
$errormsg = [
'45026' => '模板数量超出限制'
];
return [ 'errcode' => $res[ 'errcode' ], 'errmsg' => $errormsg[ $res[ 'errcode' ] ] ?? $res[ 'errmsg' ] ];
} catch (\Exception $e) {
return [ 'errcode' => -1, 'errmsg' => $e->getMessage() ];
}
}
/**
* 删除模板消息
* @param unknown $shortId
*/
public function deleteTemplate($templateId)
{
try {
$res = $this->app()->template_message->deletePrivateTemplate($templateId);
if (isset($res[ 'errcode' ]) && $res[ 'errcode' ] == 0) return $res;
$errormsg = [
'45026' => '模板数量超出限制'
];
return [ 'errcode' => $res[ 'errcode' ], 'errmsg' => $errormsg[ $res[ 'errcode' ] ] ?? $res[ 'errmsg' ] ];
} catch (\Exception $e) {
return [ 'errcode' => -1, 'errmsg' => $e->getMessage() ];
}
}
/**
* 发送模板消息
* @param array $param
* @return Ambigous <\Psr\Http\Message\ResponseInterface, \EasyWeChat\Kernel\Support\Collection, multitype:, object, string>
*/
public function sendTemplateMessage(array $param)
{
$result = $this->app()->template_message->send([
'touser' => $param[ 'openid' ], // openid
'template_id' => $param[ 'template_id' ],// 模板id
'url' => $param[ 'url' ],// 跳转链接
'miniprogram' => $param[ 'miniprogram' ], // 跳转小程序 ['appid' => 'xxxxxxx','pagepath' => 'pages/xxx',]
'data' => $param[ 'data' ] // 模板变量
]);
if (isset($result[ 'errcode' ]) && $result[ 'errcode' ] != 0) {
return $this->error($result, $result[ "errmsg" ]);
}
return $this->success($result);
}
/****************************************************************************** 模板消息end***********************************************************/
/******************************************************************************* 开放平台start *************************************************************************/
/**
* 将公众号或小程序绑定到指定开放平台帐号下
*/
public function bindTo($open_appid)
{
try {
$res = $this->app()->account->bindTo($open_appid);
return $res;
} catch (\Exception $e) {
return [ 'errcode' => -1, 'errmsg' => $e->getMessage() ];
}
}
/**
* 将公众号/小程序从开放平台帐号下解绑
*/
public function unbindFrom($open_appid)
{
try {
$res = $this->app()->account->unbindFrom($open_appid);
return $res;
} catch (\Exception $e) {
return [ 'errcode' => -1, 'errmsg' => $e->getMessage() ];
}
}
/**
* 获取公众号/小程序所绑定的开放平台帐号
*/
public function getBinding()
{
try {
$res = $this->app()->account->getBinding();
return $res;
} catch (\Exception $e) {
return [ 'errcode' => -1, 'errmsg' => $e->getMessage() ];
}
}
/**
* 获取关注二维码
* @param $fans_id
* @return array|mixed
*/
public function getFollowQrcode($fans_id)
{
$cache = Cache::get('wechat_follow_qrcode_' . $fans_id);
if ($cache) return $cache;
$res = $this->getTempQrcode('follow_key_' . $fans_id, 1728000);
if ($res[ 'code' ] != 0) return $res;
$data = $this->success([
'qrcode' => $res[ 'data' ],
'site_id' => $this->site_id,
'fans_id' => $fans_id
]);
Cache::set('wechat_follow_qrcode_' . $fans_id, $data, 1728000);
return $data;
}
/******************************************************************************* 开放平台end *************************************************************************/
/**
* 处理错误信息
* @param $errcode
* @param string $message
* @return array
*/
public function handleError($errcode, $message = '')
{
$error = require 'addon/wechat/config/wechat_error.php';
return $this->error([], $error[ $errcode ] ?? $message);
}
}