需求是这样的: 普通的php网站,现在需要跟微信公众号对接,用户通过关注公众号以后,会给出一个活动链接页面,这个页面就是php网站上的页面,用户点击进入页面后,页面会获取到这个微信用户的微信号,以进行活动后续的营销动作。
根据这个需求,我的思路是,
1.建立微信连接
2.创建自定义菜单(菜单中要有跳转页面的url)
3.跳转url里要把用户的微信号作为参数带上
现在遇到的问题是:已经能够 获取access token 了,但是自定义菜单始终没有作用,在接口测试这里,一直报40001的错误,但是检测appid和appsecret都是对的,到这里就卡住了。求高人指点!
代码如下:
require_once wx.php; //这个页面是微信api里的示例代码define(appid, wxbxxxxxxx);//定义appid define(appsecret, 86bfxxxxxxxxxxxxx);//定义appsecret $wechatobj = new wechat();//实例化微信类 $creatmenu = $wechatobj->creatmenu();//创建菜单 class wechat { private function getaccesstoken() //获取access_token { $url = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=.appid.&secret=.appsecret; $data = getcurl($url);//通过自定义函数getcurl得到https的内容 $resultarr = json_decode($data, true);//转为数组 echo $resultarr[access_token]; echo '
'; echo $resultarr[expires_in]; return $resultarr[access_token];//获取access_token } public function creatmenu()//创建菜单 { $accesstoken = $this->getaccesstoken();//获取access_token $menupoststring = '{ button:[ { name:产品介绍, sub_button:[ { type:view, name:a, url:http://www.xxxx.com/fenxiaob/jianjie/soft.html } ] }, { name:申请试用, sub_button:[ { type:click, name:地接批发, key:dj } ] }, { name:在线, sub_button:[ { type:view, name:公司新闻, url:http://www.xxxxx.com/news/company/ }, ] } ] }'; $menuposturl = https://api.weixin.qq.com/cgi-bin/menu/create?access_token=.$accesstoken;//post的url $menu = datapost($menupoststring, $menuposturl);//将菜单结构体post给微信服务器 } } function getcurl($url){//get https的内容 $ch = curl_init(); curl_setopt($ch, curlopt_url,$url); curl_setopt($ch, curlopt_returntransfer,1);//不输出内容 curl_setopt($ch, curlopt_ssl_verifypeer, false); curl_setopt($ch, curlopt_ssl_verifyhost, false); $result = curl_exec($ch); curl_close ($ch); return $result; } function datapost($post_string, $url) {//post方式提交数据 $context = array ('http' => array ('method' => post, 'header' => user-agent: mozilla/5.0 (windows; u; windows nt 6.0; en-us) \r\n accept: */*, 'content' => $post_string ) ); $stream_context = stream_context_create ( $context ); $data = file_get_contents ( $url, false, $stream_context ); return $data; }
回复讨论(解决方案) 我记得4001只是一个错误类,还要看具体的错误信息。把详细的错误信息贴出来看看。
不出意外的话,我猜测是你没有菜单的接口权限,具体可以到公众号后台的开发者处接口权限列表里查看
参考: http://doc.okbase.net/demon_311/archive/55555.html
token和access_token原来是不同的概念,token是在微信后台选择开发模式的时候填写的,而access_token则是通过接口调用生成的。调用的语句是:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appsecret
token和access_token原来是不同的概念,token是在微信后台选择开发模式的时候填写的,而access_token则是通过接口调用生成的。调用的语句是:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appsecret
token和access_token不同,这个我知道的,而且现在代码里也是有单独获取access_token的函数了
private function getaccesstoken() //获取access_token { $url = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=.appid.&secret=.appsecret; $data = getcurl($url);//通过自定义函数getcurl得到https的内容 $resultarr = json_decode($data, true);//转为数组 echo $resultarr[access_token]; echo '
'; echo $resultarr[expires_in]; return $resultarr[access_token];//获取access_token }
晕,原来自定义菜单的代码是正确的,只不过生效要过一天以后才能看到,我还一直以为是自己哪里没做对
不需要一天的时间的,一个小时就可以了,你关闭公众号,关闭微信或退出微信,一个小时内查看,菜单就好了。
现在是另外的问题了:
通过自定义菜单,用户跳转到网站的活动页面参与抽奖,如果获取用户的微信号?
我现在实现的方式是这样:
在活动页面的js代码里,增加窗体加载时间,用ajax调用一个页面,页面的作用是调用微信获取code接口,并绑定回调的页面路径
代码如下:
但是在callback.php中,并没有执行测试的数据添加,那就意味着回调绑定不成功,不知道是哪里出的问题???
这样的方式可行么?或者有没有更好的方法来实现这个目的?
解决了,用http://xiaohuang.cc/post/437.html这个帖子上的方法就行了