比较完整的微信开发php代码

前端之家收集整理的这篇文章主要介绍了比较完整的微信开发php代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例为大家分享了微信开发PHP代码,供大家参考,具体内容如下

PHP;"> class WeixinApi
{
private $appid;
private $appsecret;

  1. //构造方法 初始化赋值
  2. public function __construct($appid="",$appsecret="")
  3. {
  4. $this->appid = $appid;
  5. $this->appsecret = $appsecret;
  6. }
  7. //验证服务器地址有效性
  8. public function valid()
  9. {
  10. if($this->checkSignature())
  11. {
  12. $echostr = $_GET['echostr'];//<a href="/tag/suiji/" target="_blank" class="keywords">随机</a>的字符串
  13. return $echostr;
  14. }
  15. else
  16. {
  17. return "Error";
  18. }
  19. }
  20. //检查签名
  21. private function checkSignature()
  22. {
  23. //一、接收微信服务器GET方式提交过来的4个参数数据
  24. $signature = $_GET['signature'];//微信加密签名
  25. $timestamp = $_GET['timestamp'];//时间戳
  26. $nonce = $_GET['nonce'];//<a href="/tag/suiji/" target="_blank" class="keywords">随机</a>数
  27. //二、加密/校验过程
  28. // 1. 将token、timestamp、nonce三个参数进行字典序排序;
  29. // bool sort ( array &$array [,int $sort_flags = SORT_REGULAR ] ) 对数组排序
  30. $tmpArr = array(TOKEN,$timestamp,$nonce);//将上面三个参数放到一个数组里面
  31. sort($tmpArr,SORT_STRING);
  32. // 2. 将三个参数字符串拼接成一个字符串进行sha1加密;
  33. $tmpStr = implode($tmpArr); //将数组转化成字符串
  34. $signatureStr = sha1($tmpStr);
  35. // 3. 开发者获得加密后的字符串与signature对比。
  36. if($signatureStr == $signature)
  37. {
  38. return true;
  39. }
  40. else
  41. {
  42. return false;
  43. }
  44. }
  45. //响应消息
  46. public function responseMsg()
  47. {
  48. //接收微信服务器发送POST请求到开发者服务器,携带的XML数据包
  49. $postData = $GLOBALS['HTTP_RAW_POST_DATA'];
  50. //处理xml数据包
  51. $xmlObj = simplexml_load_string($postData,"SimpleXMLElement",LIBXML_NOCDATA);
  52. if(!$xmlObj)
  53. {
  54. echo "";
  55. exit;
  56. }
  57. //<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>接收消息中的参数<a href="/tag/neirong/" target="_blank" class="keywords">内容</a>
  58. $toUserName = $xmlObj->ToUserName;//开发者微信号
  59. $fromUserName = $xmlObj->FromUserName;//发送方的微信号(openid)
  60. $msgType = $xmlObj->MsgType;//消息类型
  61. switch ($msgType) {
  62. //接收文本消息
  63. case 'text':
  64. //<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>文本消息的关键字
  65. $keyword = $this->receiveText($xmlObj);
  66. //进行关键字<a href="/tag/huifu/" target="_blank" class="keywords">回复</a>
  67. switch($keyword)
  68. {
  69. case "w001":
  70. case "W001":
  71. return $this->replyText($xmlObj,"Hi~你好");
  72. break;
  73. case "w002":
  74. case "W002":
  75. return $this->replyText($xmlObj,"Hi~尴尬了");
  76. break;
  77. case "笑话":
  78. $key = "dee9ebc68fd5a61f67286063932afe56";
  79. return $this->replyNews($xmlObj,$this->joke_text($key));
  80. break;
  81. default:
  82. $key = "dee9ebc68fd5a61f67286063932afe56";
  83. return $this->replyNews($xmlObj,$this->joke_text($key));
  84. break;
  85. }
  86. break;
  87. //接收<a href="/tag/tupian/" target="_blank" class="keywords">图片</a>消息
  88. case 'image':
  89. return $this->receiveImage($xmlObj);
  90. break;
  91. //接收事件推送
  92. case 'event':
  93. return $this->receiveEvent($xmlObj);
  94. break;
  95. }
  96. }
  97. //接收事件推送
  98. public function receiveEvent($obj)
  99. {
  100. //接收事件类型
  101. $event = $obj->Event;
  102. switch ($event)
  103. {
  104. //关注事件
  105. case 'subscribe':
  106. //下发欢迎消息
  107. $newsArr = array(
  108. array(
  109. "Title"=>"做有价值的头条资讯!","Description"=>"把握价值头条资讯,日常更加有谈资呢!","PicUrl"=>"http://jober.applinzi.com/news/img/news.png","Url"=>"http://jober.applinzi.com/news/index.<a href="/tag/PHP/" target="_blank" class="keywords">PHP</a>"
  110. )
  111. );
  112. //<a href="/tag/huifu/" target="_blank" class="keywords">回复</a>图文消息
  113. return $this->replyNews($obj,$newsArr);
  114. break;
  115. //取消关注事件
  116. case 'unsubscribe':
  117. //账号的解绑操作等等
  118. break;
  119. //<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="/tag/caidan/" target="_blank" class="keywords">菜单</a>推送CLICK事件
  120. case 'CLICK':
  121. $eventKey = $obj->EventKey;//<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>事件KEY值,与<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="/tag/caidan/" target="_blank" class="keywords">菜单</a>接口中KEY值对应
  122. switch ($eventKey)
  123. {
  124. case 'old':
  125. $weixinArr = $this->history("da675ebc6a0d72920dca3f676122a693");
  126. $weixinArr = array_slice($weixinArr,5);
  127. $newsArr = array();
  128. foreach ($weixinArr as $item)
  129. {
  130. $newsArr = array(array(
  131. "Title" => $item['Description'],"Description" => $item['Title'],"PicUrl" => "http://1.jober.applinzi.com/news/img/2.jpg","Url" => "http://www.todayonhistory.com/"
  132. ));
  133. }
  134. return $this->replyNews($obj,$newsArr);
  135. break;
  136. }
  137. break;
  138. }
  139. }
  140. //接收文本消息
  141. public function receiveText($obj)
  142. {
  143. $content = trim($obj->Content);//文本消息的<a href="/tag/neirong/" target="_blank" class="keywords">内容</a>
  144. return $content;
  145. }
  146. //接收<a href="/tag/tupian/" target="_blank" class="keywords">图片</a>消息
  147. public function receiveImage($obj)
  148. {
  149. $picUrl = $obj->PicUrl;//<a href="/tag/tupian/" target="_blank" class="keywords">图片</a>的<a href="/tag/lianjie/" target="_blank" class="keywords">链接</a>
  150. $mediaId = $obj->MediaId;//<a href="/tag/tupian/" target="_blank" class="keywords">图片</a>消息媒体id
  151. return $this->replyImage($obj,$mediaId);
  152. }
  153. //<a href="/tag/huifu/" target="_blank" class="keywords">回复</a><a href="/tag/tupian/" target="_blank" class="keywords">图片</a>消息
  154. public function replyImage($obj,$mediaId)
  155. {
  156. $replyXml = "<xml>
  157. <ToUserName><![CDATA[%s]]></ToUserName>
  158. <FromUserName><![CDATA[%s]]></FromUserName>
  159. <CreateTime>%s</CreateTime>
  160. <MsgType><![CDATA[image]]></MsgType>
  161. <Image>
  162. <MediaId><![CDATA[%s]]></MediaId>
  163. </Image>
  164. </xml>";
  165. return sprintf($replyXml,$obj->FromUserName,$obj->ToUserName,time(),$mediaId);
  166. }
  167. //<a href="/tag/huifu/" target="_blank" class="keywords">回复</a>文本消息
  168. public function replyText($obj,$content)
  169. {
  170. $replyXml = "<xml>
  171. <ToUserName><![CDATA[%s]]></ToUserName>
  172. <FromUserName><![CDATA[%s]]></FromUserName>
  173. <CreateTime>%s</CreateTime>
  174. <MsgType><![CDATA[text]]></MsgType>
  175. <Content><![CDATA[%s]]></Content>
  176. </xml>";
  177. return sprintf($replyXml,$content);
  178. }
  179. //<a href="/tag/huifu/" target="_blank" class="keywords">回复</a>图文消息
  180. public function replyNews($obj,$newsArr)
  181. {
  182. //判断是否为数组类型
  183. if(!is_array($newsArr))
  184. {
  185. return;
  186. }
  187. // 判断数组是否为空数组
  188. if(!$newsArr)
  189. {
  190. return;
  191. }
  192. $itemStr = "";
  193. //定义item模板
  194. $itemXml = "<item>
  195. <Title><![CDATA[%s]]></Title>
  196. <Description><![CDATA[%s]]></Description>
  197. <PicUrl><![CDATA[%s]]></PicUrl>
  198. <Url><![CDATA[%s]]></Url>
  199. </item>";
  200. foreach($newsArr as $item)
  201. {
  202. $itemStr .= sprintf($itemXml,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
  203. }
  204. $replyXml = "<xml>
  205. <ToUserName><![CDATA[%s]]></ToUserName>
  206. <FromUserName><![CDATA[%s]]></FromUserName>
  207. <CreateTime>%s</CreateTime>
  208. <MsgType><![CDATA[news]]></MsgType>
  209. <ArticleCount>".count($newsArr)."</ArticleCount>
  210. <Articles>".$itemStr."</Articles>
  211. </xml>";
  212. return sprintf($replyXml,time());
  213. }
  214. //封装https请求(GET和POST)
  215. protected function https_request($url,$data=null)
  216. {
  217. //1、初始化curl
  218. $ch = curl_init();
  219. //2、设置传输选项
  220. curl_setopt($ch,CURLOPT_URL,$url);//请求的<a href="/tag/URLdizhi/" target="_blank" class="keywords">URL地址</a>
  221. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//将请求的结果以<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>流的形式返回
  222. if(!empty($data))
  223. {
  224. curl_setopt($ch,CURLOPT_POST,1);//请求POST方式
  225. curl_setopt($ch,CURLOPT_POSTFIELDS,$data);//POST提交的<a href="/tag/neirong/" target="_blank" class="keywords">内容</a>
  226. }
  227. //3、执行请求并处理结果
  228. $outopt = curl_exec($ch);
  229. //把json数据转化成数组
  230. $outoptArr = json_decode($outopt,TRUE);
  231. //4、<a href="/tag/guanbi/" target="_blank" class="keywords">关闭</a>curl
  232. curl_close($ch);
  233. //如果返回的结果$outopt是json数据,则需要判断一下
  234. if(is_array($outoptArr))
  235. {
  236. return $outoptArr;
  237. }
  238. else
  239. {
  240. return $outopt;
  241. }
  242. }
  243. public function juhe_weixin($key,$type)
  244. {
  245. $url ="http://v.juhe.cn/toutiao/index?type={$type}&key={$key}";
  246. $result = $this->https_request($url);
  247. if($result['error_code'] == 0)
  248. {
  249. return $result['result']['data'];
  250. }
  251. else
  252. {
  253. return array();
  254. }
  255. }
  256. //聚合数据-<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>最新趣图
  257. public function joke_text($key,$pagesize=10)
  258. {
  259. $url = "http://japi.juhe.cn/joke/img/text.from?key={$key}&pagesize={$pagesize}";
  260. $jokeArr = $this->https_request($url);
  261. $resultArr = $jokeArr['result']['data'];
  262. // $content = $resultArr[0]['content'];
  263. // return $this->replyText($xmlObj,$content);
  264. $newsArr = array();
  265. //判断笑话接口是否<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>数据
  266. if($jokeArr['error_code'] == 0)
  267. {
  268. foreach($resultArr as $item)
  269. {
  270. $newsArr[] = array(
  271. "Title"=>$item['content'],"Description"=>$item['updatetime'],"PicUrl"=>$item['url'],"Url"=>$item['url']
  272. );
  273. }
  274. }
  275. return $newsArr;
  276. }
  277. //聚合数据-<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>历史上的今天
  278. public function history($key)
  279. {
  280. $m = idate('m');
  281. $d = idate('d');
  282. $day = "{$m}/{$d}";
  283. $url = "http://v.juhe.cn/todayOnhistory/queryEvent.<a href="/tag/PHP/" target="_blank" class="keywords">PHP</a>?key={$key}&date={$day}";
  284. $historyArr = $this->https_request($url);
  285. $resultArr = $historyArr['result'];
  286. // $content = $resultArr['title'];
  287. // return $this->replyText($xmlObj,$content);
  288. $newsArr = array();
  289. //判断接口是否<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>数据
  290. if($jokeArr['error_code'] == 0)
  291. {
  292. foreach($resultArr as $item)
  293. {
  294. $newsArr[] = array(
  295. "Title"=>$item['title'],"Description"=>$item['date'],"PicUrl"=>"","Url"=>""
  296. );
  297. }
  298. }
  299. return $newsArr;
  300. }
  301. public function fund($key)
  302. {
  303. $url = "http://japi.juhe.cn/jingzhi/query.from?key={$key}";
  304. $fundArr = $this->https_request($url);
  305. $resultArr = $fundArr['result'];
  306. // $content = $resultArr['title'];
  307. // return $this->replyText($xmlObj,$content);
  308. $newsArr = array();
  309. //判断接口是否<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>数据
  310. if($jokeArr['error_code'] == 0)
  311. {
  312. foreach($resultArr as $item)
  313. {
  314. $newsArr[] = array(
  315. "Title"=>$item['day'],"Description"=>$item['title'],"Url"=>"http://www.baidu.com"
  316. );
  317. }
  318. }
  319. return $newsArr;
  320. }
  321. /**
  322. *<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>基础<a href="/tag/zhichi/" target="_blank" class="keywords">支持</a>里面的接口<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a>凭证access_token并缓存access_token
  323. *@return access_token string 接口凭证
  324. **/
  325. public function getAccessToken()
  326. {
  327. //<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>memcache缓存的access_token
  328. $access_token = $this->_memcache_get("access_token");
  329. //如果缓存的access_token失效
  330. if(!$access_token)
  331. {
  332. //如果失效<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a><a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>接口凭证来<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>access_token
  333. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appsecret}";
  334. $outoptArr = $this->https_request($url);
  335. if(!isset($outoptArr['errcode']))
  336. {
  337. //memcache缓存access_token
  338. $this->_memcache_set("access_token",$outoptArr['access_token'],7000);
  339. return $outoptArr['access_token'];
  340. }
  341. }
  342. return $access_token;
  343. }
  344. //初始化memcache
  345. private function _memcache_init()
  346. {
  347. $mmc = new Memcache;
  348. $ret = $mmc -> connect();
  349. if ($ret == false)
  350. {
  351. return;
  352. }
  353. return $mmc;
  354. }
  355. //设置memcache
  356. private function _memcache_set($key,$value,$time=0)
  357. {
  358. $mmc = $this->_memcache_init();
  359. $mmc -> set($key,$time);
  360. }
  361. //<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>memcahce
  362. private function _memcache_get($key)
  363. {
  364. $mmc = $this->_memcache_init();
  365. return $mmc -> get($key);
  366. }
  367. //<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="/tag/caidan/" target="_blank" class="keywords">菜单</a>创建
  368. public function menu_create($data)
  369. {
  370. $access_token = $this->getAccessToken();
  371. //<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="/tag/caidan/" target="_blank" class="keywords">菜单</a>创建接口地址
  372. $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}";
  373. return $this->https_request($url,$data);
  374. }
  375. //<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="/tag/caidan/" target="_blank" class="keywords">菜单</a><a href="/tag/shanchu/" target="_blank" class="keywords">删除</a>
  376. public function menu_delete()
  377. {
  378. $access_token = $this->getAccessToken();
  379. $url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={$access_token}";
  380. return $this->https_request($url);
  381. }

}
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

猜你在找的PHP相关文章