首先配置好网页授权域名, 事件推送只能是服务器上,本地弄不了
配好后服务器配置也要先做好, 不过一般看这篇文章的人都是已经配好了的, 怎么配置就不再说了 , 百度一下很多 , 官方文档也有dome
配置好服务器配置就在服务器配置的地址里面获取事件推送消息 , 事件推送我们是被动接收的;
好了, 开始我们正式的业务代码吧
第一步 生成带参数的临时二维码 , 参数为用户ID
// 生成带参数的临时二维码
public function qrCode()
{
// 获取你的access_token并拼接在路径上
$url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' . WeChatLogic::getAccessToken();
// 定义请求参数
$data = [
'expire_seconds' => 86400, // 过期时间
'action_name' => 'QR_SCENE', //参数类型,官网都有介绍,不多重复
'action_info' => [ // 参数值
'scene_id' => USER_ID // 你们自己的用户ID, 参数带在这里, 注意这是个int类型的
]
];
$createQrcode = Curl::post($url, json_encode($data)); // 请求微信接口
// 请求回来的数据里面有ticket , 拼接到下面这个路径上浏览器打开就是个二维码
$createQrcode->src = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=";
$this->success($createQrcode);
return false;
}第二步, 用户扫码,我们接收时间推送
public function reponseMsg()
{
//1.获取到微信推送过来post数据(xml格式) , 接收的方式根据框架不同,都有些不一样,具体需要你们看自己的框架文档
$xml = $this->request()->getBody()->__toString();
//2.处理消息类型,并设置回复类型和内容
$postObj = simplexml_load_string($xml);//转化成对象
// 事件推送, MsgType有很多个类型, 我这里只写了event 事件推送, 官方文档有介绍
if (strtolower($postObj->MsgType) == "event"){
$openid = strtolower($postObj->FromUserName); // openid
$adminId = strtolower($postObj->EventKey); // 这个是我们二维码参数的值, 也就是生成临时二维码我们定义的scene_id值
if (empty($adminId)){
return "";
}
// 如果是没有关注会多一个qrscene_前缀, 不过我的业务逻辑不太关心这个, 所以我直接做了替换处理
$adminId = strpos($adminId,'qrscene_') !== false ? str_replace('qrscene_', '', $adminId) : $adminId;
if (!$userInfo = AdminModel::create()->get(['id' => $adminId])) { // 获取用户信息
return "";
}
// 根据推送事件做相应的处理, 按照你们自己业务逻辑来, 我是只用于openid绑定用户ID,所以业务简单
switch(strtolower($postObj->Event)){
// 已关注公众号 通过扫码进来的
case 'scan':
// 没有关注,第一次关注的
case "subscribe" :
if (!empty($userInfo->official_openid)){
return "";
}
$userInfo->official_openid = $openid;
$userInfo->update();
return "";
//取消关注
case "unsubscribe" :
$userInfo->official_openid = "";
$userInfo->update();
return "";
default:
return "";
}
}
}到这就结束了 , 有什么问题可以留言讨论
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号