├── .gitignore ├── LICENSE.txt ├── README.md └── wxpusher.class.php /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .idea/ 3 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | wxpusher-sdk-php遵循Apache2开源协议发布,并提供免费使用。 3 | 版权所有[2020][Meloncn] 4 | 5 | 根据2.0版本Apache许可证("许可证")授权; 6 | 根据本许可证,用户可以不使用此文件。 7 | 用户可从下列网址获得许可证副本: 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Apache Licence是著名的非盈利开源组织Apache采用的协议。 11 | 该协议和BSD类似,鼓励代码共享和尊重原作者的著作权, 12 | 允许代码修改,再作为开源或商业软件发布。需要满足 13 | 的条件: 14 | 1. 需要给代码的用户一份Apache Licence ; 15 | 2. 如果你修改了代码,需要在被修改的文件中说明; 16 | 3. 在延伸的代码中(修改和有源代码衍生的代码中)需要 17 | 带有原来代码中的协议,商标,专利声明和其他原来作者规 18 | 定需要包含的说明; 19 | 4. 如果再发布的产品中包含一个Notice文件,则在Notice文 20 | 件中需要带有本协议内容。你可以在Notice中增加自己的 21 | 许可,但不可以表现为对Apache Licence构成更改。 22 | 23 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 26 | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 27 | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 28 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 29 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 30 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 31 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 33 | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34 | POSSIBILITY OF SUCH DAMAGE. 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wxpusher for PHP 2 | ------ 3 | [![GitHub issues](https://img.shields.io/github/issues/wxpusher/wxpusher-sdk-php)](https://github.com/wxpusher/wxpusher-sdk-php/issues) 4 | [![GitHub stars](https://img.shields.io/github/stars/meloncn/wxpusher-sdk-php)](https://github.com/meloncn/wxpusher-sdk-php/stargazers) 5 | [![GitHub forks](https://img.shields.io/github/forks/wxpusher/wxpusher-sdk-php)](https://github.com/wxpusher/wxpusher-sdk-php/network) 6 | [![GitHub license](https://img.shields.io/github/license/wxpusher/wxpusher-sdk-php)](https://github.com/wxpusher/wxpusher-sdk-php/blob/master/LICENSE) 7 | 8 | ## 简介 9 | 10 | * 基于PHP对 [Wxpusher](http://wxpusher.zjiecode.com) 微信推送服务的接口封装。 11 | 12 | ## 注意事项 13 | * PHP Version >= 5.4 14 | * 发送Send(),Qrcreate()函数需 CURL 支持。 15 | 16 | ## 基本使用方法 17 | 18 | #### 使用前准备 19 | 引入本类库文件,实例化时需传入网站获取的APP_TOKEN值。 20 | 21 | ```php 22 | quickSend('','10','Hello','http://localhost.com',false); 43 | ``` 44 | 45 | 46 | #### 2、标准信息发送消息(POST请求传送) 47 | 结构 48 | 49 | send(内容,摘要,消息类型,是否为用户id,ID,超链接,是否获取messageId) 50 | 51 | * 内容,摘要为字符串形式,使用 \n 换行 52 | * 内容类型为int类型,1表示文字 2表示html 3表示markdown 53 | * 是否为用户Id为bool类型,true代表id参数传入用户UID,false代表id参数传入主题ID 54 | * 传入单个ID可以使用int类型,多个ID请使用数组形式 55 | * url可为空 56 | * 是否返回消息ID为bool类型,如果为true则执行完毕后返回消息ID用于后期追踪。默认false。 57 | 58 | 实例代码: 59 | 60 | ``` 61 | $wxpusher->send('Hello','Summary','1','false',10,'www.google.com'); 62 | ``` 63 | 64 | #### 3、创建二维码 65 | 结构 66 | 67 | Qrcreate(参数,过期时间) 68 | 69 | * 参数最大不可超过64位。留空则系统随机生成参数提交 70 | * 过期时间,单位秒,默认1800 71 | * 成功后返回多维数组 72 | * | -- 'expires' 过期时间 73 | * | -- 'code' 74 | * | -- 'shortUrl 生成二维码短连接 75 | * | -- 'extra' 传递进的参数 76 | * | -- 'url' 二维码长链接 77 | * 失败后返回服务端提示错误消息(string) 78 | 79 | 实例代码: 80 | 81 | ``` 82 | $wxpusher->Qrcreate('wxpusher',1800); 83 | ``` 84 | 85 | 86 | #### 4、检查远程消息发送状态 87 | 结构 88 | 89 | checkStatus(消息ID) 90 | 91 | * 远程信息成功投递后返回 True (bool) 92 | * 其余状态返回文本提示消息 (string) 93 | 94 | 实例代码: 95 | 96 | ``` 97 | $wxpusher->checkStatus(1122); 98 | ``` 99 | 100 | #### 5、获取关注用户详情 101 | 结构 102 | 103 | getFunInfo(页码,每页信息数量,用户UID) 104 | 105 | * 页码默认为1,每页信息数量默认为100 106 | * 用户uid留空则返回所有关注着信息,填写uid则返回指定关注者信息 107 | * 空数据返回 NULL 值 108 | * 执行成功后结果皆为多维数组形式 (array) 109 | * 执行失败反馈错误信息(string) 110 | 111 | 实例代码: 112 | ``` 113 | $wxpusher->getFunInfo(); 114 | ``` 115 | 116 | #### 6、获取关注者总数 117 | 118 | 无需传入任何参数,执行成功返回结果为int类型 119 | 120 | 出现错误返回远程服务器提示信息 (string) 121 | 122 | 实例代码: 123 | ``` 124 | $wxpusher->getFunTotal(); 125 | ``` 126 | 127 | 128 | 129 | Author [@Meloncn][https://github.com/meloncn/wxpusher-sdk-php] 130 | 131 | 最后更新时间:2020年12月5日 20:54 -------------------------------------------------------------------------------- /wxpusher.class.php: -------------------------------------------------------------------------------- 1 | appToken = $Token; 28 | $this->appMsgGate = 'http://wxpusher.zjiecode.com/api/send/message'; 29 | $this->appMsgCheckGate = 'http://wxpusher.zjiecode.com/api/send/query'; 30 | $this->appUserFunGate = 'http://wxpusher.zjiecode.com/api/fun/wxuser'; 31 | $this->appQrCreatGate = 'http://wxpusher.zjiecode.com/api/fun/create/qrcode'; 32 | } 33 | 34 | /** 35 | * Post请求工具 36 | * 用于向服务器快速发送json格式数据 37 | */ 38 | private function post_json($url, $jsonStr){ 39 | $ch = curl_init(); 40 | curl_setopt($ch, CURLOPT_POST, 1); 41 | curl_setopt($ch, CURLOPT_URL, $url); 42 | curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr); 43 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 44 | curl_setopt($ch, CURLOPT_HTTPHEADER, array( 45 | 'Content-Type: application/json; charset=utf-8', 46 | 'Content-Length: ' . strlen($jsonStr) 47 | )); 48 | $response = curl_exec($ch); 49 | $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 50 | curl_close($ch); 51 | return $response; 52 | } 53 | 54 | /** 55 | * 快速发送文本信息 56 | * 使用方法: 57 | * $wx->quickSend('用户id','主题id','内容','http://domain',false); 58 | * 成功返回 true 59 | * 失败返回 服务器提示信息 60 | * 61 | * 用户ID与主题ID使用哪一个填写哪一个,不使用留空 62 | * 63 | * 最后一个参数debug (bool) 64 | * true 失败返回服务器提示信息 65 | * false 失败返回false 66 | */ 67 | public function quickSend($uid = null , $topicId = null , $content = 'Hello',$url = null,$debug = false){ 68 | $data = http_build_query( 69 | array( 70 | 'appToken' => $this->appToken, 71 | 'content' => $content, 72 | 'uid' => $uid, 73 | 'topicId' => $topicId, 74 | 'url' => urlencode($url), 75 | )); 76 | $result = json_decode(file_get_contents($this->appMsgGate.'/?'.$data),TRUE); 77 | 78 | if ($result['data'][0]['code'] == 1000){ 79 | return true; 80 | }else{ 81 | if ($debug){ 82 | return $result['data'][0]['status']; 83 | }else{ 84 | return false; 85 | } 86 | } 87 | } 88 | 89 | /** 90 | * @param null $content 91 | * @param int $contentType 92 | * @param int $summary 93 | * @param bool $isUids 94 | * @param array int $id 95 | * @param string $url 96 | * @return string 97 | * 98 | * 标准信息发送方式 99 | * 需调用CURL 100 | * 101 | * $content: 您要发送的内容 \n换行 102 | * $summary: 消息摘要 \n换行 可为空 103 | * $contentType: 104 | * |- 1表示文字 105 | * |- 2表示html 106 | * |- 3表示markdown 107 | * 108 | * $isUids: 109 | * |- true 发送到用户 110 | * |- false 发送到主题 111 | * 112 | * $url 需要添加协议头 http://或https:// 113 | * 114 | * $array_id: 单条可使用int类型,多条使用数组方式 115 | * 116 | * 执行结果: 117 | * 是否开启$getMessageId: 118 | * |—true 执行完毕后返回messageId和错误信息 多维数组形式 119 | * |—false 执行完毕后仅返回错误信息,若无错误返回TRUE 120 | * 121 | * 使用方法实例: 122 | * $wx->send('内容','摘要','类型','是否为用户id',id或数组id,'需传送的url',是否返回messageID)) 123 | */ 124 | public function send($content = null,$summary = null,$contentType = 1,$isUids = true,$array_id = [],$url = '',$getMessageId = false,$verifyPay = false) 125 | { 126 | { 127 | $type = $isUids?'uids':'topicIds'; 128 | 129 | // 若 $array_id 直接输入int则此处进行转换 130 | if (!is_array($array_id)){ 131 | $array_id = ["$array_id"]; 132 | } 133 | $postdata = array( 134 | 'appToken' => $this->appToken, 135 | 'content' => $content, 136 | 'summary' => $summary, 137 | $type => $array_id, 138 | 'url' => $url, 139 | 'verifyPay' => $verifyPay, 140 | ); 141 | $jsonStr = json_encode($postdata); 142 | $result_Original = json_decode($this->post_json($this->appMsgGate, $jsonStr),TRUE);//取出data内执行信息 143 | 144 | if ($result_Original['success']){ //判断服务器是否回复成功识别指令 145 | $result = $result_Original['data']; //获取执行结果 146 | //记录错误信息 147 | $error = []; 148 | foreach ($result as $key => $k){ 149 | if ($k['code'] !== 1000){ 150 | $error[] = $k; 151 | } 152 | } 153 | //记录发送成功MessageID 154 | if ($getMessageId){ 155 | foreach ($result as $key => $k){ 156 | if ($k['code'] == 1000){ 157 | $messageId[] = $k['messageId']; 158 | } 159 | } 160 | if (empty($messageId)){ 161 | $messageId = []; 162 | } 163 | } 164 | if (empty($error)){ // 没有出现错误 165 | if ($getMessageId){ //判断是否需要输出messageId 166 | return $messageId; //输出messageID 167 | }else{ 168 | return true; // 不需要输出MessageID直接True 169 | } 170 | }else{ //出错状态 171 | if ($getMessageId){ //判断是否需要输出Id 172 | return array('error' => $error,'messageId' => $messageId); //输出错误信息和ID 173 | }else{ 174 | return $error; //仅输出错误 175 | } 176 | } 177 | }else{ 178 | return $result_Original['msg']; //输出服务器指令识别失败状态 179 | } 180 | } 181 | } 182 | 183 | 184 | /** 185 | * @param string $extra 186 | * @param int $validTime 187 | * @return mixed 188 | * 189 | * 创建自定义二维码 190 | * $extra 自定义参数,为空则根据当前时间随机生成,最长不可超过64位 191 | * $validTime 时间,单位秒。默认1800秒即30分钟 192 | * 193 | * 执行成功后返回多维数组 194 | * | 195 | * | -- 'expires' 过期时间 196 | * | -- 'code' 197 | * | -- 'shortUrl 生成二维码短连接 198 | * | -- 'extra' 传递进的参数 199 | * | -- 'url' 二维码长链接 200 | * 201 | * 执行失败返回错误原因 (string) 202 | */ 203 | 204 | public function Qrcreate($extra = '',$validTime = 1800){ 205 | 206 | if ($extra == ''){ 207 | $extra = md5(time().microtime().'wxpusher'); 208 | } 209 | $postdata = array( 210 | 'appToken' => $this->appToken, 211 | 'extra' => $extra, 212 | 'validTime' => $validTime, 213 | ); 214 | $jsonStr = json_encode($postdata); 215 | $result = json_decode($this->post_json($this->appQrCreatGate, $jsonStr),TRUE); 216 | if ($result['success']){ 217 | return $result['data']; 218 | }else{ 219 | return $result['msg']; 220 | } 221 | } 222 | 223 | /** 224 | * @param $messageId 225 | * @return bool 226 | * 信息查询状态 227 | * 信息发送成功返回 True 228 | * 其余状态返回服务器提示信息(msg) 229 | */ 230 | public function checkStatus($messageId){ 231 | $result = json_decode(file_get_contents($this->appMsgCheckGate.'/'.$messageId)); 232 | if ($result->code == 1000){ 233 | return true; 234 | }else{ 235 | return $result->msg; 236 | } 237 | } 238 | 239 | /** 240 | * @param int $page 241 | * @param int $pageSize 242 | * @param string $uid 243 | * @return null|string 244 | * 245 | * 获取关注用户信息 246 | * $uid 默认为空,返回所有关注用户数据 多维数组 247 | * 输入uid,输出指定用户信息 多维数组 248 | * 249 | * 远程服务器执行返回success继续执行 250 | * 否则返回远程服务器错误信息 251 | * 252 | * 查询数据 253 | * 得到数据返回多维数组 254 | * 空数据返回 NULL 255 | */ 256 | 257 | public function getFunInfo($page = 1,$pageSize = 100,$uid = ''){ 258 | $data = http_build_query( 259 | array( 260 | 'appToken' => $this->appToken, 261 | 'page' => $page, 262 | 'pageSize' => $pageSize, 263 | 'uid' => $uid 264 | )); 265 | $result = json_decode($result = file_get_contents($this->appUserFunGate.'/?'.$data),true); 266 | if ($result['code'] == 1000){ //判断服务器是否执行成功 267 | $data = $result['data']['records']; 268 | if (empty($data)){ 269 | return null; 270 | }else{ 271 | return $data; 272 | } 273 | }else{ 274 | return $result['msg']; //反馈服务器给出的错误信息 275 | } 276 | } 277 | /** 278 | * @return mixed 279 | * 返回用户关注总数 int 280 | */ 281 | public function getFunTotal(){ 282 | $data = http_build_query( 283 | array( 284 | 'appToken' => $this->appToken, 285 | 'page' => 1, 286 | 'pageSize' => 1, 287 | )); 288 | $result = json_decode($result = file_get_contents($this->appUserFunGate.'/?'.$data),true); 289 | if ($result['code'] == 1000){ //判断服务器是否执行成功 290 | return $result['data']['total']; 291 | }else{ 292 | return $result['msg']; //反馈服务器给出的错误信息 293 | } 294 | } 295 | } 296 | --------------------------------------------------------------------------------