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.
328 lines
9.6 KiB
328 lines
9.6 KiB
1 year ago
|
<?php
|
||
|
|
||
|
namespace addons\shopro\library;
|
||
|
|
||
|
use EasyWeChat\Factory;
|
||
|
use addons\shopro\model\Config;
|
||
|
use think\Model;
|
||
|
use fast\Http;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
class Wechat extends Model
|
||
|
{
|
||
|
protected $config;
|
||
|
protected $app;
|
||
|
|
||
|
|
||
|
public function __construct($platform)
|
||
|
{
|
||
|
$this->setConfig($platform);
|
||
|
switch ($platform) {
|
||
|
case 'wxOfficialAccount':
|
||
|
$this->app = Factory::officialAccount($this->config);
|
||
|
break;
|
||
|
case 'wxMiniProgram':
|
||
|
$this->app = Factory::miniProgram($this->config);
|
||
|
break;
|
||
|
case 'App':
|
||
|
$this->app = Factory::openPlatform($this->config);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// 重新绑定 easywechat 缓存(如果需要负载均衡,必须要开启)
|
||
|
// $this->rebindCache();
|
||
|
}
|
||
|
|
||
|
// 返回实例
|
||
|
public function getApp() {
|
||
|
return $this->app;
|
||
|
}
|
||
|
|
||
|
//小程序:获取openid&session_key
|
||
|
public function code($code)
|
||
|
{
|
||
|
return $this->app->auth->session($code);
|
||
|
}
|
||
|
|
||
|
public function oauth()
|
||
|
{
|
||
|
$oauth = $this->app->oauth;
|
||
|
return $oauth;
|
||
|
}
|
||
|
|
||
|
//解密信息
|
||
|
public function decryptData($session, $iv, $encryptData)
|
||
|
{
|
||
|
$data = $this->app->encryptor->decryptData($session, $iv, $encryptData);
|
||
|
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
public function unify($orderBody)
|
||
|
{
|
||
|
$result = $this->app->order->unify($orderBody);
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
public function bridgeConfig($prepayId)
|
||
|
{
|
||
|
$jssdk = $this->app->jssdk;
|
||
|
$config = $jssdk->bridgeConfig($prepayId, false);
|
||
|
return $config;
|
||
|
}
|
||
|
|
||
|
public function notify()
|
||
|
{
|
||
|
$result = $this->app;
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
//获取accessToken
|
||
|
public function getAccessToken()
|
||
|
{
|
||
|
$accessToken = $this->app->access_token;
|
||
|
$token = $accessToken->getToken(); // token 数组 token['access_token'] 字符串
|
||
|
//$token = $accessToken->getToken(true); // 强制重新从微信服务器获取 token.
|
||
|
return $token;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 重写 jssdk buildConfig 方法
|
||
|
*
|
||
|
* @param [type] $jssdk jssdk 实例
|
||
|
* @param [type] $apis 要请求的 api 列表
|
||
|
* @param boolean $debug debug
|
||
|
* @param boolean $beta
|
||
|
* @param boolean $json 是否返回 json
|
||
|
* @param array $openTagList 开放标签列表
|
||
|
* @return void
|
||
|
*/
|
||
|
public function buildConfig($jssdk, $jsApiList, $debug = false, $beta = false, $json = false, $openTagList = [], $url = '')
|
||
|
{
|
||
|
$url = $url ?: $jssdk->getUrl();
|
||
|
$nonce = \EasyWeChat\Kernel\Support\Str::quickRandom(10);
|
||
|
$timestamp = time();
|
||
|
|
||
|
$signature = [
|
||
|
'appId' => $this->config['app_id'],
|
||
|
'nonceStr' => $nonce,
|
||
|
'timestamp' => $timestamp,
|
||
|
'url' => $url,
|
||
|
'signature' => $jssdk->getTicketSignature($jssdk->getTicket()['ticket'], $nonce, $timestamp, $url),
|
||
|
];
|
||
|
|
||
|
$config = array_merge(compact('debug', 'beta', 'jsApiList', 'openTagList'), $signature);
|
||
|
|
||
|
return $json ? json_encode($config) : $config;
|
||
|
}
|
||
|
|
||
|
|
||
|
public function sendTemplateMessage($attributes)
|
||
|
{
|
||
|
extract($attributes);
|
||
|
$this->app->template_message->send([
|
||
|
'touser' => $openId,
|
||
|
'template_id' => $templateId,
|
||
|
'page' => $page,
|
||
|
'form_id' => $formId,
|
||
|
'data' => $data,
|
||
|
'emphasis_keyword' => $emphasis_keyword
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 发送公众号订阅消息
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function bizsendSubscribeMessage($data) {
|
||
|
$access_token = $this->getAccessToken();
|
||
|
|
||
|
$bizsendUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/bizsend?access_token={$access_token['access_token']}";
|
||
|
|
||
|
$headers = ['Content-type: application/json'];
|
||
|
$options = [
|
||
|
CURLOPT_HTTPHEADER => $headers
|
||
|
];
|
||
|
$result = Http::sendRequest($bizsendUrl, json_encode($data), 'POST', $options);
|
||
|
|
||
|
if (isset($result['ret']) && $result['ret']) {
|
||
|
// 请求成功
|
||
|
$result = json_decode($result['msg'], true);
|
||
|
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
// 请求失败
|
||
|
return ['errcode' => -1, 'msg' => $result];
|
||
|
}
|
||
|
|
||
|
// 同步小程序直播
|
||
|
public function live(Array $params = [])
|
||
|
{
|
||
|
$default = [
|
||
|
'start' => 0,
|
||
|
'limit' => 10
|
||
|
];
|
||
|
$params = array_merge($default, $params);
|
||
|
$default = json_encode($params);
|
||
|
|
||
|
|
||
|
$access_token = $this->app->access_token->getToken();
|
||
|
$getRoomsListUrl = "https://api.weixin.qq.com/wxa/business/getliveinfo?access_token={$access_token['access_token']}";
|
||
|
$headers = ['Content-type: application/json'];
|
||
|
$options = [
|
||
|
CURLOPT_HTTPHEADER => $headers
|
||
|
];
|
||
|
$result = Http::sendRequest($getRoomsListUrl, $default, 'POST', $options);
|
||
|
if (isset($result['ret']) && $result['ret']) {
|
||
|
$msg = json_decode($result['msg'], true);
|
||
|
$result = $msg;
|
||
|
}
|
||
|
|
||
|
// $result = $this->app->live->getRooms(...array_values($params));
|
||
|
|
||
|
$rooms = [];
|
||
|
if ($result && $result['errcode'] == 0 && $result['errmsg'] === 'ok') {
|
||
|
$rooms = $result['room_info'];
|
||
|
}
|
||
|
|
||
|
return $rooms;
|
||
|
}
|
||
|
|
||
|
// 小程序直播回放
|
||
|
public function liveReplay(array $params = [])
|
||
|
{
|
||
|
$default = [
|
||
|
'room_id' => 0,
|
||
|
'start' => 0,
|
||
|
'limit' => 20
|
||
|
];
|
||
|
|
||
|
$params = array_merge($default, $params);
|
||
|
$default = json_encode($params);
|
||
|
$access_token = $this->app->access_token->getToken();
|
||
|
$getPlayBackListUrl = "https://api.weixin.qq.com/wxa/business/getliveinfo?access_token={$access_token['access_token']}";
|
||
|
$headers = ['Content-type: application/json'];
|
||
|
$options = [
|
||
|
CURLOPT_HTTPHEADER => $headers
|
||
|
];
|
||
|
$result = Http::sendRequest($getPlayBackListUrl, $default, 'POST', $options);
|
||
|
if (isset($result['ret']) && $result['ret']) {
|
||
|
$msg = json_decode($result['msg'], true);
|
||
|
$result = $msg;
|
||
|
}
|
||
|
// $result = $this->app->live->getPlaybacks(...array_values($params));
|
||
|
|
||
|
$liveReplay = [];
|
||
|
if ($result && $result['errcode'] == 0 && $result['errmsg'] === 'ok') {
|
||
|
$liveReplay = $result['live_replay'];
|
||
|
}
|
||
|
|
||
|
return $liveReplay;
|
||
|
}
|
||
|
|
||
|
public function menu($act = 'create', $buttons = '')
|
||
|
{
|
||
|
$result = $this->app->menu->$act($buttons);
|
||
|
return $result;
|
||
|
|
||
|
}
|
||
|
|
||
|
// 公众号 获取所有粉丝
|
||
|
public function asyncFans($nextOpenId = null, $currentPage = 1, $totalPage = 1)
|
||
|
{
|
||
|
$fans = $this->app->user->list($nextOpenId);
|
||
|
$openIdsArray = $fans['data']['openid'];
|
||
|
//放入最大10000条openid队列去执行
|
||
|
\think\Queue::push('\addons\shopro\job\Wechat@createQueueByOpenIdsArray', $openIdsArray, 'shopro');
|
||
|
//第一次计算总页数
|
||
|
if ($currentPage === 1) {
|
||
|
$totalPage = intval($fans['total'] % $fans['count'] === 0 ? $fans['total'] / $fans['count'] : ceil($fans['total'] / $fans['count']));
|
||
|
}
|
||
|
//有分页 递归下一页
|
||
|
if ($currentPage < $totalPage) {
|
||
|
$openIdsArray = array_merge($openIdsArray, $this->asyncFans($fans['next_openid'], $currentPage++, $totalPage));
|
||
|
}
|
||
|
if ($currentPage == $totalPage) {
|
||
|
if ($totalPage == 1) {
|
||
|
$code = 1;
|
||
|
$msg = '同步成功';
|
||
|
}else{
|
||
|
$code = 1;
|
||
|
$msg = '数据较大,请稍后再查看...';
|
||
|
}
|
||
|
return [
|
||
|
'code' => $code,
|
||
|
'msg' => $msg
|
||
|
];
|
||
|
}
|
||
|
return $openIdsArray;
|
||
|
}
|
||
|
|
||
|
//通过openid获取已经关注的用户信息
|
||
|
public function getSubscribeUserInfoByOpenId(array $openIdsArray)
|
||
|
{
|
||
|
$result = $this->app->user->select($openIdsArray);
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 重新绑定 easywechat 缓存
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
private function rebindCache() {
|
||
|
$options = [
|
||
|
// 'select' => 0 // 默认和活动缓存使用同一个 select 库,如需自定义,解开注释,并填写对应 select 库
|
||
|
];
|
||
|
$redis = (new Redis($options))->getRedis();
|
||
|
$cache = new \Symfony\Component\Cache\Adapter\RedisAdapter($redis);
|
||
|
|
||
|
// 替换应用中的缓存
|
||
|
$this->app->rebind('cache', $cache);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 合并默认配置
|
||
|
*
|
||
|
* @param [type] $platform
|
||
|
* @return void
|
||
|
*/
|
||
|
private function setConfig($platform) {
|
||
|
$debug = config('app_debug');
|
||
|
|
||
|
$defaultConfig = [
|
||
|
'log' => [
|
||
|
'default' => $debug ? 'dev' : 'prod', // 默认使用的 channel,生产环境可以改为下面的 prod
|
||
|
'channels' => [
|
||
|
// 测试环境
|
||
|
'dev' => [
|
||
|
'driver' => 'single',
|
||
|
'path' => '/tmp/easywechat.log',
|
||
|
'level' => 'debug',
|
||
|
],
|
||
|
// 生产环境
|
||
|
'prod' => [
|
||
|
'driver' => 'daily',
|
||
|
'path' => '/tmp/easywechat.log',
|
||
|
'level' => 'info',
|
||
|
],
|
||
|
],
|
||
|
],
|
||
|
];
|
||
|
|
||
|
// 获取对应平台的配置
|
||
|
$this->config = Config::getEasyWechatConfig($platform);
|
||
|
// 根据框架 debug 合并 log 配置
|
||
|
$this->config = array_merge($this->config, $defaultConfig);
|
||
|
}
|
||
|
}
|