123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <?php
- /**
- * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
- * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
- * @author pillar<ltmn@qq.com>
- * 优惠券接口
- */
- 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,'领取优惠券失败');
- }
- }
- }
- }
|