聯(lián)系官方銷售客服
1835022288
028-61286886
分享一個(gè)小程序授權(quán)自動(dòng)注冊(cè)免填會(huì)員密碼綁定會(huì)員的類,新手一個(gè),還望各位大佬指點(diǎn)不足
<?php namespace Phpcmf\Controllers; //小程序類 class Xcx extends \Phpcmf\Common { //小程序id public $appid; //小程序密鑰 public $secret; public $token_time=7200;//會(huì)員的緩存文件時(shí)效 public $groupid=0;//小程序默認(rèn)會(huì)員組 public function __construct($appid,$secret,$groupid=0) { $this->appid=$appid; $this->secret=$secret; $this->groupid=$groupid; } public function getOpenid(){ //獲取客戶端提供的code碼 $code=\Phpcmf\Service::L("input")->post("code"); if(empty($code)) { return dr_return_data(0, '登陸code碼獲取失敗'); } $appid=$this->appid; $secret=$this->secret; $url="https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$secret."&js_code=".$code."&grant_type=authorization_code"; $codeinfo= json_decode(dr_catcher_data($url), true); if (!$codeinfo) { return dr_return_data(0, '獲取session_key及openID時(shí)異常,微信內(nèi)部錯(cuò)誤'); } elseif (isset($codeinfo['errcode']) && $codeinfo['errcode']) { return dr_return_data(0, "錯(cuò)誤碼:".$codeinfo['errcode'].",錯(cuò)誤信息:".$code['errmsg']); } elseif (!$codeinfo['openid']) { return dr_return_data(0, 'openid獲取失敗'); } return dr_return_data(1, "ok",$codeinfo); } //根據(jù)openid獲取小程序綁定會(huì)員 public function get_xcx_member($codeinfo){ $openid=$codeinfo['openid']; //根據(jù)openid查找會(huì)員 $member=\Phpcmf\Service::M()->db->table("member_oauth")->where("oid",$openid)->get(); if($member) { $member=$member->getResultArray(); if(!empty($member)) { //如果存在 根據(jù)綁定的會(huì)員查詢會(huì)員數(shù)據(jù) 和 生成對(duì)應(yīng)的token 返回客戶端 并生成緩存 $uid=$member[0]['uid']; $member=\Phpcmf\Service::M("member")->get_member($uid); $token=$this->token(); \Phpcmf\Service::L('cache')->set_data($token, $member,$this->token_time); $member['token']=$token; return dr_return_data(1,"ok",$member); } else { //如果沒有會(huì)員就注冊(cè) $rt=$this->reg_xcx_member($codeinfo); return dr_return_data($rt['code'],$rt['msg'],$rt['data']); } } else { return dr_return_data(0,"服務(wù)器錯(cuò)誤"); } } //注冊(cè)小程序會(huì)員 //第二個(gè)參數(shù)可以指定會(huì)員組id 為了后期拓展分組權(quán)限,默認(rèn)無(wú)分組 public function reg_xcx_member($codeinfo){ $groupid=$this->groupid; //獲取小程序客戶端的用戶授權(quán) $userinfo = \Phpcmf\Service::L("input")->post("userinfo"); if(empty($userinfo)) { return dr_return_data(0, '獲取用戶授權(quán)信息失敗'); } $userinfo=json_decode($userinfo, true); $xcx_userinfo=[ 'oid' => $codeinfo['openid'], 'oauth' => 'wxxcx', 'avatar' => $userinfo['avatarUrl'], 'unionid' => (string)$userinfo['unionid'], 'nickname' => dr_emoji2html($userinfo['nickName']), 'expire_at' => SYS_TIME, 'access_token' => $codeinfo['session_key'], 'refresh_token' => '', ]; $rt = \Phpcmf\Service::M('member')->insert_oauth(0, 'login',$xcx_userinfo); if (!$rt['code']) { return dr_return_data(0, $rt['msg']); } $oauth_id=$rt['code'];//sql執(zhí)行成功返回主鍵id $oauth = \Phpcmf\Service::M()->table('member_oauth')->get($oauth_id); if (!$oauth) { log_message("error","小程序用戶添加失敗",$xcx_userinfo); return dr_return_data(0, '服務(wù)端異常'); } //快捷登陸成功后注冊(cè)系統(tǒng)會(huì)員 //為小程序分配登陸用戶名標(biāo)識(shí) $xcx_id=(int)$oauth_id+1000000; $xcx_id=substr($xcx_id,1); $oauth['username']="xcx_".$xcx_id; $oauth['nickname'] = dr_html2emoji($oauth['nickname']); //用戶密碼暫不設(shè)置 //密碼自定義,后期調(diào)用系統(tǒng)接口授權(quán)碼 提供openid查詢綁定的會(huì)員密碼 md5($member['passowrd'].$member['salt']) 生成 $rt = \Phpcmf\Service::M('member')->register_oauth_bang($oauth, $groupid, [ 'username' => (string)$oauth['username'],//自定義標(biāo)識(shí) 'name' => (string)$oauth['nickname'],//小程序昵稱作為會(huì)員的昵稱 'password' => dr_safe_password($this->rand_password(6)), ]); if ($rt['code']) { $token=$this->token(); //將用戶信息放在緩存里 減少查詢 $uid=$rt['data']['member']['uid']; $member=\Phpcmf\Service::M("member")->get_member($uid); \Phpcmf\Service::L('cache')->set_data($token, $member,$this->token_time); $member['token']=$token; return dr_return_data(1, 'ok', $member); } else { return dr_return_data(0, $rt['msg']); } } //根據(jù)客戶端token 查詢緩存對(duì)應(yīng)的數(shù)據(jù) //可以減少用戶數(shù)據(jù)查詢 //會(huì)話的周期 //拓展接口時(shí)通過(guò)token判斷客戶端會(huì)員權(quán)限 public function user_token(){ $token = \Phpcmf\Service::L("input")->post("token"); if(empty($token)){ return dr_catcher_data(0,"請(qǐng)傳遞token參數(shù)"); } $token_data=\Phpcmf\Service::L('cache')->get_data($token); if(empty($token_data)) { return dr_return_data(1,"OK",$token_data); } else { return dr_return_data(0,"token失效,請(qǐng)從新授權(quán)登陸"); } } //小程序登陸 //返回值:會(huì)員信息 public function xcx_login(){ $rt=$this->getOpenid(); if($rt['code']<1) { return dr_catcher_data($rt['code'],$rt['msg']); } $codeinfo=$rt['data']; $rt=$this->get_xcx_member($codeinfo); if($rt['code']<1) { return dr_catcher_data($rt['code'],$rt['msg']); } $rt['data']['auth']=md5($rt['data']['password'].$rt['data']['salt']); return dr_return_data(1, 'ok', $rt['data']); } public function rand_password($length){ $str = null; $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; $max = strlen($strPol) - 1; for ($i = 0; $i < $length; $i++) { $str .= $strPol[rand(0, $max)]; } return $str; } //返回給小程序通信憑證 public function token(){ return sha1(md5(uniqid(md5(microtime(true)),true))); } }
官方自帶的小程序授權(quán)登陸還要綁定賬號(hào)密碼對(duì)于一般的小程序操作過(guò)于繁瑣了。。。。所以自定義了一個(gè)類放在api接口模塊下,通過(guò)模塊實(shí)例化類后調(diào)用 xcx_login自動(dòng)就注冊(cè)了,也并不影響后期授權(quán)碼調(diào)用的系統(tǒng)接口。 順便問(wèn)一下各位開發(fā)的高手能否說(shuō)一下如何調(diào)用系統(tǒng)的微信支付類,準(zhǔn)備在次類基礎(chǔ)上拓展一下小程序的支付方法,如何引入什么格式的命名空間去引入框架的微信支付類。。。。
望各位懂開發(fā)的程序員解答一下微信支付類的引入方法命名空間的規(guī)范,才學(xué)這套程序準(zhǔn)備拓展一下
這么好的教程 怎么就埋沒了呢。。。 系統(tǒng)已經(jīng)有微信支付的類了 為何還要整合呢
回復(fù)@九天網(wǎng)絡(luò)(JiuDay),是這樣的,因?yàn)楣俜绞墙壎ㄓ脩?,必須要輸入賬號(hào)密碼登錄注冊(cè),我做的是直接獲取到小程序信息時(shí)直接生成隨機(jī)密碼綁定會(huì)員,小程序登錄的時(shí)候通過(guò)openid查詢會(huì)員,不用用戶輸入了
關(guān)鍵是不知道放在什么地方,如何使用
回復(fù)@吳啟明,小程序端獲取code碼和用戶頭像昵稱的時(shí)候直接調(diào)用接口文件這段代碼生成會(huì)員并綁定,不用手動(dòng)注冊(cè)綁定了,每次通過(guò)openid查詢快捷登錄表的會(huì)員id再關(guān)聯(lián)會(huì)員信息了
以上實(shí)測(cè)有bug:現(xiàn)在已修復(fù)
太厲害了
牛皮 靜靜的看著
這個(gè)好,厲害,人才
很實(shí)用,學(xué)習(xí)一下?。?!
大神問(wèn)下,我把你這個(gè)類放在dayrui/Core/Controllers/Api這個(gè)下面了,那我小程序調(diào)的連接咋寫呀,整不明白了 ??