* 优惠券接口 */ namespace app\allwin\controller\api\v4; use app\allwin\controller\api\Base; use app\allwin\model\Coupon as ModelCoupon; use app\allwin\model\CouponUser; use app\allwin\model\CouponOrder; use app\allwin\model\AllwinConfig; use app\common\model\SystemMemberForm; use app\common\facade\WechatPay; class Coupon extends Base{ /** * 读取单个优惠券信息 **/ public function getCoupon(){ $param['id'] = $this->request->param('id/d'); $param['signkey'] = $this->request->param('signkey'); $param['sign'] = $this->request->param('sign'); $rel = $this->apiSign($param); if($rel['code'] != 200){ return enjson($rel['code'],'签名验证失败'); } $condition['member_miniapp_id'] = $this->miniapp_id; $condition['id'] = $param['id']; $coupon = ModelCoupon::where($condition)->find(); if (empty($coupon)) { return enjson(204); } //判断用户已领取优惠券 $user_coupon_id = []; if ($this->user) { $ids = CouponUser::userCouponIds($this->user->id); if (!empty($ids)) { $user_coupon_id = $ids; } } $data['id'] = $coupon['id']; $data['store_id'] = $coupon['store_id']; $data['types'] = $coupon['types']; $data['name'] = $coupon['name']; $data['size'] = $coupon['size']; $data['sizes'] = round($coupon['size']); $data['price'] = $coupon['price']; $data['amount'] = $coupon['types'] ? $coupon['discount'].'折':round($coupon['price']).'元'; $data['discount'] = $coupon['discount']; $data['howmuch'] = $coupon['howmuch']; $data['img'] = $coupon['img']; $data['weekday'] = implode(',',weekdays(json_decode($coupon['weekday']))); $data['starttime'] = date('Y-m-d',$coupon['starttime']); $data['endtime'] = date('Y-m-d',$coupon['endtime']); $data['tips'] = $coupon['tips']; $data['state'] = in_array($coupon['id'],$user_coupon_id) ? 1 : 0; $data['rate'] = rate($coupon['num'],$coupon['num_of']); $data['store']['id'] = $coupon->store['id']; $data['store']['name'] = $coupon->store['name']; $data['store']['img'] = $coupon->store['img']."?x-oss-process=style/w100"; $data['store']['address'] = $coupon->store['address']; $data['store']['telphone'] = $coupon->store['telphone']; $data['store']['state_text'] = $coupon->store['state_text']; $data['store']['is_top'] = $coupon->store['is_top']; $data['store']['tips'] = $coupon->store['tips']; $data['store']['tags'] = explode(',',$coupon->store['tags']); return enjson(200,'成功',$data); } /** *优惠券列表 * @return void */ public function couponList(){ $param['cate_id'] = $this->request->param('cate_id/d',0); $param['types'] = $this->request->param('types/d',0); $param['page'] = $this->request->param('page/d',0); $param['keyword'] = $this->request->param('keyword',''); $param['sign'] = $this->request->param('sign'); $rel = $this->apiSign($param); if($rel['code'] != 200){ return enjson(403,'签名失败'); } //搜索条件 $condition = []; $condition[] = ['is_platform','=',0]; if($param['cate_id']){ $condition[] = ['cate_id','=',$param['cate_id']]; } switch ($param['types']) { case 1: $condition[] = ['is_check','=',1]; break; case 2: $condition[] = ['is_vip','=',1]; break; default: $condition[] = ['is_shop','=',1]; break; } //搜索关键字 if(!empty($param['keyword'])){ $condition[] = ["name","like","%{$param['keyword']}%"]; } $condition[] = ['member_miniapp_id','=',$this->miniapp_id]; $condition[] = ['is_lock','=',0]; $condition[] = ['is_end','=',0]; $condition[] = ['num','>',0]; $condition[] = ['endtime','>',time()]; $coupon = ModelCoupon::where($condition)->order('is_top desc,sort desc,size desc')->paginate(6); if ($coupon->isEmpty()) { return enjson(204,'没有优惠券'); } //判断用户已领取优惠券 $user_coupon_id = []; if ($this->user) { $ids = CouponUser::userCouponIds($this->user->id); if (!empty($ids)) { $user_coupon_id = $ids; } } $data = []; foreach ($coupon as $key => $value) { $data[$key]['id'] = $value['id']; $data[$key]['store_id'] = $value->store->id; $data[$key]['store'] = $value->store->name; $data[$key]['address'] = $value->store->address; $data[$key]['img'] = $value['img'].'?x-oss-process=style/w100'; $data[$key]['name'] = $value['name']; $data[$key]['size'] = $value['size']; $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']; $data[$key]['pay_price'] = $value['pay_price']; $data[$key]['theme'] = $value['theme']; $data[$key]['starttime'] = date('Y-m-d',$value['starttime']); $data[$key]['endtime'] = date('Y-m-d',$value['endtime']); $data[$key]['state'] = in_array($value['id'],$user_coupon_id) ? 1 : 0; $data[$key]['rate'] = rate($value['num'],$value['num_of']); } return enjson(200,'成功',$data); } /** * 用户发起领取优惠券 */ public function buyCoupon(){ $this->isUserAuth(); if (request()->isPost()) { $param['coupon_id'] = $this->request->param('coupon_id/d'); $param['signkey'] = $this->request->param('signkey'); $param['sign'] = $this->request->param('sign'); $rel = $this->apiSign($param); if($rel['code'] != 200){ return enjson($rel['code'],'签名验证失败'); } $param['member_miniapp_id'] = $this->miniapp_id; $validate = $this->validate($param,'Dopay.coupon'); if (true !== $validate) { return enjson(403,$validate); } //禁止重复领取 $coupon_user = CouponUser::userCouponCount($this->user->id,$param['coupon_id']); if($coupon_user){ return enjson(403,'禁止重复领取'); } //读取优惠券 $condition['member_miniapp_id'] = $this->miniapp_id; $condition['is_lock'] = 0; $condition['id'] = $param['coupon_id']; $coupon = ModelCoupon::where($condition)->find(); if (empty($coupon)) { return enjson(403,'未找到优惠券'); } if ($coupon->is_platform == 1) { return enjson(403,'这个优惠券不允许单独领取哦'); } //免费或付费领取 $state = 0; if($coupon->shop_price > 0){ $order_no = 'BUYCP'.order_no(); $payparm = [ 'name' => '付费购买优惠券['.$coupon->name.']', 'openid' => $this->user->miniapp_uid, 'miniapp_id' => $this->miniapp_id, 'order_no' => $order_no, 'total_fee' => $coupon->shop_price*100, 'notify_url' => api(4,'allwin/couponnotify/index',$this->miniapp_id), ]; //读取配置 $setting = AllwinConfig::getConfig($this->miniapp_id); if($setting->is_psp == 1){ $default_mchid = model('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 enjson(403,$ispay['msg']); } $paydata = $ispay['data']; }else{ $order_no = 'FREECP'.order_no(); $state = 1; $paydata = []; $coupon_ids = json_encode([$param['coupon_id']]); CouponUser::addUserCoupon($coupon_ids,$this->user->id); //领取优惠券入库 } //创建记录 $vipdata = []; $vipdata['state'] = $state; $vipdata['coupon_ids'] = json_encode([$param['coupon_id']]); $vipdata['order_no'] = $order_no; $vipdata['amount'] = $coupon->shop_price; $vipdata['store_id'] = $coupon->store_id; $vipdata['user_id'] = $this->user->id; $vipdata['member_miniapp_id'] = $this->miniapp_id; $vipdata['update_time'] = time(); $rel = CouponOrder::insert($vipdata); if($rel){ if($coupon->shop_price > 0){ SystemMemberForm::addForm($this->miniapp_id,$this->user->id,substr($ispay['data']['package'],10)); } return enjson(200,'成功',['pay' => $paydata,'isbuy' => $state]); }else{ return enjson(403,'领取优惠券失败'); } } } }