初始版本
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					.idea
 | 
				
			||||||
 | 
					/vendor
 | 
				
			||||||
 | 
					.php_cs.cache
 | 
				
			||||||
 | 
					composer.lock
 | 
				
			||||||
							
								
								
									
										16
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					language: php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					php:
 | 
				
			||||||
 | 
					  - 7.0
 | 
				
			||||||
 | 
					  - 7.1
 | 
				
			||||||
 | 
					  - 7.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dist: trusty
 | 
				
			||||||
 | 
					sudo: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					before_script:
 | 
				
			||||||
 | 
					  - composer self-update
 | 
				
			||||||
 | 
					  - composer install --prefer-source --no-interaction
 | 
				
			||||||
 | 
					  - composer dump-autoload
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					script: vendor/bin/phpunit
 | 
				
			||||||
							
								
								
									
										226
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,226 @@
 | 
				
			|||||||
 | 
					# 钉钉推送机器人消息发送laravel扩展包
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[](https://packagist.org/packages/wangju/ding-notice)
 | 
				
			||||||
 | 
					[](https://packagist.org/packages/wangju/ding-notice)
 | 
				
			||||||
 | 
					[](https://packagist.org/packages/wangju/ding-notice)
 | 
				
			||||||
 | 
					[](https://packagist.org/packages/wangju/ding-notice)
 | 
				
			||||||
 | 
					[](https://scrutinizer-ci.com/g/wowiwj/ding-notice/?branch=master)
 | 
				
			||||||
 | 
					[](https://scrutinizer-ci.com/code-intelligence)
 | 
				
			||||||
 | 
					[](https://github.com/ellerbrock/open-source-badge/)   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 请先阅读 [钉钉官方文档](https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 介绍
 | 
				
			||||||
 | 
					ding-notie 是一款钉钉机器人消息发送的Laravel扩展,您可以通过此扩展便捷的发送钉钉消息,进行监控和提醒操作
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 要求
 | 
				
			||||||
 | 
					- php版本:>=7.0
 | 
				
			||||||
 | 
					- laravel版本: Laravel5.5+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 安装
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					composer require ykxiao/dm-ding-notice
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 在非laravel项目中使用
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					$ding = new \DingNotice\DingTalk([
 | 
				
			||||||
 | 
					    "default" => [
 | 
				
			||||||
 | 
					        'enabled' => true,
 | 
				
			||||||
 | 
					        'token' => "you-push-token",
 | 
				
			||||||
 | 
					        'timeout' => 2.0,
 | 
				
			||||||
 | 
					        'ssl_verify' => true,
 | 
				
			||||||
 | 
					        'secret' => '',
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$ding->text('我就是我, xxx 是不一样的烟火');
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 在laravel项目中使用
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					安装成功后执行
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					php artisan vendor:publish --provider="DingNotice\DingNoticeServiceProvider"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					会自动将`ding.php`添加到您项目的配置文件当中
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 相关配置
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 钉钉启用开关
 | 
				
			||||||
 | 
					(可选)默认为开启
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					DING_ENABLED=true
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					### 钉钉的推送token
 | 
				
			||||||
 | 
					- (必选)发送钉钉机器人的token,即在您创建机器人之后的access_token
 | 
				
			||||||
 | 
					- 钉钉推送链接:https://oapi.dingtalk.com/robot/send?access_token=you-push-token
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					DING_TOKEN=you-push-token
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 多机器人配置
 | 
				
			||||||
 | 
					如果想要添加多个机器人,则在`ding.php`当中添加机器人名字和相关的配置即可
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					return [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'default' => [
 | 
				
			||||||
 | 
					        'enabled' => env('DING_ENABLED',true),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'token' => env('DING_TOKEN',''),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'timeout' => env('DING_TIME_OUT',2.0),
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        'ssl_verify' => env('DING_SSL_VERIFY',true),
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        'secret' => env('DING_SECRET',true), 
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'other' => [
 | 
				
			||||||
 | 
					        'enabled' => env('OTHER_DING_ENABLED',true),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'token' => env('OTHER_DING_TOKEN',''),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'timeout' => env('OTHER_DING_TIME_OUT',2.0),
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        'ssl_verify' => env('DING_SSL_VERIFY',true),
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        'secret' => env('OTHER_DING_SECRET',true), 
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 钉钉发送的超时时间
 | 
				
			||||||
 | 
					- (可选) 默认为2.0秒
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					DING_TIME_OUT=
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 是否开启SSL验证
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (可选)默认为开启,关闭请手动设置
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					DING_SSL_VERIFY=false
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					### 开启钉钉安全配置
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (可选)默认为无
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					DING_SECRET=
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 使用
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 发送纯文字消息
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					ding('我就是我, xxx 是不一样的烟火')
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					or
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					ding()->text('我就是我, xxx 是不一样的烟火')
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					发送过程@其他人或者所有人
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					ding()->at(["13888888888"],true)
 | 
				
			||||||
 | 
					      ->text("我就是我,@13888888888 是不一样的烟火")
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 发送链接类型的消息
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					$title = "自定义机器人协议";
 | 
				
			||||||
 | 
					$text = "群机器人是钉钉群的高级扩展功能。群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。例如:通过聚合GitHub,GitLab等源码管理服务,实现源码更新同步;通过聚合Trello,JIRA等项目协调服务,实现项目信息同步。不仅如此,群机器人支持Webhook协议的自定义接入,支持更多可能性,例如:你可将运维报警提醒通过自定义机器人聚合到钉钉群。";
 | 
				
			||||||
 | 
					$picUrl = "";
 | 
				
			||||||
 | 
					$messageUrl = "https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.Rqyvqo&treeId=257&articleId=105735&docType=1";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ding()->link($title,$text,$messageUrl,$picUrl)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 发送markdown类型的消息
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					$title = '杭州天气';
 | 
				
			||||||
 | 
					$markdown = "#### 杭州天气  \n ".
 | 
				
			||||||
 | 
					            "> 9度,@1825718XXXX 西北风1级,空气良89,相对温度73%\n\n ".
 | 
				
			||||||
 | 
					            "> \n".
 | 
				
			||||||
 | 
					            "> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) ";
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					ding()->markdown($title,$markdown);
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					or
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```php                                        
 | 
				
			||||||
 | 
					ding()->at([],true)
 | 
				
			||||||
 | 
					    ->markdown($title,$markdown)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 发送Action类型的消息
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 发送single类型的消息
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					$title = "乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身";
 | 
				
			||||||
 | 
					$text = " \n".
 | 
				
			||||||
 | 
					    " #### 乔布斯 20 年前想打造的苹果咖啡厅 \n\n".
 | 
				
			||||||
 | 
					    " Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ding()->actionCard($title,$text,1)
 | 
				
			||||||
 | 
					    ->single("阅读全文","https://www.dingtalk.com/")
 | 
				
			||||||
 | 
					    ->send()
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					### 发送btns类型的消息
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					ding()->actionCard($title,$text,1)
 | 
				
			||||||
 | 
					    ->addButtons("内容不错","https://www.dingtalk.com/")
 | 
				
			||||||
 | 
					    ->addButtons("不感兴趣","https://www.dingtalk.com/")
 | 
				
			||||||
 | 
					    ->send();
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 发送Feed类型的消息
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					$messageUrl = "https://mp.weixin.qq.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI";
 | 
				
			||||||
 | 
					$picUrl = "https://www.dingtalk.com";
 | 
				
			||||||
 | 
					ding()->feed()
 | 
				
			||||||
 | 
					    ->addLinks('时代的火车向前开',$messageUrl,$picUrl)
 | 
				
			||||||
 | 
					    ->addLinks('时代的火车向前开2',$messageUrl,$picUrl)
 | 
				
			||||||
 | 
					    ->send();
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					## 多机器人消息发送
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 发送纯文字消息
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					ding('我就是我, xxx 是不一样的烟火','other')
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					or
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					ding()->with('other')->text('我就是我, xxx 是不一样的烟火');
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 通过其他机器人发送其他类型消息
 | 
				
			||||||
 | 
					```php
 | 
				
			||||||
 | 
					ding()->with('other')->markdown($title,$markdown);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ding()->with('other')
 | 
				
			||||||
 | 
					       ->feed()
 | 
				
			||||||
 | 
					       ->addLinks('时代的火车向前开',$messageUrl,$picUrl)
 | 
				
			||||||
 | 
					       ->addLinks('时代的火车向前开2',$messageUrl,$picUrl)
 | 
				
			||||||
 | 
					       ->send();
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										40
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "name": "ykxiao/dm-ding-notice",
 | 
				
			||||||
 | 
					    "description": "a dingtalk robot message handle for send message",
 | 
				
			||||||
 | 
					    "keywords": ["laravel", "ding talk", "ding notice"],
 | 
				
			||||||
 | 
					    "require": {
 | 
				
			||||||
 | 
					        "php": ">=7.0",
 | 
				
			||||||
 | 
					        "guzzlehttp/guzzle": "^6.2|^7.0"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "require-dev": {
 | 
				
			||||||
 | 
					        "phpunit/phpunit": "^5.7",
 | 
				
			||||||
 | 
					        "mockery/mockery": "^1.2"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "autoload": {
 | 
				
			||||||
 | 
					        "psr-4": {
 | 
				
			||||||
 | 
					            "DingNotice\\": "src/"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "files": [
 | 
				
			||||||
 | 
					            "src/helpers.php"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "autoload-dev": {
 | 
				
			||||||
 | 
					        "psr-4": {
 | 
				
			||||||
 | 
					            "DingNotice\\Tests\\": "tests"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "extra": {
 | 
				
			||||||
 | 
					        "laravel": {
 | 
				
			||||||
 | 
					            "providers": [
 | 
				
			||||||
 | 
					                "DingNotice\\DingNoticeServiceProvider"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "license": "MIT",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "ykxiao",
 | 
				
			||||||
 | 
					            "email": "yk_9001@gmail.com"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										31
									
								
								config/ding.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								config/ding.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 默认发送的机器人
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'default' => [
 | 
				
			||||||
 | 
					        // 是否要开启机器人,关闭则不再发送消息
 | 
				
			||||||
 | 
					        'enabled' => env('DING_ENABLED',true),
 | 
				
			||||||
 | 
					        // 机器人的access_token
 | 
				
			||||||
 | 
					        'token' => env('DING_TOKEN',''),
 | 
				
			||||||
 | 
					        // 钉钉请求的超时时间
 | 
				
			||||||
 | 
					        'timeout' => env('DING_TIME_OUT',2.0),
 | 
				
			||||||
 | 
					        // 是否开启ss认证
 | 
				
			||||||
 | 
					        'ssl_verify' => env('DING_SSL_VERIFY',true),
 | 
				
			||||||
 | 
					        // 开启安全配置
 | 
				
			||||||
 | 
					        'secret' => env('DING_SECRET',true),
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'other' => [
 | 
				
			||||||
 | 
					        'enabled' => env('OTHER_DING_ENABLED',true),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'token' => env('OTHER_DING_TOKEN',''),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'timeout' => env('OTHER_DING_TIME_OUT',2.0),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'ssl_verify' => env('DING_SSL_VERIFY',true),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'secret' => env('DING_SECRET',true),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
							
								
								
									
										24
									
								
								phpunit.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								phpunit.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<phpunit backupGlobals="false"
 | 
				
			||||||
 | 
					         backupStaticAttributes="false"
 | 
				
			||||||
 | 
					         bootstrap="./vendor/autoload.php"
 | 
				
			||||||
 | 
					         colors="true"
 | 
				
			||||||
 | 
					         convertErrorsToExceptions="true"
 | 
				
			||||||
 | 
					         convertNoticesToExceptions="true"
 | 
				
			||||||
 | 
					         convertWarningsToExceptions="true"
 | 
				
			||||||
 | 
					         processIsolation="false"
 | 
				
			||||||
 | 
					         stopOnFailure="false">
 | 
				
			||||||
 | 
					    <testsuites>
 | 
				
			||||||
 | 
					        <testsuite name="Unit">
 | 
				
			||||||
 | 
					            <directory>./tests/Unit</directory>
 | 
				
			||||||
 | 
					        </testsuite>
 | 
				
			||||||
 | 
					        <testsuite name="Feature">
 | 
				
			||||||
 | 
					            <directory>./tests/Feature</directory>
 | 
				
			||||||
 | 
					        </testsuite>
 | 
				
			||||||
 | 
					    </testsuites>
 | 
				
			||||||
 | 
					    <filter>
 | 
				
			||||||
 | 
					        <whitelist processUncoveredFilesFromWhitelist="true">
 | 
				
			||||||
 | 
					            <directory suffix=".php">./src</directory>
 | 
				
			||||||
 | 
					        </whitelist>
 | 
				
			||||||
 | 
					    </filter>
 | 
				
			||||||
 | 
					</phpunit>
 | 
				
			||||||
							
								
								
									
										44
									
								
								src/DingNoticeServiceProvider.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/DingNoticeServiceProvider.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Illuminate\Support\ServiceProvider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DingNoticeServiceProvider extends ServiceProvider
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Bootstrap services.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function boot()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->publishes([
 | 
				
			||||||
 | 
					            __DIR__ . '/../config/ding.php' => base_path('config/ding.php'),
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Register services.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function register()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->registerLaravelBindings();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Register Laravel bindings.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function registerLaravelBindings()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->app->singleton(DingTalk::class, function ($app) {
 | 
				
			||||||
 | 
					            return new DingTalk($app['config']['ding']);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										121
									
								
								src/DingTalk.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								src/DingTalk.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,121 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DingTalk
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $config;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $robot = 'default';
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var DingTalkService
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $dingTalkService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected $client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * DingTalk constructor.
 | 
				
			||||||
 | 
					     * @param $config
 | 
				
			||||||
 | 
					     * @param SendClient $client
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function __construct($config,$client = null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->config = $config;
 | 
				
			||||||
 | 
					        $this->client = $client;
 | 
				
			||||||
 | 
					        $this->with();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param string $robot
 | 
				
			||||||
 | 
					     * @return $this
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function with($robot = 'default'){
 | 
				
			||||||
 | 
					        $this->robot = $robot;
 | 
				
			||||||
 | 
					        $this->dingTalkService = new DingTalkService($this->config[$robot],$this->client);
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param string $content
 | 
				
			||||||
 | 
					     * @return mixed
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function text($content = ''){
 | 
				
			||||||
 | 
					        return $this->dingTalkService
 | 
				
			||||||
 | 
					            ->setTextMessage($content)
 | 
				
			||||||
 | 
					            ->send();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param $title
 | 
				
			||||||
 | 
					     * @param $text
 | 
				
			||||||
 | 
					     * @return mixed
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function action($title, $text){
 | 
				
			||||||
 | 
					        return $this->dingTalkService
 | 
				
			||||||
 | 
					            ->setActionCardMessage($title,$text);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param array $mobiles
 | 
				
			||||||
 | 
					     * @param bool $atAll
 | 
				
			||||||
 | 
					     * @return $this
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function at($mobiles = [], $atAll = false){
 | 
				
			||||||
 | 
					        $this->dingTalkService
 | 
				
			||||||
 | 
					            ->setAt($mobiles,$atAll);
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param $title
 | 
				
			||||||
 | 
					     * @param $text
 | 
				
			||||||
 | 
					     * @param $url
 | 
				
			||||||
 | 
					     * @param string $picUrl
 | 
				
			||||||
 | 
					     * @return mixed
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function link($title, $text, $url, $picUrl = ''){
 | 
				
			||||||
 | 
					        return $this->dingTalkService
 | 
				
			||||||
 | 
					            ->setLinkMessage($title,$text,$url,$picUrl)
 | 
				
			||||||
 | 
					            ->send();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param $title
 | 
				
			||||||
 | 
					     * @param $markdown
 | 
				
			||||||
 | 
					     * @return mixed
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function markdown($title, $markdown){
 | 
				
			||||||
 | 
					        return $this->dingTalkService
 | 
				
			||||||
 | 
					            ->setMarkdownMessage($title,$markdown)
 | 
				
			||||||
 | 
					            ->send();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param $title
 | 
				
			||||||
 | 
					     * @param $markdown
 | 
				
			||||||
 | 
					     * @param int $hideAvatar
 | 
				
			||||||
 | 
					     * @param int $btnOrientation
 | 
				
			||||||
 | 
					     * @return mixed
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function actionCard($title, $markdown, $hideAvatar = 0, $btnOrientation = 0){
 | 
				
			||||||
 | 
					        return $this->dingTalkService
 | 
				
			||||||
 | 
					            ->setActionCardMessage($title,$markdown,$hideAvatar,$btnOrientation);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return mixed
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function feed(){
 | 
				
			||||||
 | 
					        return $this->dingTalkService
 | 
				
			||||||
 | 
					            ->setFeedCardMessage();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										168
									
								
								src/DingTalkService.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								src/DingTalkService.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\Messages\ActionCard;
 | 
				
			||||||
 | 
					use DingNotice\Messages\FeedCard;
 | 
				
			||||||
 | 
					use DingNotice\Messages\Link;
 | 
				
			||||||
 | 
					use DingNotice\Messages\Markdown;
 | 
				
			||||||
 | 
					use DingNotice\Messages\Message;
 | 
				
			||||||
 | 
					use DingNotice\Messages\Text;
 | 
				
			||||||
 | 
					use GuzzleHttp\Client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DingTalkService
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected $config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var Message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $message;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $mobiles = [];
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var bool
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $atAll = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var SendClient
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * DingTalkService constructor.
 | 
				
			||||||
 | 
					     * @param $config
 | 
				
			||||||
 | 
					     * @param null $client
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function __construct($config, SendClient $client = null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->config = $config;
 | 
				
			||||||
 | 
					        $this->setTextMessage('null');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($client != null) {
 | 
				
			||||||
 | 
					            $this->client = $client;
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $this->client = $this->createClient($config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param Message $message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setMessage($message)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->message = $message;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getMessage()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $this->message->getMessage();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param array $mobiles
 | 
				
			||||||
 | 
					     * @param bool $atAll
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setAt($mobiles = [], $atAll = false)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->mobiles = $mobiles;
 | 
				
			||||||
 | 
					        $this->atAll = $atAll;
 | 
				
			||||||
 | 
					        if ($this->message) {
 | 
				
			||||||
 | 
					            $this->message->sendAt($mobiles, $atAll);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * create a guzzle client
 | 
				
			||||||
 | 
					     * @return HttpClient
 | 
				
			||||||
 | 
					     * @author wangju 2019-05-17 20:25
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function createClient($config)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $client = new HttpClient($config);
 | 
				
			||||||
 | 
					        return $client;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param $content
 | 
				
			||||||
 | 
					     * @return $this
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setTextMessage($content)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->message = new Text($content);
 | 
				
			||||||
 | 
					        $this->message->sendAt($this->mobiles, $this->atAll);
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param $title
 | 
				
			||||||
 | 
					     * @param $text
 | 
				
			||||||
 | 
					     * @param $messageUrl
 | 
				
			||||||
 | 
					     * @param string $picUrl
 | 
				
			||||||
 | 
					     * @return $this
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setLinkMessage($title, $text, $messageUrl, $picUrl = '')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->message = new Link($title, $text, $messageUrl, $picUrl);
 | 
				
			||||||
 | 
					        $this->message->sendAt($this->mobiles, $this->atAll);
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param $title
 | 
				
			||||||
 | 
					     * @param $text
 | 
				
			||||||
 | 
					     * @return $this
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setMarkdownMessage($title, $markdown)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->message = new Markdown($title, $markdown);
 | 
				
			||||||
 | 
					        $this->message->sendAt($this->mobiles, $this->atAll);
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param $title
 | 
				
			||||||
 | 
					     * @param $text
 | 
				
			||||||
 | 
					     * @param int $hideAvatar
 | 
				
			||||||
 | 
					     * @param int $btnOrientation
 | 
				
			||||||
 | 
					     * @return ActionCard|Message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setActionCardMessage($title, $markdown, $hideAvatar = 0, $btnOrientation = 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->message = new ActionCard($this, $title, $markdown, $hideAvatar, $btnOrientation);
 | 
				
			||||||
 | 
					        $this->message->sendAt($this->mobiles, $this->atAll);
 | 
				
			||||||
 | 
					        return $this->message;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return FeedCard|Message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setFeedCardMessage()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->message = new FeedCard($this);
 | 
				
			||||||
 | 
					        $this->message->sendAt($this->mobiles, $this->atAll);
 | 
				
			||||||
 | 
					        return $this->message;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return bool|array
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function send()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (!$this->config['enabled']) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return $this->client->send($this->message->getBody());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										90
									
								
								src/HttpClient.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/HttpClient.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Created by PhpStorm.
 | 
				
			||||||
 | 
					 * User: wangju
 | 
				
			||||||
 | 
					 * Date: 2019-05-17
 | 
				
			||||||
 | 
					 * Time: 20:38
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use GuzzleHttp\Client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class HttpClient implements SendClient
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    protected $client;
 | 
				
			||||||
 | 
					    protected $config;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $hookUrl = "https://oapi.dingtalk.com/robot/send";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $accessToken = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct($config)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->config = $config;
 | 
				
			||||||
 | 
					        $this->setAccessToken();
 | 
				
			||||||
 | 
					        $this->client = $this->createClient();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setAccessToken(){
 | 
				
			||||||
 | 
					        $this->accessToken = $this->config['token'];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * create a guzzle client
 | 
				
			||||||
 | 
					     * @return Client
 | 
				
			||||||
 | 
					     * @author wangju 2019-05-17 20:25
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function createClient()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $client = new Client([
 | 
				
			||||||
 | 
					            'timeout' => $this->config['timeout'] ?? 2.0,
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					        return $client;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return string
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getRobotUrl()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $query['access_token'] = $this->accessToken;
 | 
				
			||||||
 | 
					        if (isset($this->config['secret']) && $secret = $this->config['secret']) {
 | 
				
			||||||
 | 
					            $timestamp = time() . sprintf('%03d', rand(1, 999));
 | 
				
			||||||
 | 
					            $sign      = hash_hmac('sha256', $timestamp . "\n" . $secret, $secret, true);
 | 
				
			||||||
 | 
					            $query['timestamp'] = $timestamp;
 | 
				
			||||||
 | 
					            $query['sign'] = base64_encode($sign);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return $this->hookUrl . "?" . http_build_query($query);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * send message
 | 
				
			||||||
 | 
					     * @param $url
 | 
				
			||||||
 | 
					     * @param $params
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     * @author wangju 2019-05-17 20:48
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function send($params): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $request = $this->client->post($this->getRobotUrl(), [
 | 
				
			||||||
 | 
					            'body' => json_encode($params),
 | 
				
			||||||
 | 
					            'headers' => [
 | 
				
			||||||
 | 
					                'Content-Type' => 'application/json',
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            'verify' => $this->config['ssl_verify'] ?? true,
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $result = $request->getBody()->getContents();
 | 
				
			||||||
 | 
					        return json_decode($result, true) ?? [];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										50
									
								
								src/Messages/ActionCard.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/Messages/ActionCard.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Messages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\DingTalkService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ActionCard extends Message
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected $service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct(DingTalkService $service,$title, $markdown, $hideAvatar = 0, $btnOrientation = 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->service = $service;
 | 
				
			||||||
 | 
					        $this->setMessage($title,$markdown,$hideAvatar,$btnOrientation);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setMessage($title, $markdown, $hideAvatar = 0, $btnOrientation = 0){
 | 
				
			||||||
 | 
					        $this->message = [
 | 
				
			||||||
 | 
					            'msgtype' => 'actionCard',
 | 
				
			||||||
 | 
					            'actionCard' => [
 | 
				
			||||||
 | 
					                'title' => $title,
 | 
				
			||||||
 | 
					                'text' => $markdown,
 | 
				
			||||||
 | 
					                'hideAvatar' => $hideAvatar,
 | 
				
			||||||
 | 
					                'btnOrientation' => $btnOrientation
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function single($title,$url){
 | 
				
			||||||
 | 
					        $this->message['actionCard']['singleTitle'] = $title;
 | 
				
			||||||
 | 
					        $this->message['actionCard']['singleURL'] = $url;
 | 
				
			||||||
 | 
					        $this->service->setMessage($this);
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function addButtons($title,$url){
 | 
				
			||||||
 | 
					        $this->message['actionCard']['btns'][] = [
 | 
				
			||||||
 | 
					            'title' => $title,
 | 
				
			||||||
 | 
					            'actionURL' => $url
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function send(){
 | 
				
			||||||
 | 
					        $this->service->setMessage($this);
 | 
				
			||||||
 | 
					        return $this->service->send();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										41
									
								
								src/Messages/FeedCard.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/Messages/FeedCard.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Messages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\DingTalkService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FeedCard extends Message
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    protected $service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct(DingTalkService $service)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->service = $service;
 | 
				
			||||||
 | 
					        $this->setMessage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setMessage(){
 | 
				
			||||||
 | 
					        $this->message = [
 | 
				
			||||||
 | 
					            'feedCard' => [
 | 
				
			||||||
 | 
					                'links' => []
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            'msgtype' => 'feedCard'
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function addLinks($title,$messageUrl,$picUrl){
 | 
				
			||||||
 | 
					        $this->message['feedCard']['links'][] = [
 | 
				
			||||||
 | 
					            'title' => $title,
 | 
				
			||||||
 | 
					            'messageURL' => $messageUrl,
 | 
				
			||||||
 | 
					            'picURL' => $picUrl
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function send(){
 | 
				
			||||||
 | 
					        $this->service->setMessage($this);
 | 
				
			||||||
 | 
					        return $this->service->send();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										24
									
								
								src/Messages/Link.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/Messages/Link.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Messages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Link extends Message
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct($title,$text,$messageUrl,$picUrl = '')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->setMessage($title,$text,$messageUrl,$picUrl);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setMessage($title,$text,$messageUrl,$picUrl = ''){
 | 
				
			||||||
 | 
					        $this->message  = [
 | 
				
			||||||
 | 
					            'msgtype' => 'link',
 | 
				
			||||||
 | 
					            'link' => [
 | 
				
			||||||
 | 
					                'text' => $text,
 | 
				
			||||||
 | 
					                'title' => $title,
 | 
				
			||||||
 | 
					                'picUrl' => $picUrl,
 | 
				
			||||||
 | 
					                'messageUrl' => $messageUrl
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								src/Messages/Markdown.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/Messages/Markdown.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Messages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Markdown extends Message
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public function __construct($title,$markdown)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->setMessage($title,$markdown);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setMessage($title,$markdown){
 | 
				
			||||||
 | 
					        $this->message  = [
 | 
				
			||||||
 | 
					            'msgtype' => 'markdown',
 | 
				
			||||||
 | 
					            'markdown' => [
 | 
				
			||||||
 | 
					                'title' => $title,
 | 
				
			||||||
 | 
					                'text' => $markdown
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										37
									
								
								src/Messages/Message.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/Messages/Message.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Messages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abstract class Message
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    protected $message = [];
 | 
				
			||||||
 | 
					    protected $at;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getMessage(){
 | 
				
			||||||
 | 
					        return $this->message;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function makeAt($mobiles = [],$atAll = false){
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					            'at' => [
 | 
				
			||||||
 | 
					                'atMobiles' => $mobiles,
 | 
				
			||||||
 | 
					                'isAtAll' => $atAll
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function sendAt($mobiles = [],$atAll = false){
 | 
				
			||||||
 | 
					        $this->at = $this->makeAt($mobiles,$atAll);
 | 
				
			||||||
 | 
					        return $this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getBody(){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (empty($this->at)){
 | 
				
			||||||
 | 
					            $this->sendAt();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return $this->message + $this->at;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/Messages/Text.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/Messages/Text.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Messages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Text extends Message
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public function __construct($content)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->message = [
 | 
				
			||||||
 | 
					            'msgtype' => 'text',
 | 
				
			||||||
 | 
					            'text' => [
 | 
				
			||||||
 | 
					                'content' => $content
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								src/SendClient.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/SendClient.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Created by PhpStorm.
 | 
				
			||||||
 | 
					 * User: wangju
 | 
				
			||||||
 | 
					 * Date: 2019-05-17
 | 
				
			||||||
 | 
					 * Time: 20:37
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface SendClient
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public function send($params): array;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								src/helpers.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/helpers.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\DingTalk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (!function_exists('ding')){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return bool|DingTalk
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function ding(){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $arguments = func_get_args();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $dingTalk = app(DingTalk::class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (empty($arguments)) {
 | 
				
			||||||
 | 
					            return $dingTalk;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (is_string($arguments[0])) {
 | 
				
			||||||
 | 
					            $robot = $arguments[1] ?? 'default';
 | 
				
			||||||
 | 
					            return $dingTalk->with($robot)->text($arguments[0]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										62
									
								
								tests/Feature/ActionTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								tests/Feature/ActionTest.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Tests\Feature;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\Tests\TestCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ActionTest extends TestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    protected $title = "乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身";
 | 
				
			||||||
 | 
					    protected $text = " \n".
 | 
				
			||||||
 | 
					    " #### 乔布斯 20 年前想打造的苹果咖啡厅 \n\n".
 | 
				
			||||||
 | 
					    " Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct($name = null, array $data = [], $dataName = '')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::__construct($name, $data, $dataName);
 | 
				
			||||||
 | 
					        $this->setUp();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * available content to set
 | 
				
			||||||
 | 
					     * @param $content
 | 
				
			||||||
 | 
					     * @return bool
 | 
				
			||||||
 | 
					     * @author wangju 2019-05-17 21:50
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function matchContent($content)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $content['title'] && $content['text'];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * A basic test example.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function testPushActionSingleMessage()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $result = $this->ding
 | 
				
			||||||
 | 
					            ->actionCard($this->title,$this->text,1)
 | 
				
			||||||
 | 
					            ->single("阅读全文","https://www.dingtalk.com/")
 | 
				
			||||||
 | 
					            ->send();
 | 
				
			||||||
 | 
					        $this->assertSame([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ],$result);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testPushActionBtnsMessageAtAllUser(){
 | 
				
			||||||
 | 
					        $result = $result = $this->ding
 | 
				
			||||||
 | 
					            ->actionCard($this->title,$this->text,1)
 | 
				
			||||||
 | 
					            ->addButtons("内容不错","https://www.dingtalk.com/")
 | 
				
			||||||
 | 
					            ->addButtons("不感兴趣","https://www.dingtalk.com/")
 | 
				
			||||||
 | 
					            ->send();
 | 
				
			||||||
 | 
					        $this->assertSame([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ],$result);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										62
									
								
								tests/Feature/FeedTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								tests/Feature/FeedTest.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Tests\Feature;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\Tests\TestCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FeedTest extends TestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    protected $messageUrl = "https://mp.weixin.qq.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI";
 | 
				
			||||||
 | 
					    protected $picUrl = "https://www.dingtalk.com";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct($name = null, array $data = [], $dataName = '')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::__construct($name, $data, $dataName);
 | 
				
			||||||
 | 
					        $this->setUp();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * available content to set
 | 
				
			||||||
 | 
					     * @param $content
 | 
				
			||||||
 | 
					     * @return bool
 | 
				
			||||||
 | 
					     * @author wangju 2019-05-17 21:50
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function matchContent($content)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (empty($content)){
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return array_reduce($content,function ($carry,$item){
 | 
				
			||||||
 | 
					            if ($carry === null) return true;
 | 
				
			||||||
 | 
					            return $carry && $item['title'] && $item['messageURL'] && $item['picURL'];
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * A basic test example.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function testPushTextMessage()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $result =$this->ding->text("我就是我,@{$this->testUser} 是不一样的烟火");
 | 
				
			||||||
 | 
					        $this->assertSame([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ],$result);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testPushTextMessageAtAllUser(){
 | 
				
			||||||
 | 
					        $result =$this->ding
 | 
				
			||||||
 | 
					            ->feed()
 | 
				
			||||||
 | 
					            ->addLinks('时代的火车向前开',$this->messageUrl,$this->picUrl)
 | 
				
			||||||
 | 
					            ->addLinks('时代的火车向前开2',$this->messageUrl,$this->picUrl)
 | 
				
			||||||
 | 
					            ->send();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertSame([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ],$result);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										48
									
								
								tests/Feature/LinkTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								tests/Feature/LinkTest.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Tests\Feature;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\Tests\TestCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class LinkTest extends TestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected $title = "自定义机器人协议";
 | 
				
			||||||
 | 
					    protected $text = "群机器人是钉钉群的高级扩展功能。群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。例如:通过聚合GitHub,GitLab等源码管理服务,实现源码更新同步;通过聚合Trello,JIRA等项目协调服务,实现项目信息同步。不仅如此,群机器人支持Webhook协议的自定义接入,支持更多可能性,例如:你可将运维报警提醒通过自定义机器人聚合到钉钉群。";
 | 
				
			||||||
 | 
					    protected $picUrl = "";
 | 
				
			||||||
 | 
					    protected $messageUrl = "https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.Rqyvqo&treeId=257&articleId=105735&docType=1";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct($name = null, array $data = [], $dataName = '')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::__construct($name, $data, $dataName);
 | 
				
			||||||
 | 
					        $this->setUp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * available content to set
 | 
				
			||||||
 | 
					     * @param $content
 | 
				
			||||||
 | 
					     * @return bool
 | 
				
			||||||
 | 
					     * @author wangju 2019-05-17 21:50
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function matchContent($content)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $content['text'] && $content['title'] && $content['messageUrl'];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * A basic test example.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function testPushLinkMessage()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $result = $this->ding->link($this->title,$this->text,$this->messageUrl,$this->picUrl);
 | 
				
			||||||
 | 
					        $this->assertSame([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ],$result);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										56
									
								
								tests/Feature/MarkdownTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								tests/Feature/MarkdownTest.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Tests\Feature;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\Tests\TestCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MarkDownTest extends TestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    protected $title = "杭州天气";
 | 
				
			||||||
 | 
					    protected $markdown = "#### 杭州天气  \n ".
 | 
				
			||||||
 | 
					    "> 9度,@1825718XXXX 西北风1级,空气良89,相对温度73%\n\n ".
 | 
				
			||||||
 | 
					    "> \n".
 | 
				
			||||||
 | 
					    "> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) ";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct($name = null, array $data = [], $dataName = '')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::__construct($name, $data, $dataName);
 | 
				
			||||||
 | 
					        $this->setUp();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * available content to set
 | 
				
			||||||
 | 
					     * @param $content
 | 
				
			||||||
 | 
					     * @return bool
 | 
				
			||||||
 | 
					     * @author wangju 2019-05-17 21:50
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function matchContent($content)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $content['title'] && $content['text'];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * A basic test example.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function testPushMarkdownMessage()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $result =$this->ding->markdown($this->title,$this->markdown);
 | 
				
			||||||
 | 
					        $this->assertSame([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ],$result);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testPushMarkdownMessageAtAllUser(){
 | 
				
			||||||
 | 
					        $result =$this->ding
 | 
				
			||||||
 | 
					            ->at([],true)
 | 
				
			||||||
 | 
					            ->markdown($this->title,$this->markdown);
 | 
				
			||||||
 | 
					        $this->assertSame([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ],$result);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										52
									
								
								tests/Feature/TextTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								tests/Feature/TextTest.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Tests\Feature;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\SendClient;
 | 
				
			||||||
 | 
					use DingNotice\Tests\TestCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TextTest extends TestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public function __construct($name = null, array $data = [], $dataName = '')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::__construct($name, $data, $dataName);
 | 
				
			||||||
 | 
					        $this->setUp();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * available content to set
 | 
				
			||||||
 | 
					     * @param $content
 | 
				
			||||||
 | 
					     * @return bool
 | 
				
			||||||
 | 
					     * @author wangju 2019-05-17 21:50
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function matchContent($content)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $text = $content['content'];
 | 
				
			||||||
 | 
					        return !empty($text);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * A basic test example.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function testPushTextMessage()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $result =$this->ding->text("我就是我,@{$this->testUser} 是不一样的烟火");
 | 
				
			||||||
 | 
					        $this->assertSame([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ],$result);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testPushTextMessageAtAllUser(){
 | 
				
			||||||
 | 
					        $result =$this->ding
 | 
				
			||||||
 | 
					            ->at([],true)
 | 
				
			||||||
 | 
					            ->text("我就是我,@{$this->testUser} 是不一样的烟火");
 | 
				
			||||||
 | 
					        $this->assertSame([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ],$result);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										65
									
								
								tests/TestCase.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								tests/TestCase.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace DingNotice\Tests;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use DingNotice\DingTalk;
 | 
				
			||||||
 | 
					use DingNotice\SendClient;
 | 
				
			||||||
 | 
					use PHPUnit\Framework\TestCase as BaseTestCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abstract class TestCase extends BaseTestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var DingTalk
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $ding;
 | 
				
			||||||
 | 
					    protected $testUser;
 | 
				
			||||||
 | 
					    protected $config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp(){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $token = 'f80be582aafed07cfced271c333c7ba7f46b873ebf7168e570919296b8062bad';
 | 
				
			||||||
 | 
					        $this->testUser = '18888888888';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $robot1['timeout'] = 30.0;
 | 
				
			||||||
 | 
					        $robot1['enabled'] = true;
 | 
				
			||||||
 | 
					        $robot1['token'] = $token;
 | 
				
			||||||
 | 
					        $robot1['secret'] = 'SECcfc6343d91e588d1f83dcf6d725a0208f79607726560ca2be135b437c62523b5';
 | 
				
			||||||
 | 
					        $config['default'] = $robot1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->config = $config;
 | 
				
			||||||
 | 
					        $this->ding = $this->mockDingClient();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * mock ding client
 | 
				
			||||||
 | 
					     * @param null $client
 | 
				
			||||||
 | 
					     * @return DingTalk
 | 
				
			||||||
 | 
					     * @author wangju 2019-05-17 20:53
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected function mockDingClient($client = null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $client = \Mockery::mock(SendClient::class);
 | 
				
			||||||
 | 
					        $client->shouldReceive('send')->withArgs(function ($arg) {
 | 
				
			||||||
 | 
					            $messageType = $arg['msgtype'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!in_array($messageType, ['text', 'actionCard', 'feedCard', 'link', 'markdown'])) {
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (!array_key_exists($messageType, $arg)) {
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return $this->matchContent($arg[$messageType]);
 | 
				
			||||||
 | 
					        })->andReturn([
 | 
				
			||||||
 | 
					            'errmsg' => 'ok',
 | 
				
			||||||
 | 
					            'errcode' => 0
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					        $ding = new DingTalk($this->config, $client);
 | 
				
			||||||
 | 
					        return $ding;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function matchContent($content)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user