php网站能否跟微信公众号对接

pzzc18 2016-01-01 01:00:28
需求是这样的: 普通的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 '<br>';
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;
}
...全文
1590 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pzzc18 2016-01-03
  • 打赏
  • 举报
回复
现在是另外的问题了: 通过自定义菜单,用户跳转到网站的活动页面参与抽奖,如果获取用户的微信号? 我现在实现的方式是这样: 在活动页面的js代码里,增加窗体加载时间,用ajax调用一个页面,页面的作用是调用微信获取code接口,并绑定回调的页面路径 代码如下:

<?php 
//require_once "../qp/conn.php";
if(isset($_SESSION['user'])){ 
	print_r($_SESSION['user']);
	exit;
}
//mysql_query("insert into test(str)values('进入getcodeurl')",$conn); //这里是做一个数据添加的测试,表示ajax调用代码正确
$APPID='xxxxxxx';
$REDIRECT_URI='http://www.xxxxxx.cn/callback.php';
$scope='snsapi_base';
$state = '123';
$url='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$APPID.'&redirect_uri='.urlencode($REDIRECT_URI).'&response_type=code&scope='.$scope.'&state='.$state.'#wechat_redirect';
header("Location:".$url);
?>
但是在callback.php中,并没有执行测试的数据添加,那就意味着回调绑定不成功,不知道是哪里出的问题???

<?php
require_once "qp/conn.php";
$appid = "xxxxxxxxx"; 
$secret = "xxxxxxxxxxxxxxxxxxxxxx"; 
$code = $_GET["code"]; 
$get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code';
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$get_token_url); 
curl_setopt($ch,CURLOPT_HEADER,0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
$res = curl_exec($ch); 
curl_close($ch); 
$json_obj = json_decode($res,true); 
//根据openid和access_token查询用户信息 
$access_token = $json_obj['access_token']; 
$openid = $json_obj['openid']; 
$get_user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN'; 

$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL,$get_user_info_url); 
curl_setopt($ch,CURLOPT_HEADER,0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
$res = curl_exec($ch); 
curl_close($ch); 

//解析json 
$user_obj = json_decode($res,true); 
$_SESSION['user'] = $user_obj; 
mysql_query("insert into test(str)values('callback:nickname=".$user_obj['nickname']."')",$conn);//这里这个sql操作是没有执行的
print_r($user_obj); 
?>
这样的方式可行么?或者有没有更好的方法来实现这个目的?
bear63 2016-01-03
  • 打赏
  • 举报
回复
不需要一天的时间的,一个小时就可以了,你关闭公众号,关闭微信或退出微信,一个小时内查看,菜单就好了。
pzzc18 2016-01-03
  • 打赏
  • 举报
回复
晕,原来自定义菜单的代码是正确的,只不过生效要过一天以后才能看到,我还一直以为是自己哪里没做对
pzzc18 2016-01-03
  • 打赏
  • 举报
回复
引用 3 楼 fdipzone 的回复:
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 '<br>';
    echo $resultArr["expires_in"];
    return $resultArr["access_token"];//获取access_token  
}
pzzc18 2016-01-03
  • 打赏
  • 举报
回复
解决了,用http://xiaohuang.cc/post/437.html这个帖子上的方法就行了
傲雪星枫 2016-01-02
  • 打赏
  • 举报
回复
token和access_token原来是不同的概念,token是在微信后台选择开发模式的时候填写的,而access_token则是通过接口调用生成的。调用的语句是: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
傲雪星枫 2016-01-02
  • 打赏
  • 举报
回复
李睿_Lee 2016-01-01
  • 打赏
  • 举报
回复
我记得4001只是一个错误类,还要看具体的错误信息。把详细的错误信息贴出来看看。 不出意外的话,我猜测是你没有菜单的接口权限,具体可以到公众号后台的开发者处接口权限列表里查看

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧