分享一個(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
{
//如果沒(méi)有會(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)一下各位開(kāi)發(fā)的高手能否說(shuō)一下如何調(diào)用系統(tǒng)的微信支付類,準(zhǔn)備在次類基礎(chǔ)上拓展一下小程序的支付方法,如何引入什么格式的命名空間去引入框架的微信支付類。。。。
望各位懂開(kāi)發(fā)的程序員解答一下微信支付類的引入方法命名空間的規(guī)范,才學(xué)這套程序準(zhǔn)備拓展一下
這么好的教程 怎么就埋沒(méi)了呢。。。 系統(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í)一下?。。?/p>
大神問(wèn)下,我把你這個(gè)類放在dayrui/Core/Controllers/Api這個(gè)下面了,那我小程序調(diào)的連接咋寫(xiě)呀,整不明白了 ??