联系官方销售客服

1835022288

028-61286886

分享经验 版主:论坛审计组
分享一个小程序授权自动注册免填会员密码绑定会员的类新手一个还
类型:迅睿CMS 更新时间:2020-10-14 14:42:18 会员

分享一个小程序授权自动注册免填会员密码绑定会员的类,新手一个,还望各位大佬指点不足

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

回帖
  • 李志杰
    #1楼    李志杰
    2020-03-23 23:51:22
    Chrome 0
    望各位懂开发的程序员解答一下微信支付类的引入方法命名空间的规范,才学这套程序准备拓展一下
  • 九天网络(JiuDay)
    #2楼    九天网络(JiuDay)
    2020-05-14 21:48:00
    Chrome 0
    这么好的教程 怎么就埋没了呢。。。 系统已经有微信支付的类了 为何还要整合呢
  • 吴启明
    #3楼    吴启明
    2020-05-14 21:55:43
    Chrome 0
    关键是不知道放在什么地方,如何使用
  • 李志杰
    #4楼    李志杰
    2020-07-03 11:34:59
    Chrome 0
    九天网络(JiuDay),是这样的,因为官方是绑定用户,必须要输入账号密码登录注册,我做的是直接获取到小程序信息时直接生成随机密码绑定会员,小程序登录的时候通过openid查询会员,不用用户输入了
  • 李志杰
    #5楼    李志杰
    2020-07-03 11:37:26
    Chrome 0
    以上实测有bug:现在已修复
    <?php


    //var_dump(json_decode(file_get_contents('php://input'),true));exit;


    //小程序类
    class Xcx extends \Phpcmf\Common
    {


    //小程序id
    public $appid;
    //小程序密钥
    public $secret;

    public $token_time=7200;//会员的缓存文件时效

    public $groupid=0;//小程序默认会员组

    public function __construct($appid,$secret,$groupid=0)
    {

    $json_result=json_decode(file_get_contents('php://input'),true);

    $this->code=isset($json_result['code'])?$json_result['code']:"";
    $this->userinfo=isset($json_result['userinfo'])?$json_result['userinfo']:"";

    $this->appid=$appid;
    $this->secret=$secret;
    $this->groupid=$groupid;
    }

    public function getOpenid(){

    //获取客户端提供的code码
    $code=trim($this->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 = $this->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_return_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(){
    //根据小程序登陆拿到的code码获取openid
    $rt=$this->getOpenid();
    if($rt['code']<1)
    {
    return dr_return_data($rt['code'],$rt['msg']);
    }

    $codeinfo=$rt['data'];
    $rt=$this->get_xcx_member($codeinfo);
    if($rt['code']<1)
    {
    return dr_return_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)));

    }


    }


    $xcx=new Xcx("wx2418808e96d07a99","c3a5bb7984952d39ac020fde565d2401");

    $return= $xcx->xcx_login();


  • 李志杰
    #6楼    李志杰
    2020-07-03 11:56:02
    Chrome 0
    吴启明,小程序端获取code码和用户头像昵称的时候直接调用接口文件这段代码生成会员并绑定,不用手动注册绑定了,每次通过openid查询快捷登录表的会员id再关联会员信息了
  • 华仔
    #7楼    华仔
    2020-07-03 13:02:04
    Chrome 0
    太厉害了
  • 菜狗
    #8楼    菜狗
    2020-07-03 17:34:26
    Chrome 0
    牛皮 静静的看着
  • 找寻知音
    #9楼    找寻知音
    2020-07-04 14:26:47
    华为手机 0
    这个好,厉害,人才
  • 流浪的乞丐
    #10楼    流浪的乞丐
    2020-09-26 20:25:45
    小米手机 0
    很实用,学习一下!!!
  • yang
    #11楼    yang
    2020-10-14 14:42:18
    Chrome 0
    大神问下,我把你这个类放在dayrui/Core/Controllers/Api这个下面了,那我小程序调的连接咋写呀,整不明白了 😅