聯系官方銷售客服
1835022288
028-61286886
分享一個小程序授權自動注冊免填會員密碼綁定會員的類,新手一個,還望各位大佬指點不足
<?php namespace Phpcmf\Controllers; //小程序類 class Xcx extends \Phpcmf\Common { //小程序id public $appid; //小程序密鑰 public $secret; public $token_time=7200;//會員的緩存文件時效 public $groupid=0;//小程序默認會員組 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時異常,微信內部錯誤'); } elseif (isset($codeinfo['errcode']) && $codeinfo['errcode']) { return dr_return_data(0, "錯誤碼:".$codeinfo['errcode'].",錯誤信息:".$code['errmsg']); } elseif (!$codeinfo['openid']) { return dr_return_data(0, 'openid獲取失敗'); } return dr_return_data(1, "ok",$codeinfo); } //根據openid獲取小程序綁定會員 public function get_xcx_member($codeinfo){ $openid=$codeinfo['openid']; //根據openid查找會員 $member=\Phpcmf\Service::M()->db->table("member_oauth")->where("oid",$openid)->get(); if($member) { $member=$member->getResultArray(); if(!empty($member)) { //如果存在 根據綁定的會員查詢會員數據 和 生成對應的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 { //如果沒有會員就注冊 $rt=$this->reg_xcx_member($codeinfo); return dr_return_data($rt['code'],$rt['msg'],$rt['data']); } } else { return dr_return_data(0,"服務器錯誤"); } } //注冊小程序會員 //第二個參數可以指定會員組id 為了后期拓展分組權限,默認無分組 public function reg_xcx_member($codeinfo){ $groupid=$this->groupid; //獲取小程序客戶端的用戶授權 $userinfo = \Phpcmf\Service::L("input")->post("userinfo"); if(empty($userinfo)) { return dr_return_data(0, '獲取用戶授權信息失敗'); } $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執行成功返回主鍵id $oauth = \Phpcmf\Service::M()->table('member_oauth')->get($oauth_id); if (!$oauth) { log_message("error","小程序用戶添加失敗",$xcx_userinfo); return dr_return_data(0, '服務端異常'); } //快捷登陸成功后注冊系統會員 //為小程序分配登陸用戶名標識 $xcx_id=(int)$oauth_id+1000000; $xcx_id=substr($xcx_id,1); $oauth['username']="xcx_".$xcx_id; $oauth['nickname'] = dr_html2emoji($oauth['nickname']); //用戶密碼暫不設置 //密碼自定義,后期調用系統接口授權碼 提供openid查詢綁定的會員密碼 md5($member['passowrd'].$member['salt']) 生成 $rt = \Phpcmf\Service::M('member')->register_oauth_bang($oauth, $groupid, [ 'username' => (string)$oauth['username'],//自定義標識 'name' => (string)$oauth['nickname'],//小程序昵稱作為會員的昵稱 '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']); } } //根據客戶端token 查詢緩存對應的數據 //可以減少用戶數據查詢 //會話的周期 //拓展接口時通過token判斷客戶端會員權限 public function user_token(){ $token = \Phpcmf\Service::L("input")->post("token"); if(empty($token)){ return dr_catcher_data(0,"請傳遞token參數"); } $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失效,請從新授權登陸"); } } //小程序登陸 //返回值:會員信息 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))); } }
官方自帶的小程序授權登陸還要綁定賬號密碼對于一般的小程序操作過于繁瑣了。。。。所以自定義了一個類放在api接口模塊下,通過模塊實例化類后調用 xcx_login自動就注冊了,也并不影響后期授權碼調用的系統接口。 順便問一下各位開發的高手能否說一下如何調用系統的微信支付類,準備在次類基礎上拓展一下小程序的支付方法,如何引入什么格式的命名空間去引入框架的微信支付類。。。。
望各位懂開發的程序員解答一下微信支付類的引入方法命名空間的規范,才學這套程序準備拓展一下
這么好的教程 怎么就埋沒了呢。。。 系統已經有微信支付的類了 為何還要整合呢
回復@九天網絡(JiuDay),是這樣的,因為官方是綁定用戶,必須要輸入賬號密碼登錄注冊,我做的是直接獲取到小程序信息時直接生成隨機密碼綁定會員,小程序登錄的時候通過openid查詢會員,不用用戶輸入了
關鍵是不知道放在什么地方,如何使用
回復@吳啟明,小程序端獲取code碼和用戶頭像昵稱的時候直接調用接口文件這段代碼生成會員并綁定,不用手動注冊綁定了,每次通過openid查詢快捷登錄表的會員id再關聯會員信息了
以上實測有bug:現在已修復
太厲害了
牛皮 靜靜的看著
這個好,厲害,人才
很實用,學習一下?。。?/p>
大神問下,我把你這個類放在dayrui/Core/Controllers/Api這個下面了,那我小程序調的連接咋寫呀,整不明白了 ??