名字:iwebshop微信小程序 V2.0
说明:小程序登录、注册、支付等,兼容支持原生小程序和web-view组件;
兼容性:适用于iwebshop 4.7以上所有版本
安装过程
- 安装时向
payment数据表,添加微信小程序支付参数; - 安装时创建
plugins/payments/pay_mini_wechat/mini_wechat.php,微信小程序支付类; 
插件开启
全局增加插件类:wechatMini,其他地方可以判断:
if(class_exists('wechatMini',false)){
    return true;
}else{
    return false;
}注册的拦截器:
拦截方式
提供header头和_skey参数两种拦截方式,关键拦截代码:
public function reg()
{
    //全局登陆拦截
    plugin::reg("onBeforeCreateAction",$this,'miniProgam');
    //小程序web-view内挂载sdk
    plugin::reg("onFinishView@simple@login",$this,"miniProgramEnv");
    if(IClient::isMini()){
        plugin::reg("onFinishView",$this,"onShareUrl");
    }
    //小程序登陆接口
    plugin::reg("onBeforeCreateAction@simple@wxlogin",function(){ $this->WxLogin(); });
}
/**
 * @作用:拦截小程序登陆参数,用户数据初始化给控制器(原生小程序、web-view皆可)
 * @说明:提供header头和_skey参数两种拦截方式
 */
public function miniProgam(){
    $controller = self::controller();
    $skey = IFilter::act(IReq::get('_skey')); //小程序网页内携带过来的参数
    if(empty($skey)){
        //原生小程序header头
        $header = self::getHeader();
        if( isset($header['miniprogram-token']) && $header['miniprogram-token'] ){
            $skey = $header['miniprogram-token'];
        }else{
            return;
        }
    }else{
        //web-view内嵌网页
        ISession::set('_from','miniProgram');   //设置小程序环境,兼容官方IClient::isMini(),用以挂载sdk,在小程序网页内登陆和支付。
        if($skey =='miniProgram'){
            plugin::trigger('clearUser');   //登陆过期,清理用户登陆状态(用以处理,客户端cookie与服务器登陆不同步,造成的session内openid不存在 支付失败)
            return;
        }
    }
    //取缓存内登陆数据
    $data = self::getSkey($skey);
    if(isset($data['session_key']) && $data['session_key'] && isset($data['openid']) && $data['openid']){
        $unId = $data['openid'];  //openid 用户唯一标识
        if( isset($data['unionid']) && $data['unionid'] ){
            //用户在开放平台的唯一标识符,在满足UnionID下发条件的情况下会返回 [注意字母大小写]
            $unId = $data['unionid'];
        }
        self::setOpenId($unId);     //设置openid用于小程序web-view网页内支付
        if(isset($data['login']) && $data['login']){
            ###此skey已经登录过,加入登陆凭证有效校验,防止凭证泄露引发的问题
            ###return;
        }else{
            $data['login'] = 1;       //设置此skey已经登录标志
            self::setSkey($skey,$data,604800);      //skey凭证有效期秒,过期需重新登录
        }
        $userRow = self::login($unId);
        if(isset($userRow['id']) && isset($userRow['username']) && $userRow['id'] && $userRow['username']){
            $controller->user = $userRow;  //【小程序 唯一登陆点】
        }
    }else{
        plugin::trigger('clearUser');   //登陆过期,清理用户登陆状态(用以处理,客户端cookie与服务器登陆不同步,造成的session内openid不存在 支付失败)
    }
}支持的登陆方式
- code静默登陆(用户无感知)
 - 自定义登录态静默登陆(用户无感知)
 - 用户授权登陆(弹出窗口需用户授权)
 
插件下载
小程序下载
版权属于:爱语飞飞Blog
本文链接:https://www.iyuu.cn/archives/60/
转载时须注明出处
