229 行
8.8 KiB
PHP
229 行
8.8 KiB
PHP
<?php
|
|
|
|
namespace addons\shopro\controller;
|
|
|
|
use addons\shopro\library\Wechat as WechatLibrary;
|
|
use addons\shopro\model\Wechat as WechatModel;
|
|
use addons\shopro\model\Config;
|
|
|
|
/**
|
|
* 微信接口
|
|
*/
|
|
class Wechat extends Base
|
|
{
|
|
protected $noNeedLogin = ['*'];
|
|
protected $noNeedRight = ['*'];
|
|
protected $app = null;
|
|
protected $userOpenId = '';
|
|
/**
|
|
* 微信公众号服务端API对接、处理消息回复
|
|
*/
|
|
public function index()
|
|
{
|
|
$wechat = new WechatLibrary('wxOfficialAccount');
|
|
$this->app = $wechat->getApp();
|
|
$this->app->server->push(function ($message) {
|
|
//初始化信息
|
|
$this->userOpenId = $message['FromUserName'];
|
|
// return json_encode($message, JSON_UNESCAPED_UNICODE); //调试使用
|
|
|
|
switch ($message['MsgType']) {
|
|
case 'event': //收到事件消息
|
|
switch ($message['Event']) {
|
|
case 'subscribe': //订阅(关注)事件
|
|
//获取粉丝信息并保存
|
|
$subscribe = WechatModel::get(['type' => 'subscribe']);
|
|
if ($subscribe) {
|
|
return $this->response($subscribe);
|
|
}
|
|
break;
|
|
case 'unsubscribe': //取消订阅(关注)事件
|
|
//获取粉丝信息并保存
|
|
break;
|
|
case 'CLICK': //自定义菜单事件
|
|
return $this->response($message, 'CLICK');
|
|
break;
|
|
case 'SCAN': //扫码事件
|
|
return '';
|
|
break;
|
|
}
|
|
break;
|
|
case 'text': //收到文本消息
|
|
//检测关键字回复
|
|
$content = $message['Content'];
|
|
$auto_reply = WechatModel::where('type', 'auto_reply')->where('find_in_set(:keywords,rules)', ['keywords' => $content])->find();
|
|
if ($auto_reply) {
|
|
return $this->response($auto_reply);
|
|
}
|
|
case 'image': //收到图片消息
|
|
case 'voice': //收到语音消息
|
|
case 'video': //收到视频消息
|
|
case 'location': //收到坐标消息
|
|
case 'link': //收到链接消息
|
|
case 'file': //收到文件消息
|
|
default: // ... 默认回复消息
|
|
$default_reply = WechatModel::where('type', 'default_reply')->find();
|
|
if ($default_reply) {
|
|
return $this->response($default_reply);
|
|
}
|
|
}
|
|
});
|
|
$response = $this->app->server->serve();
|
|
// 将响应输出
|
|
$response->send();
|
|
}
|
|
|
|
public function jssdk()
|
|
{
|
|
$params = $this->request->post();
|
|
$apis = [
|
|
'checkJsApi',
|
|
'updateTimelineShareData',
|
|
'updateAppMessageShareData',
|
|
"onMenuShareAppMessage",
|
|
"onMenuShareTimeline",
|
|
'getLocation', //获取位置
|
|
'openLocation', //打开位置
|
|
'scanQRCode', //扫一扫接口
|
|
'chooseWXPay', //微信支付
|
|
'chooseImage', //拍照或从手机相册中选图接口
|
|
'previewImage', //预览图片接口 'uploadImage', //上传图片
|
|
'openAddress', // 获取微信地址
|
|
];
|
|
// $openTagList = [
|
|
// 'wx-open-subscribe'
|
|
// ];
|
|
|
|
$uri = urldecode($params['uri']);
|
|
|
|
$wechat = new WechatLibrary('wxOfficialAccount');
|
|
|
|
$jssdk = $wechat->getApp()->jssdk->setUrl($uri);
|
|
// easywechat 版本 < 4.2.33 的 buildConfig 方法 没有 openTagList 参数,手动覆盖底层 buildConfig 方法
|
|
$res = $wechat->buildConfig($jssdk, $apis, $debug = false, $beta = false, $json = false);
|
|
|
|
$this->success('sdk', $res);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 微信公众号服务端API对接
|
|
*/
|
|
public function wxacode()
|
|
{
|
|
$scene = $this->request->get('scene', '');
|
|
$path = $this->request->get('path', 'pages/index/index');
|
|
$envVersion = $this->request->get('env_version', 'release');
|
|
|
|
if ($scene === '') {
|
|
$this->error('scene参数不能为空');
|
|
}
|
|
|
|
// 兼容旧版 scene=spm=xxx 传参
|
|
if (strpos($scene, 'spm=') === 0) {
|
|
$scene = substr($scene, 4);
|
|
}
|
|
|
|
if (strlen($scene) > 32) {
|
|
$this->error('scene参数过长,最多32个字符');
|
|
}
|
|
|
|
$path = ltrim($path, '/');
|
|
if ($path === '') {
|
|
$path = 'pages/index/index';
|
|
}
|
|
|
|
if (!in_array($envVersion, ['develop', 'trial', 'release'])) {
|
|
$envVersion = 'release';
|
|
}
|
|
|
|
try {
|
|
$wechat = new WechatLibrary('wxMiniProgram');
|
|
$content = $wechat->getApp()->app_code->getUnlimit($scene, [
|
|
'page' => $path,
|
|
'check_path' => false,
|
|
'is_hyaline' => true,
|
|
'env_version' => $envVersion,
|
|
]);
|
|
} catch (\EasyWeChat\Kernel\Exceptions\HttpException $e) {
|
|
\think\Log::write('wxacode-http-error scene=' . $scene . ' ' . $e->getMessage());
|
|
$this->error('微信小程序 AppSecret 配置错误,请到后台【平台配置→微信小程序】更新 AppID 和 AppSecret', $e->getMessage());
|
|
} catch (\Exception $e) {
|
|
\think\Log::write('wxacode-error scene=' . $scene . ' ' . $e->getMessage());
|
|
$this->error('获取失败', $e->getMessage());
|
|
}
|
|
|
|
if ($content instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
|
|
return response($content->getBody(), 200, ['Content-Length' => strlen($content)])->contentType('image/png');
|
|
} else {
|
|
// 小程序码获取失败
|
|
$msg = isset($content['errcode']) ? $content['errcode'] : '-';
|
|
$msg .= isset($content['errmsg']) ? $content['errmsg'] : '';
|
|
\think\Log::write('wxacode-error scene=' . $scene . ' path=' . $path . ' env=' . $envVersion . ' ' . $msg);
|
|
|
|
$this->error('获取失败', $msg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 回复消息
|
|
*/
|
|
private function response($replyInfo, $event = 'text')
|
|
{
|
|
switch ($event) {
|
|
case 'SCAN': //解析扫码事件EventKey
|
|
break;
|
|
case 'CLICK': //解析菜单点击事件EventKey
|
|
$key = explode('|', $replyInfo['EventKey']);
|
|
if ($key) {
|
|
$message['type'] = $key[0];
|
|
if ($key[0] === 'text') {
|
|
$message['content'] = json_decode(WechatModel::get($key[1])->content, true);
|
|
} elseif($key[0] === 'link') {
|
|
$link = WechatModel::get($key[1]);
|
|
$message = array_merge($message, json_decode($link->content, true));
|
|
$message['title'] = $link->name;
|
|
// return json_encode($message);
|
|
}else {
|
|
$message['media_id'] = $key[1];
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
$message = json_decode($replyInfo['content'], true);
|
|
break;
|
|
}
|
|
|
|
switch ($message['type']) {
|
|
case 'text': //回复文本
|
|
$content = new \EasyWeChat\Kernel\Messages\Text($message['content']);
|
|
break;
|
|
case 'image': //回复图片
|
|
$content = new \EasyWeChat\Kernel\Messages\Image($message['media_id']);
|
|
break;
|
|
case 'news': //回复图文
|
|
$message = new \EasyWeChat\Kernel\Messages\Media($message['media_id'], 'mpnews');
|
|
$this->app->customer_service->message($message)->to($this->userOpenId)->send(); //素材消息使用客服接口回复
|
|
break;
|
|
case 'voice': //回复语音
|
|
$content = new \EasyWeChat\Kernel\Messages\Voice($message['media_id']);
|
|
break;
|
|
case 'video': //回复视频
|
|
$content = new \EasyWeChat\Kernel\Messages\Video($message['media_id']);
|
|
break;
|
|
case 'link': //回复链接
|
|
$items = new \EasyWeChat\Kernel\Messages\NewsItem([
|
|
'title' => $message['title'],
|
|
'description' => $message['description'],
|
|
'url' => $message['url'],
|
|
'image' => cdnurl($message['image'], true),
|
|
// ...
|
|
]);
|
|
$content = new \EasyWeChat\Kernel\Messages\News([$items]);
|
|
break;
|
|
}
|
|
return $content;
|
|
}
|
|
}
|