이 글은 주로 PHP WeChat PC QR 코드 로그인 구현 방법을 소개하며, 관심 있는 친구들은 참고할 수 있습니다.
1. 아이디어:
아이디어의 핵심은 WeChat과 소통하는 방법입니다. 클라이언트 상호 작용 측면에서 보면 현재 WeChat 로그인은 WeChat을 통해서만 가능합니다.
하지만 WeChat에는 맞춤형 QR 코드를 생성하는 특별한 방법이 있습니다. 이를 통해 QR 코드를 PC에 표시할 수 있고, QR 코드의 값은 우리가 정의할 수 있습니다. 또한 WeChat 개발 문서에는 WeChat을 사용하는 사용자를 감지하여 QR 코드를 스캔하고 값을 얻을 수 있는 스캔 이벤트가 있습니다. 사실 문제의 핵심은 바로 이 값에 있다. 이 값은 차이나유니콤 PC와 위챗 간의 통신 ID로 간주된다.
2. 구체적인 구현 과정 (아래 코드는 TP5 프레임워크를 사용하며, 서비스 계정의 공개 계정이 있다는 것이 주요 전제입니다.)
1. PC 측에서 QR 코드를 생성합니다.
코드는 다음과 같습니다.namespace app\home\controller; class Recognition extends Base{ public function seeLoginQrcode(){ $qrcode_return = model('Recognition')->getLoginQrcode(); if($qrcode_return['error_code']){ return $this->returnJson("获取失败!",0); }else{ $data=array( 'url'=>$qrcode_return['ticket'], 'qrcode_id'=>$qrcode_return['id'], ); return $this->returnJson("获取成功!",1,$data); } } }
namespace app\common\model; use think\Model; class Recognition extends Model{ protected $autoWriteTimestamp = false; //生成登录用的临时二维码 public function getLoginQrcode(){ $appid = config('THINK_SDK_WEIXIN.APP_KEY'); $appsecret = config('THINK_SDK_WEIXIN.APP_SECRET'); if(empty($appid) || empty($appsecret)){ return(array('error_code'=>true,'msg'=>'请联系管理员配置【AppId】【 AppSecret】')); } $database_login_qrcode = model('LoginQrcode'); $database_login_qrcode->where(array('add_time'=>array('lt',($_SERVER['REQUEST_TIME']-604800))))->delete(); $data_login_qrcode['add_time'] = $_SERVER['REQUEST_TIME']; $database_login_qrcode->save($data_login_qrcode); $qrcode_id = $database_login_qrcode->getLastInsID(); if(empty($qrcode_id)){ return(array('error_code'=>true,'msg'=>'获取二维码错误!无法写入数据到数据库。请重试。')); } import('Net.Http'); $http = new \Http(); //微信授权获得access_token $access_token_array = model('AccessTokenExpires')->getAccessToken(); if ($access_token_array['errcode']) { return(array('error_code'=>true,'msg'=>'获取access_token发生错误:错误代码' . $access_token_array['errcode'] .',微信返回错误信息:' . $access_token_array['errmsg'])); } $access_token = $access_token_array['access_token']; $qrcode_url='https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$access_token; $post_data['expire_seconds'] = 604800; $post_data['action_name'] = 'QR_SCENE'; $post_data['action_info']['scene']['scene_id'] = $qrcode_id; $json = $http->curlPost($qrcode_url,json_encode($post_data)); if (!$json['errcode']){ $condition_login_qrcode['id']=$qrcode_id; $data_login_qrcode['id'] = $qrcode_id; $data_login_qrcode['ticket'] = $json['ticket']; if($database_login_qrcode->isUpdate(true)->save($data_login_qrcode)){ return(array('error_code'=>false,'id'=>$qrcode_id,'ticket'=>'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.urlencode($json['ticket']))); }else{ $database_login_qrcode->where($condition_login_qrcode)->delete(); return(array('error_code'=>true,'msg'=>'获取二维码错误!保存二维码失败。请重试。')); } }else{ $condition_login_qrcode['id'] = $qrcode_id; $database_login_qrcode->where($condition_login_qrcode)->delete(); return(array('error_code'=>true,'msg'=>'发生错误:错误代码 '.$json['errcode'].',微信返回错误信息:'.$json['errmsg'])); } } }
복사 code
return(array ('error_code'=>false,'id'=>$qrcode_id,'ticket'=>'https://mp.weixin.qq.com/cgi- bin/showqrcode?ticket='.urlencode($ json['ticket'])));
QR 코드의 값을 실제로 나타내는 id 값이 있습니다!그럼 티켓은 QR코드 링크입니다. 즉, 스캔 이벤트에서 이 QR코드를 스캔하여 얻은 값이 바로 이 id입니다.
namespace app\mobile\controller; class Wechat extends Base{ public function index() { import('Wechat.Wechat'); $wechat = new \Wechat(); $data = $wechat->request(); list($content, $type) = $this->reply($data); if ($content) { $wechat->response($content, $type); } else { exit(); } } public function reply($data) { if ($data['MsgType'] == 'event') { $id = $data['EventKey']; switch (strtoupper($data['Event'])) { case 'SCAN': return $this->scan($id, $data['FromUserName']); case 'CLICK': //回复? return array('click', 'text'); break; case 'SUBSCRIBE': //关注 return array('Welcome', 'text'); break; case 'UNSUBSCRIBE': //取关 return array('BYE-BYE', 'text'); case 'LOCATION': //定位 break; } } else { if ($data['MsgType'] == 'text') { return array("测试成功!",'text'); } if ($data['MsgType'] == 'location') { } if (import('@.ORG.' . $data['MsgType'] . 'MessageReply')) { } } return false; } private function scan($id, $openid = '', $issubscribe = 0) { if ((1000000000 < $id) && $openid) { if ($user = model('Member')->field('id')->where(array('third_id' => $openid))->find()) { $data=array( 'id'=>$id, 'uid'=> $user['id'] ); model('LoginQrcode')->isUpdate()->save($data); return array('登陆成功', 'text'); } $data=array( 'id'=>$id, 'uid'=>-1 ); model('LoginQrcode')->isUpdate(true)->save($data); $return[] = array('点击授权登录', '',config('SITE_LOGO'), config('SITE_URL') . '/mobile/WechatBind/ajaxWebLogin?qrcode_id=' . $id); return array($return, 'news'); } } }
if ((1000000000 < $id ) && $openid) {
$id는 해당 QR코드의 값으로 앞서 생성한 id입니다. (실제로 Scan에서 다양한 이벤트를 구분하기 위해 의도적으로 id가 있는 login_qrcode 테이블을 증가시킵니다. ID는 1000000000부터 시작됩니다. 그런 다음 if 뒤의 처리를 살펴보세요.
if ($user = model('Member')->field('id')->where(array('third_id' => $openid))->find()) { $data=array( 'id'=>$id, 'uid'=> $user['id'] ); model('LoginQrcode')->isUpdate()->save($data); return array('登陆成功', 'text'); }
* 微信登录异步请求 * @return \think\response\Json * created by sunnier<xiaoyao_xiao@126.com> */ public function ajaxWechatLogin(){ for ($i = 0; $i < 6; $i++) { $database_login_qrcode = model('LoginQrcode'); $condition_login_qrcode['id'] = input('get.qrcode_id'); if(empty($condition_login_qrcode['id'])){ return $this->returnJson('未获取到qrcode_id!',0); } $now_qrcode = $database_login_qrcode->field('`uid`')->where($condition_login_qrcode)->find(); if (!empty($now_qrcode['uid'])) { if ($now_qrcode['uid'] == -1) { $data_login_qrcode['uid'] = 0; $database_login_qrcode->where($condition_login_qrcode)->isUpdate(true)->save($data_login_qrcode); return $this->returnJson('请在微信公众号点击授权登录!',0); } $database_login_qrcode->where($condition_login_qrcode)->delete(); $result = model('Member')->autologin('id', $now_qrcode['uid']); if (empty($result['error_code'])) { return $this->returnJson('登录成功!',1,$result['user']); } else if ($result['error_code'] == 1001) { return $this->returnJson('没有查找到用户,请重新扫描二维码!',0); } else if ($result['error_code']) { return $this->returnJson('登陆失败!',0); } } if ($i == 5) { return $this->returnJson('登陆失败',0); } sleep(3); } }
회전 훈련 과정은 이 ID를 사용하여 login_qrcode 테이블의 상태를 지속적으로 확인하는 것입니다. uid가 존재하면 로그인이 성공한 것입니다! uid를 사용하여 자동으로 로그인할 수 있습니다.
4. 위
관련 추천:
PHP 생성
WeChat QR 코드WeChat QR 코드WeChat QR의 구체적인 구현 code위 내용은 PHP를 사용하여 WeChat PC QR 코드 로그인을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!