首先配置好网页授权域名, 事件推送只能是服务器上,本地弄不了
配好后服务器配置也要先做好, 不过一般看这篇文章的人都是已经配好了的, 怎么配置就不再说了 , 百度一下很多 , 官方文档也有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 ""; } } }
到这就结束了 , 有什么问题可以留言讨论