-
PHP微信公众号开发SDK
2019-08-08 08:40:03PHP微信公众号开发SDK -
php微信公众号开发
2020-07-09 13:40:083.配置服务器与微信公众号牵手 进入这个目录,打开index.php,代码如下:再点击提交按钮,显示TOKEN验证成功 <?php $appsecret = '03e***************707d';//用自己的 $appid = 'wx*******a..1.注册微信公众号
2.申请微信公众号测试账号
测试号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
(填写好之后不要提交)
3.配置服务器与微信公众号牵手
进入
这个目录,打开index.php,代码如下:再点击提交按钮,显示TOKEN验证成功
<?php $appsecret = '03e*********e9707d'; $appid = 'wxc6a******3da1c'; $token = TOKEN; $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; if( $_GET['echostr'] ){ $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); //file_put_contents('msg.txt',json_encode($_GET)); if( $tmpStr == $signature ){ echo $_GET['echostr']; }else{ return false; } }else{ require_once 'php/wxBizMsgCrypt.php'; //$msg_sign = $_GET['msg_signatrue']; $post_data = file_get_contents('php://input') ; //用户发送的数据 file_put_contents('test.txt',json_encode($post_data)); //$pc = new WXBizMsgCrypt($token,$appsecret,$appid); // $msg_decrypt = $pc->decryptMsg($msg_sign,$timestamp,$nonce ,$post_data ,$msg );//安全模式下解密 $msg是解密后的结果集 $xmlToObj = simplexml_load_string($post_data); $msg_type = $xmlToObj->MsgType; $msg_content = $xmlToObj->Content; $event = $xmlToObj->Event; //事件类型,subscribe(订阅)、unsubscribe(取消订阅) //file_put_contents('123.txt',$msg_content.$msg_type); if( $msg_type == "text"){ if( $msg_content == "图文" ){ echo transTexts($xmlToObj ); return false; }elseif( $msg_content == "链接" ){ //echo transTexts($xmlToObj ); echo aaa($xmlToObj ); return false; } //file_put_contents('6.txt',json_encode($xmlToObj)); echo text($xmlToObj ); }elseif($msg_type == "image" ){ //file_put_contents('img.txt',json_encode($xmlToObj)); echo img($xmlToObj ); }elseif( $msg_type == "voice"){//语音 echo voice($xmlToObj ); }elseif( $msg_type=='event' ){ $event_key = $xmlToObj->EventKey; //对应caidan.json中的key if( $event_key == "test1"){ echo transTexts($xmlToObj ); } if($event=='subscribe'){ //关注 echo transTexts($xmlToObj ); }elseif($event=='unsubscribe'){ //取关 file_put_contents('info.txt','unsubscribe'."\n"); } } } function text($obj){ $xml = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <MsgId>%d</MsgId> </xml>"; $result = sprintf($xml,$obj->FromUserName,$obj->ToUserName,time(),$obj->Content,$obj->MsgId); return $result ; } function img($obj){ $xml = '<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image><MediaId><![CDATA[%s]]></MediaId></Image> </xml>'; $result = sprintf($xml,$obj->FromUserName,$obj->ToUserName,time(),$obj->MediaId); return $result; } function voice($obj){ $xml = '<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <Voice><MediaId><![CDATA[%s]]></MediaId></Voice> </xml>'; $result = sprintf($xml,$obj->FromUserName,$obj->ToUserName,time(),$obj->MediaId); return $result; } function transTexts($obj){ $xml = '<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>2</ArticleCount> <Articles> <item> <Title><![CDATA[ttttttttttt]]></Title> <Description><![CDATA[dddddddddd]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item> <item> <Title><![CDATA[aaaaaaaaaa]]></Title> <Description><![CDATA[bbbbbbbb]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item> </Articles> </xml>'; $picUrl = 'http://www.lampol-blog.com/static/home/images/logo.png'; $url = 'http://www.lampol-blog.com/detail/aid/MTE4ZHdENmJ6UkJFZmJxWDB6MTZ4UG1uWnRsWnMxRzBwK3RDRXVHQg%3D%3D'; $result = sprintf($xml,$obj->FromUserName,$obj->ToUserName,time(),$picUrl,$url,$picUrl,$url); // file_put_contents('info.txt',$result."\n"); return $result; } function aaa($obj){ $xml = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[link]]></MsgType> <Title><![CDATA[公众平台官网链接]]></Title> <Description><![CDATA[公众平台官网链接]]></Description> <Url><![CDATA[https://www.baidu.com]]></Url> <MsgId>1234567890123456</MsgId> </xml>"; $result = sprintf($xml,$obj->FromUserName,$obj->ToUserName,time()); file_put_contents('link.txt',$result."\n"); return $result ; } ?>
========================获取token===================
===================自定义菜单===========================
caidan.php
<?php $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxc6****da1c&secret=03ec642*****79788e9707d"; $access_token = json_decode(file_get_contents($url),true); file_put_contents('/home/www/blog/token.txt',$access_token['access_token']); $menu_json = file_get_contents('caidan.json'); $msg = http_post($access_token['access_token'],$menu_json); echo $msg; function http_post($access_token,$data){ $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $res = curl_exec($ch); curl_close($ch); return $res; } ?>
caidan.json
{ "button":[ { "type":"click", "name":"今日歌曲", "key":"test1" }, { "name":"菜单", "sub_button":[ { "type":"view", "name":"搜索", "url":"http://www.soso.com/" }, { "type":"scancode_push", "name":"扫码推送", "key":"saomatui1", "sub_button":[] }, { "type":"scancode_waitmsg", "name":"扫码提示", "key":"saomatui1_2", "sub_button":[] }, { "type":"click", "name":"赞一下我们", "key":"V1001_GOOD" }] }] }
然后执行candan.php文件
-
PHP微信公众号开发
2020-03-17 17:09:38<?php namespace Home\Controller; use Think\Controller; class WxApiController extends Controller{ ... * 微信公众号开发 * 官方文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started...<?php namespace Home\Controller; use Think\Controller; class WxApiController extends Controller{ /** * 微信公众号开发 * 官方文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html * author 赵辉 */ private $appId = '***'; private $appSecret = '***'; private $GetAccessTokenUrl = 'https://api.weixin.qq.com/cgi-bin/token'; private $CreateMenuUrl = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='; private $GetCreateMenuUrl = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token='; private $GetMenuInfoUrl = 'https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token='; private $SendMsgByOpenIdUrl = 'https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token='; /** * 开发者填写的URL * 微信开发统一入口 * @return mixed */ public function index(){ //验证服务器地址的有效性 if($_GET['echostr']){ if($this->checkSignature()){ echo $_GET['echostr'];exit; }else{ echo '';exit; } } //php5.6 以上用 file_get_contents 获取 $xml = $GLOBALS['HTTP_RAW_POST_DATA'] ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents('php://input'); if($xml){ $param = $this->_xml_data_parse($xml); //MsgType :文本为text, 图片为image, 语音为voice, 视频为video, 小视频为shortvideo, //MsgType :地理位置为location, 链接为link, 事件推送(点击菜单)event if($param['MsgType'] == 'text'){//用户发送的消息 //根据消息内容做回复 $link_arr_1 = ['模拟','模拟考试','考试','试题','做题']; $link_arr_2 = ['邀请码','获取邀请码']; if(in_array($param['Content'],$link_arr_1)){ $tpl = $this->msg_temps('text'); $return_msg = 'http://www.hbyjglxy.com/Index.php/Mobile/MyTestSeo/index'; $resultStr = sprintf($tpl, $param['FromUserName'], $param['ToUserName'], time(), 'text', $return_msg); }elseif(in_array($param['Content'],$link_arr_2)){ $tpl = $this->msg_temps('text'); $return_msg = 'F001004'; $resultStr = sprintf($tpl, $param['FromUserName'], $param['ToUserName'], time(), 'text', $return_msg); }elseif(strpos($param['Content'],'密码') !== false){ $tpl = $this->msg_temps('text'); $return_msg = 'http://www.hbyjglxy.com/index.php/mobile/login/password_view_1'; $resultStr = sprintf($tpl, $param['FromUserName'], $param['ToUserName'], time(), 'text', $return_msg); } }elseif ($param['MsgType'] == 'event'){ if($param['Event'] == 'subscribe'){//关注 $tpl = $this->msg_temps('text'); $return_msg = '欢迎关注河北省应急安全管理平台'; $resultStr = sprintf($tpl, $param['FromUserName'], $param['ToUserName'], time(), 'text', $return_msg); }elseif ($param['Event'] == 'unsubscribe'){//取消关注 } } //记录消息 $add = M('wx_record')->create($param); M('wx_record')->add($add); if(!empty($resultStr)){echo $resultStr;exit;} } echo 'success'; exit; } /** * 创建菜单 * @return mixed */ public function create_menu(){ $menu_arr = [ 'button'=>[ [ 'name'=>'考试系统', 'sub_button'=>[ [ 'type'=>'view', 'name'=>'模拟考试', 'url'=>'http://www.hbyjglxy.com/Index.php/Mobile/MyTestSeo/index', ], [ 'type'=>'view', 'name'=>'正式考试', 'url'=>'http://www.hbyjglxy.com/Index.php/Mobile/Index/go_format_test', ] ] ], [ 'type'=>'view', 'name'=>'视频课程', 'url'=>'http://www.hbyjglxy.com/Index.php/Mobile/MyCourse/get_my_course', ], [ 'type'=>'view', 'name'=>'会员中心', 'url'=>'http://www.hbyjglxy.com/index.php/mobile/member/index', ] ] ]; $postData = json_encode ($menu_arr,JSON_UNESCAPED_UNICODE); $postData = str_replace ("\\/","/", $postData); $access_token = $this->getAccessToken(); $res = $this->httpPost($this->CreateMenuUrl.$access_token,$postData); $res = json_decode($res,true); echo "<pre>"; print_r($res);exit; } /** * 获取开发配置菜单 * @return mixed */ public function get_create_menu(){ $access_token = $this->getAccessToken(); $res = $this->httpGet($this->GetCreateMenuUrl.$access_token); $res = json_decode($res,true); echo "<pre>"; print_r($res);exit; } /** * 获取菜单信息(自定义菜单配置 OR 开发配置菜单) * @return mixed */ public function get_menu_info(){ $access_token = $this->getAccessToken(); $res = $this->httpGet($this->GetMenuInfoUrl.$access_token); $res = json_decode($res,true); echo "<pre>"; print_r($res);exit; } /** * 根据OpenID列表群发 * @return mixed */ public function send_msg_by_open_id(){ $open_id = ['omcPa1Zj-K_Zw328diP2N7cWTgq8','omcPa1cZWq9bvAo3Ihxs_tpX8C5o']; $send_info = [ 'touser'=>$open_id, 'msgtype'=>'text', 'text'=>[ 'content'=>'SEND MSG BY OPEN ID TEST' ] ]; $postData = json_encode ($send_info,JSON_UNESCAPED_UNICODE); $postData = str_replace ("\\/","/", $postData); $access_token = $this->getAccessToken(); $res = $this->httpPost($this->SendMsgByOpenIdUrl.$access_token,$postData); $res = json_decode($res,true); echo "<pre>"; print_r($res);exit; } /** * 接入微信公众平台第一步 * 验证服务器地址的有效性 检验signature * @return bool */ private function checkSignature(){ $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = 'author_zhao'; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } /** * xml格式数据解析函数 * @param $data * @return mixed */ private function _xml_data_parse($data){ $msg = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA); return $msg; } /** * 获取access_token * 公众号的全局唯一接口调用凭据 */ public function getAccessToken(){ $info = M('we_chat')->find(); $access_token = $info['access_token']; $over_time = $info['over_time']; if(!$access_token || $over_time < time()){ $url = $this->GetAccessTokenUrl."?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret"; $json = $this->httpGet($url); $arr = json_decode($json,true); $data['id'] = $info['id']; $data['access_token'] = $arr['access_token']; $data['over_time'] = time() + 7100;//access_token的有效期目前为2个小时 M('we_chat')->save($data); return $arr['access_token']; }else{ return $access_token; } } /** * curl Get请求 * @param $url * @return mixed */ private function httpGet($url) { $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//跳过ssl检查项 $output = curl_exec($ch); if($output === FALSE ){ echo "CURL Error:".curl_error($ch); } curl_close($ch); return $output; } /** * curl POST请求 * @param $url * @param $postData * @param bool|false $raw * @return mixed */ private function httpPost($url, $postData, $raw = false) { $curl = curl_init(); curl_setopt ($curl, CURLOPT_SAFE_UPLOAD, false); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97'); // 模拟用户使用的浏览器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 curl_setopt($curl, CURLOPT_POST, 1);//post数据 if (is_array($postData) && !$raw) { // post的变量 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postData)); } else { // post的变量 curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); } $output = curl_exec($curl); curl_close($curl); return $output; } /** * 被动回复用户消息模版 * @param $msg_type * @return mixed */ private function msg_temps($msg_type){ $tpl = ''; switch($msg_type){ case 'text': $tpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; break; case 'image': $tpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Image%s</Image> <FuncFlag>0</FuncFlag> </xml>"; break; case 'voice': $tpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Voice>%s</Voice> <FuncFlag>0</FuncFlag> </xml>"; break; case 'video': $tpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Video>%s</Video> <FuncFlag>0</FuncFlag> </xml>"; break; case 'music': $tpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Music> %s</Music> <FuncFlag>0</FuncFlag> </xml>"; break; case 'news': $tpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <ArticleCount>%s</ArticleCount> <Articles>%s</Articles> <FuncFlag>0</FuncFlag> </xml>"; break; } return $tpl; } }
-
php微信公众号开发视频.txt
2020-04-15 20:52:40php微信公众号开发视频教材, 内带百度视频分享 目录: 1. 微信公众号开发JSSDK 2.微信公众号支付视频 3.微信公众平台搭建 4.微信开发宝典 5.微信小程序 内附源码 -
PHP微信公众号开发之微信红包实现方法分析
2020-10-19 12:55:22主要介绍了PHP微信公众号开发之微信红包实现方法,结合实例形式分析了php实现微信公众号红包发送功能的实现思路、步骤与具体操作技巧,需要的朋友可以参考下 -
php微信公众号开发之秒杀
2020-10-17 20:34:03主要为大家详细介绍了php微信公众号开发之秒杀功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之现金红包
2020-10-18 14:28:53主要为大家详细介绍了php微信公众号开发之现金红包,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之音乐信息
2020-10-17 20:36:45主要为大家详细介绍了php微信公众号开发之音乐信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之关键词回复
2020-10-17 20:36:18主要为大家详细介绍了php微信公众号开发之关键词回复,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之简答题
2020-10-17 20:35:41主要为大家详细介绍了php微信公众号开发之简答题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之图片回复
2020-10-17 20:32:41主要为大家详细介绍了php微信公众号开发之图片回复,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之快递查询
2020-10-17 20:36:01主要为大家详细介绍了php微信公众号开发之快递查询功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之翻页查询
2020-10-17 20:17:48主要为大家详细介绍了php微信公众号开发之翻页查询功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之微信企业付款给个人
2020-10-17 21:54:36主要为大家详细介绍了php微信公众号开发之微信企业付款给个人,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之校园图书馆
2020-10-17 20:48:53主要为大家详细介绍了php微信公众号开发之校园图书馆,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之欢迎老朋友
2020-10-17 20:36:31主要为大家详细介绍了php微信公众号开发之欢迎老朋友,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发之二级菜单
2020-10-17 20:34:19主要为大家详细介绍了php微信公众号开发之二级菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发(3)php实现简单微信文本通讯
2020-10-20 20:44:36主要介绍了php微信公众号开发第三课,php实现简单微信文本通讯,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发模式详解
2020-12-19 12:56:05微信公众号开发两种模式:编辑模式和开发模式。编辑模式比较简单,你不需要操作任何的代码,只需要借助微信提供的功能来管理自己的微信公众号。这种方式开发的页面比较简单,主要用来实现文章的推送等功能。开发者... -
php微信公众号开发常用接口封装
2019-08-01 22:56:53微信公众号开发常用接口封装,企业开发微信公众号时,经常会需要调用到微信官方的提供的接口,这里我在此封装好了这些常用的开发接口,供开发者们快速上手公众号开发,以节约开发者自己的时间,和提高开发项目的效率... -
php微信公众号开发之答题连闯三关
2020-10-17 20:18:03主要为大家详细介绍了php微信公众号开发之答题连闯三关,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php微信公众号开发(4)php实现自定义关键字回复
2020-10-20 20:45:29主要介绍了php微信公众号开发第四课,php实现简单微信文本通讯,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏数
1,808
精华内容
723