init
This commit is contained in:
parent
cce729e027
commit
6028eeb034
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
.idea
|
15
composer.json
Normal file
15
composer.json
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"name": "paidian/weichat",
|
||||
"type": "library",
|
||||
"description": "weichat library.",
|
||||
"require": {
|
||||
"guzzlehttp/guzzle": "^6.3",
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Wechat\\": "src/Wechat"
|
||||
}
|
||||
},
|
||||
"require-dev": {
|
||||
}
|
||||
}
|
20
src/Wechat/AccessToken.php
Normal file
20
src/Wechat/AccessToken.php
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
namespace Wechat;
|
||||
|
||||
class AccessToken
|
||||
{
|
||||
|
||||
protected $token;
|
||||
|
||||
public function __construct($app,string $token, $expiresIn)
|
||||
{
|
||||
$this->token = $token;
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return $this->token;
|
||||
}
|
||||
|
||||
}
|
1
src/Wechat/ServerProvider/WechatServiceProvider.php
Normal file
1
src/Wechat/ServerProvider/WechatServiceProvider.php
Normal file
|
@ -0,0 +1 @@
|
|||
<?php
|
62
src/Wechat/Work/Base.php
Normal file
62
src/Wechat/Work/Base.php
Normal file
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
namespace Wechat\Work;
|
||||
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\Psr7\Request;
|
||||
use GuzzleHttp\Psr7\Uri;
|
||||
|
||||
class Base
|
||||
{
|
||||
|
||||
protected $client;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->client = new Client([
|
||||
'base_uri' => 'https://qyapi.weixin.qq.com/cgi-bin/',
|
||||
'timeout' => '3',
|
||||
// 'proxy' => '3',
|
||||
]);
|
||||
}
|
||||
|
||||
protected function transformForJsonRequest($method, $uri, array $params = null)
|
||||
{
|
||||
$uri = new Uri($uri);
|
||||
$uri = Uri::withQueryValue($uri, 'access_token', $this->getAccessToken());
|
||||
$request = new Request($method, $uri, [], \GuzzleHttp\json_encode($params));
|
||||
return $request;
|
||||
}
|
||||
|
||||
protected function getAccessToken()
|
||||
{
|
||||
$corpId = 'ww9ed271946b8fc4a4';
|
||||
$agentId = '1000015';
|
||||
$agentSecret = 'zH3N1fwrECl913R1r17MjDiNhMKSlJf2P3tSXmk_YG0';
|
||||
|
||||
$cache = app('cache');
|
||||
|
||||
$key = 'wechat_work_access_token_' . $agentId;
|
||||
|
||||
$token = $cache->get($key);
|
||||
if ($token) {
|
||||
return $token;
|
||||
}
|
||||
|
||||
$url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpId&corpsecret=$agentSecret";
|
||||
|
||||
$client = new Client();
|
||||
$resp = $client->get($url);
|
||||
|
||||
$body = json_decode($resp->getBody(), true);
|
||||
|
||||
if ($body['errcode'] == 0) {
|
||||
$cache->put($key, $body['access_token'], $body['expires_in'] / 60);
|
||||
return $body['access_token'];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
81
src/Wechat/Work/Chat.php
Normal file
81
src/Wechat/Work/Chat.php
Normal file
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
namespace App\Wechat\Work;
|
||||
|
||||
class Chat extends Base
|
||||
{
|
||||
|
||||
protected $id;
|
||||
|
||||
public function __construct($id = null)
|
||||
{
|
||||
parent::__construct();
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
public function create(array $users, $owner = null, $name = null)
|
||||
{
|
||||
$params = [
|
||||
'userlist' => $users,
|
||||
];
|
||||
|
||||
if ($name) {
|
||||
$params['name'] = $name;
|
||||
}
|
||||
|
||||
if ($owner) {
|
||||
$params['owner'] = $owner;
|
||||
}
|
||||
|
||||
if ($this->id != null) {
|
||||
$params['chatid'] = $this->id;
|
||||
}
|
||||
|
||||
$request = $this->transformForJsonRequest('POST', 'appchat/create', $params);
|
||||
$resp = $this->client->send($request);
|
||||
return json_decode($resp->getBody(), true);
|
||||
}
|
||||
|
||||
public function get($chatId)
|
||||
{
|
||||
$request = $this->transformForJsonRequest('GET', 'appchat/get?chatid=' . $chatId);
|
||||
$resp = $this->client->send($request);
|
||||
return json_decode($resp->getBody(), true);
|
||||
}
|
||||
|
||||
public function send(Message $message)
|
||||
{
|
||||
$request = $this->transformForJsonRequest('POST', 'appchat/send',
|
||||
array_merge(['chatid' => $this->id], $message->toArray()));
|
||||
$resp = $this->client->send($request);
|
||||
return json_decode($resp->getBody(), true);
|
||||
}
|
||||
|
||||
public function update($chatId, array $add = null, array $del = null, $name = null, $owner = null)
|
||||
{
|
||||
$params = [
|
||||
'chatid' => $chatId,
|
||||
];
|
||||
|
||||
if ($name) {
|
||||
$params['name'] = $name;
|
||||
}
|
||||
|
||||
if ($owner) {
|
||||
$params['owner'] = $owner;
|
||||
}
|
||||
|
||||
if ($add) {
|
||||
$params['add_user_list'] = $add;
|
||||
}
|
||||
|
||||
if ($del) {
|
||||
$params['del_user_list'] = $del;
|
||||
}
|
||||
|
||||
$request = $this->transformForJsonRequest('POST', 'appchat/update', $params);
|
||||
$resp = $this->client->send($request);
|
||||
return json_decode($resp->getBody(), true);
|
||||
}
|
||||
|
||||
}
|
27
src/Wechat/Work/ExternalContact.php
Normal file
27
src/Wechat/Work/ExternalContact.php
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace App\Wechat;
|
||||
|
||||
use App\Wechat\Work\Base;
|
||||
|
||||
class ExternalContact extends Base
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function list($uid)
|
||||
{
|
||||
$request = $this->transformForJsonRequest('GET', 'crm/get_external_contact_list?userid='.$uid);
|
||||
$resp = $this->client->send($request);
|
||||
return json_decode($resp->getBody(), true);
|
||||
}
|
||||
|
||||
public function detail($uid){
|
||||
$request = $this->transformForJsonRequest('GET', 'crm/get_external_contact?external_userid='.$uid);
|
||||
$resp = $this->client->send($request);
|
||||
return json_decode($resp->getBody(), true);
|
||||
}
|
||||
|
||||
}
|
91
src/Wechat/Work/Message.php
Normal file
91
src/Wechat/Work/Message.php
Normal file
|
@ -0,0 +1,91 @@
|
|||
<?php
|
||||
|
||||
namespace Wechat\Work;
|
||||
|
||||
abstract class Message extends Base
|
||||
{
|
||||
|
||||
const TYPE_TEXT = 'text';
|
||||
const TYPE_IMAGE = 'image';
|
||||
const TYPE_VOICE = 'voice';
|
||||
const TYPE_VIDEO = 'video';
|
||||
const TYPE_FILE = 'file';
|
||||
const TYPE_TEXT_CARD = 'textcard';
|
||||
const TYPE_NEWS = 'news';
|
||||
const TYPE_MP_NEWS = 'mpnews';
|
||||
|
||||
protected $type;
|
||||
protected $attr;
|
||||
protected $safe;
|
||||
|
||||
protected $params;
|
||||
|
||||
abstract public function toArray();
|
||||
|
||||
public function ofAgent($agentId)
|
||||
{
|
||||
$this->params['agentid'] = $agentId;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function toUser($user)
|
||||
{
|
||||
$this->params['touser'] = $user;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function send()
|
||||
{
|
||||
$request = $this->transformForJsonRequest('POST', 'message/send',
|
||||
$this->toArray());
|
||||
$resp = $this->client->send($request);
|
||||
return json_decode($resp->getBody(), true);
|
||||
}
|
||||
|
||||
// {
|
||||
// switch ($this->type) {
|
||||
// case self::TYPE_TEXT:
|
||||
// return [
|
||||
// 'text' => [
|
||||
// 'content' => $this->attr['content'],
|
||||
// ]
|
||||
// ];
|
||||
// case self::TYPE_IMAGE:
|
||||
// return [
|
||||
// 'image' => [
|
||||
// 'media_id' => $this->attr['media_id'],
|
||||
// ]
|
||||
// ];
|
||||
// case self::TYPE_VOICE:
|
||||
// return [
|
||||
// 'voice' => [
|
||||
// 'media_id' => $this->attr['media_id'],
|
||||
// ]
|
||||
// ];
|
||||
// case self::TYPE_VIDEO:
|
||||
// return [
|
||||
// 'video' => [
|
||||
// 'media_id' => $this->attr['media_id'],
|
||||
// 'title' => $this->attr['title'],
|
||||
// 'description' => $this->attr['description'],
|
||||
// ]
|
||||
// ];
|
||||
// case self::TYPE_FILE:
|
||||
// return [
|
||||
// 'file' => [
|
||||
// 'media_id' => $this->attr['media_id'],
|
||||
// ]
|
||||
// ];
|
||||
// case self::TYPE_TEXT_CARD:
|
||||
// $arr = [
|
||||
// 'textcard' => [
|
||||
// 'title' => $this->attr['title'],
|
||||
// 'description' => $this->attr['description'],
|
||||
// 'url' => $this->attr['url'],
|
||||
// 'btntxt' => $this->attr['btntxt'],
|
||||
// ]
|
||||
// ];
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
62
src/Wechat/Work/TextCardMessage.php
Normal file
62
src/Wechat/Work/TextCardMessage.php
Normal file
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
namespace Wechat\Work;
|
||||
|
||||
class TextCardMessage extends Message
|
||||
{
|
||||
|
||||
|
||||
protected $type;
|
||||
protected $attr;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->type = self::TYPE_TEXT_CARD;
|
||||
}
|
||||
|
||||
public function title($title)
|
||||
{
|
||||
$this->attr['title'] = $title;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function desc($desc)
|
||||
{
|
||||
$this->attr['description'] = $desc;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function button($text)
|
||||
{
|
||||
$this->attr['btntxt'] = $text;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function url($url)
|
||||
{
|
||||
$this->attr['url'] = $url;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
$arr = [
|
||||
'msgtype' => $this->type,
|
||||
$this->type => [
|
||||
'title' => $this->attr['title'],
|
||||
'description' => $this->attr['description'],
|
||||
'url' => $this->attr['url'],
|
||||
'btntxt' => $this->attr['btntxt'],
|
||||
],
|
||||
'safe' => $this->safe,
|
||||
];
|
||||
|
||||
if (!empty($this->params)) {
|
||||
$arr = array_merge($this->params, $arr);
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
}
|
35
src/Wechat/Work/TextMessage.php
Normal file
35
src/Wechat/Work/TextMessage.php
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
namespace App\Wechat\Work;
|
||||
|
||||
class TextMessage extends Message
|
||||
{
|
||||
|
||||
protected $type;
|
||||
protected $attr;
|
||||
|
||||
public function __construct($content)
|
||||
{
|
||||
parent::__construct();
|
||||
$this->type = self::TYPE_TEXT;
|
||||
$this->attr['content'] = $content;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
$arr = [
|
||||
'msgtype' => $this->type,
|
||||
$this->type => [
|
||||
'content' => $this->attr['content'],
|
||||
],
|
||||
'safe' => $this->safe,
|
||||
];
|
||||
|
||||
if (!empty($this->params)) {
|
||||
$arr = array_merge($this->params, $arr);
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
}
|
16
src/config.php
Normal file
16
src/config.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
return [
|
||||
/**
|
||||
* 企业微信的配置
|
||||
*/
|
||||
'work' => [
|
||||
//企业ID
|
||||
'corp_id' => '',
|
||||
//企业内各个应用的 secrets
|
||||
'secrets' => [
|
||||
'auth' => '',
|
||||
'contact' => env('WECHAT_WORK_SECRET_CONTACT'),
|
||||
'external_contact' => env('WECHAT_WORK_SECRET_EXTERNAL_CONTACT'),
|
||||
],
|
||||
]
|
||||
];
|
0
tests/1.php
Normal file
0
tests/1.php
Normal file
Loading…
Reference in New Issue
Block a user