error; } public function prePay($args){ } //重新支付 public function repay($args){ } //回调逻辑处理 public function notifyPay($pay_data){ $order_no = $pay_data['out_trade_no']; $model = GroupBuyLbHelp::getPayDetail($order_no); if(empty($model)){ return false; } //已支付 if($model['pay_state']==1){ return false; } $user = UserModel::detail($model['user_id']); // Db::startTrans(); $res = $model->transaction(function () use ($model,$pay_data,$user) { $model->save([ 'pay_state'=> 1, 'pay_time' => time(), 'transaction_id'=>$pay_data['transaction_id']??'' ] ); $this->writeUserRiceCard($model); $join = GroupBuyLbJoin::where('id',$model['join_id'])->find(); $join->help_count += 1; // 拼团人数+1 $flag = false; //拼团人数够了 if($join->help_count==$join->people_count){ $flag = true; } $join->save(); if($flag){ //成功了话写真实订单 $this->ptSuccessNotify($join->id); } if($model['user_id']!=$join->user_id){ $mobile = UserModel::where("user_id",$model['user_id'])->value("mobile")??''; $content ='恭喜您参与公明腊肠拼团,成功后给您安排发货。现在您可点击成为新团长,无需支付费用即可组织拼团,成团后享受平台奖励78元现金券。'; PushLog::addSmsMon($content,$mobile,1); } }); //发放优惠 $join = GroupBuyLbJoin::where('id',$model['join_id'])->find(); if($join->status==1 && $join->user_id>0){ $this->receiveCoupon($join->user_id,$join->group_buy_lb_activity_id); } $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$model['group_buy_lb_activity_id'])->find();//拼团付款成功后加销量 if($groupgoods){ StockFactory::getFactory(OrderSourceEnum::GROUPBUYLB)->updateStockSalesExpress($groupgoods->goods_id,$model['goods_num']); } // Db::commit(); return $res; } /** * 写入米卡记录 * @param int $payType * @return false|int * @throws \Exception */ private function writeUserRiceCard($help){ if($help['rice_card_id']>0){ //写现金卡出账记录 $userRiceCard = UserRiceCardModel::find($help['rice_card_id']); UserRiceCardConsumeModel::add($userRiceCard,$help['order_no'],$help['pay_money'],$help['rice_card_money']); //如果可用余额为0并且冻结余额等于要抵扣的金额 if($userRiceCard['balance']==0 && $help['rice_card_money']==$userRiceCard['frozen_amount']){ //现金卡直接减冻结余额,并且状态改为已失效 UserRiceCardModel::setIncDecByField($help['rice_card_id'],[],['frozen_amount'=>(float)$help['rice_card_money']],['effect_state'=>2]); }else{ //现金卡直接减冻结余额 UserRiceCardModel::setDecByField($help['rice_card_id'],'frozen_amount',(float)$help['rice_card_money']); } } } //拼团领券 public function receiveCoupon($user_id,$activity_id){ $couponArray = GroupBuyLbCouponModel::where('group_buy_lb_activity_id',$activity_id)->column("coupon_id"); if(isset($couponArray)){ $param[] = ['coupon_id','in',$couponArray]; $avaiableCoupon = (new Coupon)->getCouponGroupBuyLblist($param); if(isset($avaiableCoupon)){ foreach($avaiableCoupon as $row){ $coupon_id = $row['coupon_id']; $userCoupon = new UserCoupon; $userCoupon->userreceive($coupon_id,$user_id); } } } } //拼团成功,写入订单逻辑 public function ptSuccessNotify(int $join_id){ $join = GroupBuyLbJoin::where('id',$join_id)->find(); // $help = GroupBuyHelp::where('id',$help_id)->find(); //假的订单 order_id = -1 if($join->status==0&&$join->help_count==$join->people_count){ //虚拟团不写订单,记得这个条件is_virtual_join_user=0 $helpList = GroupBuyLbHelp::where('join_id',$join_id)->where('order_id',0) ->where('fans',0) ->where('pay_state',1)->where('is_virtual_join_user',0)->select(); foreach($helpList as $help){ $order_id = $this->add($help,''); GroupBuyLbHelp::where('order_id',0)->where('id',$help['id'])->update(['order_id'=>$order_id]); } } $join->status = 1; $join->success_time = Date("Y-m-d H:i:s",time()); $join->save(); //通知 if($join->is_virtual==0){ $this->activityEnd($join->user_id,$join->id); }else{ $this->virtualActivityEnd($join->user_id,$join->id); } } //检查有没有订阅 public function checkSub($open_id,$template_id){ $key ='subscribe:open_id:'.$open_id.'template_id:'.$template_id; $rds = new Redis(config('cache.stores.redis')); $value = $rds->get($key); if($value=="1"){ return true; } return false; } //下单并发起拼团,拼团成功后发送 public function activityEnd($user_id,$join_id){ $openid = UserModel::where('user_id',$user_id)->value('open_id'); $template_id = 'M4Nw40B4Hpn4C8NkCiBDajEqz1St_CRRjGlkxDOVP1g'; $weixinToken = (new Wechat)->weixinTokenCache(); $accessToken = $weixinToken['access_token']; $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $accessToken; $data['touser']= $openid; $data['template_id'] = $template_id; $data['page'] = 'pages/activity/pages/groupShopping/groupFission/groupFission?shareId='.$join_id; $data['miniprogram_state'] = env('APP_ENV')=="production"?'formal':'trial'; $data['data']= ['thing1'=>["value"=>"拼团有礼"],'thing3'=>["value"=>'活动已结束,去看看活动结果']]; if($this->checkSub($openid,$template_id)){ post_curl($url,json_encode($data)); } $this->helpEnd($join_id); } //虚拟团,拼团成功后发送 public function virtualActivityEnd($user_id,$join_id){ $openid = UserModel::where('user_id',$user_id)->value('open_id'); $template_id = 'VG3VUaZKE4NkhSt9rn7xFhYlAjtopXACI1Y7HbIOf28'; $weixinToken = (new Wechat)->weixinTokenCache(); $accessToken = $weixinToken['access_token']; $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $accessToken; $data['touser']= $openid; $data['template_id'] = $template_id; $data['page'] = 'pages/activity/pages/groupShopping/groupFission/groupFission?shareId='.$join_id; $data['miniprogram_state'] = env('APP_ENV')=="production"?'formal':'trial'; $data['data']= ['thing2'=>["value"=>"拼团有礼"],'thing6'=>["value"=>'活动已结束,去看看活动结果']]; if($this->checkSub($openid,$template_id)){ post_curl($url,json_encode($data)); } $this->helpEnd($join_id); } //团员结束 public function helpEnd($join_id){ $user_id_arr = GroupBuyLbHelp::where("join_id",$join_id)->column('user_id'); $open_id_arr = UserModel::where("user_id",'in',$user_id_arr)->column("open_id"); $template_id = 'AgOUjZCUMRo0hwPgLrVSwztkrPys3FAq9OgL4waBaCI'; $weixinToken = (new Wechat)->weixinTokenCache(); $accessToken = $weixinToken['access_token']; $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $accessToken; $data['template_id'] = $template_id; $data['page'] = 'pages/activity/pages/groupShopping/groupFission/groupFission?shareId='.$join_id; $data['miniprogram_state'] = env('APP_ENV')=="production"?'formal':'trial'; $data['data']= ['thing1'=>["value"=>"拼团有礼"],'thing2'=>["value"=>'活动已结束,去看看活动结果']]; foreach($open_id_arr as $openid){ $data['touser']= $openid; if($this->checkSub($openid,$template_id)){ post_curl($url,json_encode($data)); } } } //测试 public function test(){ $help = GroupBuyLbHelp::where('id',100)->find(); $this->add($help,''); } /** * 新增订单记录 * @param $order * @param string $remark * @return false|int */ private function add($help, $remark = ''){ $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$help['group_buy_lb_activity_id'])->find(); $goods_id = $groupgoods->goods_id; $group_price = $groupgoods->group_price; $goodsSkuId = $groupgoods->goods_sku_id; $goodsNum = $help['goods_num']; $model = new GoodsModel; $goodsList = $model->getListByIdsFromApi([$goods_id]); // 隐藏冗余的属性 $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images'])); //返回商品处理 foreach ($goodsList as &$item) { // 商品sku信息 $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId); // 商品单价 $item['goods_price'] = $item['skuInfo']['goods_price']; // 商品购买数量 $item['total_num'] = $goodsNum; // 商品SKU索引 $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id']; // 商品购买总金额 $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum); // 获取最终拼团单价金额 $item['group_price'] = $groupgoods['group_price']; } // 订单数据 $data = [ 'user_id' => $help['user_id'], 'order_no' => $help['order_no'], 'total_price' => $goodsList[0]['total_price'],//商品原总价,不包含折扣 'order_price' => $help['order_money'],//订单优惠完金额 商品优惠完金额+运费 'pay_price' => $help['pay_money'], //微信支付金额 'delivery_type' => DeliveryTypeEnum::EXPRESS, 'pay_type' => $help['pay_money'] > 0 ? OrderPayTypeEnum::WECHAT : OrderPayTypeEnum::MICAH_EXCHANGE, 'buyer_remark' => trim($remark), 'order_source' => OrderSourceEnum::GROUPBUYLB, 'order_source_id' => $help['id'], 'groupbuy_money' => helper::bcsub($goodsList[0]['total_price'],$goodsList[0]['group_price']*$goodsNum), 'order_status' => OrderStatusEnum::NORMAL, 'store_id' => 10001, 'provider_ids' => $help['provider_ids']??0, 'distributor_total_money' => 0, 'rice_card_id' => $help['rice_card_id']??0, 'rice_card_money' => $help['rice_card_money']??0, 'rice_card_express_money' => $help['rice_card_express_money']??0, 'pay_status' => PayStatusEnum::SUCCESS, 'pay_time' => time(), 'invoice_deadline'=> time() + OrderModel::getInvoiceDeadline() * 60, 'express_price'=> $help['express_money'], 'transaction_id'=>$help['transaction_id'] ]; // 保存订单记录 $orderModel = new OrderModel; $orderModel->save($data); $order_id = $orderModel->order_id; $newGoodsList = []; foreach ($goodsList as $key=>$goods) { $total_pay_price = helper::bcsub ($help['pay_money'],$help['express_money']) > 0 ? helper::bcsub($help['pay_money'],$help['express_money']):0; $item = [ 'order_id'=>$order_id, 'user_id' => $help['user_id'], 'store_id' => 10001, 'goods_id' => $goods['goods_id'], 'goods_name' => $goods['goods_name'], 'goods_no' => $goods['goods_no'] ?: '', 'image_id' => (int)current($goods['goods_images'])['file_id'], 'deduct_stock_type' => $goods['deduct_stock_type'], 'spec_type' => $goods['spec_type'], 'goods_sku_id' => $goods['skuInfo']['goods_sku_id'], 'goods_props' => $goods['skuInfo']['goods_props'] ?: '', 'content' => $goods['content'] ?? '', 'goods_sku_no' => $goods['skuInfo']['goods_sku_no'] ?: '', 'goods_price' => $goods['skuInfo']['goods_price'], 'specs' => $goods['skuInfo']['specs'], 'supplier' => $goods['supplier'], 'line_price' => $goods['skuInfo']['line_price'], 'goods_weight' => $goods['skuInfo']['goods_weight'], 'is_user_grade' => (int)$goods['is_user_grade'], 'grade_ratio' => $goods['grade_ratio']??0, 'grade_goods_price' => $goods['grade_goods_price']??0, 'grade_total_money' => $goods['grade_total_money']??0, 'coupon_id' => $goods['coupon_id']??0, 'coupon_money' => $goods['coupon_money']??0, 'points_bonus' => $goods['points_bonus']??0, 'total_num' => $goods['total_num'], 'total_price' => $goods['total_price'], 'total_pay_price' => $total_pay_price, 'provider_id' => $goods['provider_id'], 'brand' => $goods['brand'], 'province_id' => $goods['province_id'], 'city_id' => $goods['city_id'], 'storage' => $goods['storage'], 'unit' => $goods['unit'], 'clearing_price' => $goods['skuInfo']['clearing_price']??'0.00', 'platform_rate' => $goods['skuInfo']['platform_rate']??'0.00', 'staff_user_id' => $goods['staffUserId'], 'shop_id' => $goods['shopId'], 'distributor_radio' => $goods['distributor_radio']??0, 'distributor_goods_price' => $goods['distributor_goods_price']??0, 'distributor_total_money' => $goods['distributor_total_money']??0, 'rice_card_id' => $help['rice_card_id']??0, 'goods_type' => $goods['goods_type']??10, 'shop_id'=>0, 'rice_card_money'=>$help['good_rice_card_money'] ]; $newGoodsList[] = $item; } $orderGoodModel = new OrderGoodsModel; $orderGoodModel->saveAll($newGoodsList); $address = [ 'order_id'=>$order_id, 'user_id' => $help['user_id'], 'store_id' =>10001, 'name' => $help['user_name'], 'phone' => $help['phone'], 'province_id' => $help['province_id'], 'city_id' => $help['city_id'], 'region_id' => $help['region_id'], 'detail' => $help['detail'] ]; $orderAddressModel = new OrderAddressModel; $orderAddressModel->save($address); return $order_id; } /** * 记录收货地址 * @param $address * @return false|\think\Model */ private function saveOrderAddress($address) { return $this->model->address()->save(); } }