* 会员接口
*/
namespace app\allwin\controller\api\v4;
use app\allwin\controller\api\Base;
use app\allwin\model\VipCard;
use app\allwin\model\AllwinUser;
use app\allwin\model\Vip as AllwinVip;
use app\allwin\model\AllwinConfig;
use app\allwin\model\MchId;
use app\allwin\model\CouponUser;
use app\allwin\model\Bank;
use app\allwin\model\Levels;
use app\allwin\model\Coupon;
use app\common\facade\WechatPay;
use app\allwin\widget\Vip as VipIncome;
class Vip extends Base{
/**
* 初始化当前应用管理员是不是联盟城市账户
* @return void
*/
public function initialize() {
parent::initialize();
$this->isUserAuth();
}
/**
* 判断是否VIP和是否允许升级
*/
public function isVip(){
$param['signkey'] = $this->request->param('signkey');
$param['sign'] = $this->request->param('sign');
$rel = $this->apiSign($param);
if($rel['code'] != 200){
return enjson($rel['code'],'签名验证失败');
}
$data = ['isvip' => 0,'is_up' => 1,'icard' => [],'card' => []];
$vipuser = AllwinVip::with(['vipcard'=> function($query) {
$query->field('id,coupon_num,is_up,price,name,tips,rule');
}])->where(['user_id' => $this->user->id,'state' => 1,'is_lock' => 0])->field('is_up,vipcard_id')->find();
$condition = [];
$condition[] = ['member_miniapp_id','=',$this->miniapp_id];
if($vipuser){
$bank = Bank::where(['user_id' => $this->user->id])->field('income_money')->find(); //收益
$store = AllwinUser::where(['uid' => $this->user->id])->find(); //所属店铺
$data['isvip'] = 1;
$data['is_up'] = $vipuser->vipcard->is_up;
$data['icard'] = $vipuser->vipcard;
$data['icard']['title'] = empty($store->store) ? $this->miniapp->appname.'会员' : $store->store->name.'会员';
$data['icard']['store_id'] = empty($store->store)?0:$store->store_id;
$data['icard']['income_money'] = empty($bank) ? 0 : round($bank->income_money/100);
$data['icard']['rule'] = str_replace('
vipcard->rule));
$condition[] = ['id','<>',$vipuser->vipcard_id];
}
$data['card'] = VipCard::where($condition)->field('id,coupon_num,is_up,price,name,tips,rule')->order('sort desc,id desc')->find();
if(empty($data['card'])){
$data['card'] = [];
}else{
$data['card']['rule'] = str_replace('
$this->user->id,'level' => [1,2]])->count();
}else{
$data['num'] = AllwinVip::where(['state' => 1,'is_lock' => 0,'member_miniapp_id'=>$this->miniapp_id])->count();
}
if(empty($data['icard']) && empty($data['card'])){
return enjson(204,'没有开通会员服务');
}
return enjson(200,'成功',$data);
}
/**
* 开通会员中心
* @return boolean
*/
public function payment(){
if (request()->isPost()) {
$param = [
'vipcard' => $this->request->param('vipcard/d'),
'ucode' => $this->request->param('ucode/s',''),
'signkey' => $this->request->param('signkey'),
'sign' => $this->request->param('sign'),
];
$rel = $this->apiSign($param);
if($rel['code'] != 200){
return enjson(403,'签名验证失败');
}
$card_id = $param['vipcard'];
$vipcard = VipCard::where(['id' => $card_id])->field('id,price,is_up,name,coupon_ids')->find();
if(empty($vipcard)){
return enjson(403,'未找到要开通的会员类型');
}
$is_vip = AllwinVip::where(['id' => $vipcard->id,'state' => 1])->count();
if($is_vip){
return enjson(403,'你已经是会员');
}
//判断并读取邀请用户的所属店铺ID
$store_id = 0;
$ucode = de_code(strtoupper($param['ucode']));
if($ucode){
$vipuser = AllwinUser::where(['uid' => $ucode])->find();
if($vipuser){
if($this->miniapp_id != $vipuser->user->member_miniapp_id){
return enjson(403,'邀请用户填写不正确');
}
$store_id = $vipuser['store_id'];
}
}
//数据
$coupon_ids = explode(',',$vipcard->coupon_ids);
$order_no = 'VIP'.order_no();
$vipdata = [];
$vipdata['state'] = $vipcard->price <= 0 ? 1 : 0;
$vipdata['is_lock'] = 0;
$vipdata['coupon_ids'] = empty($coupon_ids)? '[]' : json_encode($coupon_ids);
$vipdata['order_no'] = $order_no;
$vipdata['amount'] = $vipcard->price;
$vipdata['is_up'] = $vipcard->is_up;
$vipdata['vipcard_id'] = $vipcard->id;
$vipdata['store_id'] = $store_id; //邀请参数的店铺ID
$vipdata['from_ucode'] = $param['ucode'];//邀请人的邀请码
$vipdata['user_id'] = $this->user->id;
$vipdata['member_miniapp_id'] = $this->miniapp_id;
$vipdata['update_time'] = time();
//判断帐号
$rel = AllwinVip::where(['member_miniapp_id'=>$this->miniapp_id,'user_id' => $this->user->id,'state' => 0])->find();
if($rel){
AllwinVip::where(['id' => $rel->id])->update($vipdata);
$vip_id = $rel->id;
}else{
$allwinVip = AllwinVip::create($vipdata);
$vip_id = $allwinVip->id;
}
//如果免费
if($vipcard->price <= 0){
//增加邀请关系
if(!empty($ucode)){
VipIncome::addLevel($this->user->id,$ucode,$store_id);
}
//更新VIP状态
AllwinVip::where([['user_id','=',$this->user->id],['state','=','1'],['id','<>',$vip_id]])->update(['is_lock' => 1]);
//赠送优惠券
CouponUser::addUserCoupon($vipdata['coupon_ids'],$this->user->id);
//统计优惠综合
$coupon_aumont = Coupon::where(['id' => $coupon_ids])->sum('size');
return enjson(200,'成功加入会员',['isvip' => 1,'coupon_aumont'=> $coupon_aumont]);
}else{
$payparm = [
'openid' => $this->user->miniapp_uid,
'miniapp_id' => $this->miniapp_id,
'order_no' => $order_no,
'total_fee' => $vipcard->price*100,
'name' => '开通'.$vipcard->name,
'notify_url' => api(4,'allwin/vipnotify/index',$this->miniapp_id),
];
//读取配置
$setting = AllwinConfig::getConfig($this->miniapp_id);
if($setting->is_psp == 1){
$default_mchid = MchId::getMch(0,$this->miniapp_id); //默认收款账户
if (empty($default_mchid)) {
return enjson(403,'未找到收款账号');
}
$payparm['mchid'] = $default_mchid->mchid;
}
$ispay = WechatPay::orderPay($payparm);
if($ispay['code'] == 0){
return json(['code'=>403,'msg'=>$ispay['msg']]);
}
return enjson(200,'开始付款',['isvip' => 0,'pay' => $ispay['data']]);
}
}
}
/**
* 读取会员专属优惠券
*/
public function coupon(){
$param['vipid'] = $this->request->param('vipid/d');
$param['page'] = $this->request->param('page/d',0);
$param['sign'] = $this->request->param('sign');
$rel = $this->apiSign($param);
if($rel['code'] != 200){
return enjson(403,'签名失败');
}
$vipuser = VipCard::where(['id' => $param['vipid']])->field('coupon_ids')->find();
if (empty($vipuser)) {
return enjson(204,'没有优惠券');
}
$condition[] = ['id','in',$vipuser->coupon_ids];
$condition[] = ['is_lock','=',0];
$condition[] = ['is_end','=',0];
$condition[] = ['num','>',0];
$condition[] = ['endtime','>',time()];
$coupon = Coupon::where($condition)->field('id,name,size,tips,discount,price,types')->order('is_top desc,sort desc,size desc')->paginate(6);
if ($coupon->isEmpty()) {
return enjson(204,'没有优惠券');
}
$data = [];
foreach ($coupon as $key => $value) {
$data[$key]['id'] = $value['id'];
$data[$key]['name'] = $value['name'];
$data[$key]['amount'] = round($value['size']);
$data[$key]['tips'] = $value['tips'];
$data[$key]['types'] = $value['types'];
$data[$key]['price'] = $value['types'] ? $value['discount'].'折':$value['price'];
}
return enjson(200,'成功',$data);
}
}