分享一个小程序授权自动注册免填会员密码绑定会员的类,新手一个,还望各位大佬指点不足
<?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自动就注册了,也并不影响后期授权码调用的系统接口。 顺便问一下各位开发的高手能否说一下如何调用系统的微信支付类,准备在次类基础上拓展一下小程序的支付方法,如何引入什么格式的命名空间去引入框架的微信支付类。。。。