123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- <?php
- namespace App\Http\Controllers;
- use App\Events\HelpOrderEvent;
- use App\Events\NewOrder;
- use App\Events\RetailOutboundEvent;
- use App\Models\Amount;
- use App\Models\DwbsUser;
- use App\Models\Goods;
- use App\Models\GoodSku;
- use App\Models\IntegralW;
- use App\Models\Order;
- use App\Models\OrderW;
- use App\Models\OrderDetailW;
- use App\Models\StoreGoods;
- use App\Models\StoreGoodsSku;
- use App\Models\InventoryW;
- use App\Models\Store;
- use App\Models\User;
- use App\Models\UserW;
- use App\Models\VipLogW;
- use App\Models\ZbsOrder;
- use EasyWeChat\Factory;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Auth;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- class PaymentController extends Controller
- {
- public function pay(Request $request)
- {
- $order_no=$request->input('order_no');
- $order=OrderW::where('order_no',$order_no)->first();
- if(empty($order)){
- return $this->error('450001','订单有误');
- }
- if($order->apply_cancel == 2){
- return $this->error('450001','订单已取消');
- }
- if($order->is_pay != 0 || $order->status != 0){
- return $this->error('450001','订单状态有误');
- }
- if($order->account <= 0){
- return $this->error('450001','支付金额有误');
- }
- $openid=User::where('id',Auth::user()->id)->value('openid');
- $options = $this->options($order->store_id);
- $payment = Factory::payment($options);
- $jssdk = $payment->jssdk;
- Log::info(round($order->account/1000,2));
- Log::info(round($order->account/10));
- $attributes = [
- 'trade_type' => 'JSAPI', // 支付方式,小程序支付使用JSAPI
- 'body' => '订单支付', // 订单说明
- 'out_trade_no' => mt_rand('1000','9999').'_'.$order_no, // 自定义订单号
- 'total_fee' => $order->account*100, // 单位:分
- 'openid' => $openid, // 当前用户的openId
- 'profit_sharing' => 'Y'
- ];
- $result = $payment->order->unify($attributes);
- if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
- $prepayId = $result['prepay_id'];
- $config = $jssdk->sdkConfig($prepayId);
- return response()->json([
- 'error_code'=>200,
- 'msg'=>'成功',
- 'data'=>$config
- ]);
- }
- if ($result['return_code'] == 'FAIL' && array_key_exists('return_msg', $result)) {
- Log::info('订单支付失败:'.$order->user_id.'/'.$order_no.'/'.$order->money.'/'.$result['return_msg']);
- return response()->json([
- 'error_code'=>401,
- 'msg'=> $result['return_msg'],
- ]);
- }
- Log::info('订单支付失败:'.$order->user_id.'/'.$order_no.'/'.$order->money.'/'.$result['err_code_des']);
- return response()->json([
- 'error_code'=>401,
- 'msg'=> $result['err_code_des'],
- ]);
- }
- protected function options($id){
- return [
- 'app_id' => config('wechat.payment.default.app_id'),
- 'mch_id' => config('wechat.payment.default.mch_id'),
- 'sub_mch_id' => Store::where('id',$id)->value('sub_mchid'),
- 'key' => config('wechat.payment.default.key'),
- 'notify_url' => url('api/payment/notify')
- ];
- }
- public function notify(Request $request)
- {
- Log::info('支付完成开始微信回调');
- $options = [
- 'app_id' => config('wechat.payment.default.app_id'),
- 'mch_id' => config('wechat.payment.default.mch_id'),
- 'key' => config('wechat.payment.default.key'),
- 'notify_url' => url('api/payment/notify')
- ];
- $payment = Factory::payment($options);
- $response = $payment->handlePaidNotify(function ($message, $fail)
- {
- // 根据返回的订单号查询订单数据
- Log::error($message);
- $rand_no=explode('_',$message['out_trade_no'])[0];
- $message['out_trade_no']=explode('_',$message['out_trade_no'])[1];
- $order=OrderW::where('order_no',$message['out_trade_no'])->first();
- if ($order->is_pay==1){
- Log::info('订单号为:'.$message['out_trade_no'].'已经支付');
- return true;
- }
- if (!$order || $order->status == 1) {
- Log::info('订单不存在:'.$message['out_trade_no'].'/'.$message['transaction_id'].'/'.$message['result_code']);
- return true;//订单不存在 或者 订单已支付
- }
- if ($message['result_code'] === 'FAIL') { //支付失败
- Log::warning('[wechat-pay]:' . json_encode($message, true));
- return true;
- }
- if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
- // 支付成功后的业务逻辑
- if($message['result_code'] === 'SUCCESS') {
- $total_fee=round($message['total_fee']/100,2);
- DB::connection('mysql_w')->transaction(function()use($order,$message,$total_fee,$rand_no){
- //修改订单状态
- $order->status = 1;
- $order->is_help = 1;
- $order->is_pay = 1;
- $order->pay_type = 1;
- $order->pay_money = $total_fee;
- $order->rand_no = $rand_no;
- $order->pay_open_id = $message['openid'];
- $order->self_pay = 1;
- $order->wechat_pay_no = $message['transaction_id'];
- $order->pay_at = $message['time_end'];
- $order->save();
- //学分变更
- $integral=$order->total*5;
- $inte=IntegralW::where('order_no',$order->order_no)->where('store_id',$order->store_id)->where('type',1)->first();
- if(empty($inte)){
- IntegralW::create([
- 'store_id'=>$order->store_id,
- 'order_no'=>$order->order_no,
- 'num'=>$order->total,
- 'integral'=>$integral,
- 'integral_double'=>$integral,
- 'type'=>1,
- 'remark'=>'下单成功',
- ]);
- }
- //店铺信息
- Log::info($message['out_trade_no']);
- Log::info($total_fee);
- $store=Store::where('id',$order->store_id)->lockForUpdate()->first();
- $start_money= $store->pending_amount;
- $store->pending_amount += $total_fee;
- $store->integral += $integral;
- $store->save();
- //规格销量
- $details=OrderDetailW::where('order_no',$order->order_no)->get();
- foreach($details as $key=>$val){
- $where=[];
- $where['goods_id']=$val->goods_id;
- $where['size']=$val->size;
- $where['type']=$val->type;
- $sku=StoreGoodsSku::where($where)->lockForUpdate()->first();
- $sku->sale_num += $val->num;
- $sku->save();
- //商品销量
- $goods=StoreGoods::where('id',$val->goods_id)->lockForUpdate()->first();
- $goods->sale_num += $val->num;
- $goods->save();
- //减微店代理库存
- $arr_test=Store::getTest();
- if(in_array($order->store_id,$arr_test)){ //判断是不是减库存代理
- Log::info('【'.$store->name.'的店铺-'.$goods->main_attr.'-'.$val->type.'-'.$val->size);
- $storeInventory=InventoryW::where(['store_id'=>$order->store_id,'goods_id'=>$val->goods_id,'sku_id'=>$val->sku_id])->lockForUpdate()->first();
- $storeInve_num=!empty($storeInventory)?$storeInventory->num:0;
- if($val->num > $storeInve_num){
- Log::info('【'.$store->name.'的店铺-'.$goods->main_attr.'-'.$val->type.'-'.$val->size.'】库存不足');
- }
- Log::info($val->num .'---'. $storeInve_num);
- $storeInventory->num-=$val->num;
- $storeInventory->save();
- }
- }
- //用户vip变更
- $vipLog=VipLogW::where('user_id',$order->user_id)
- ->where('store_id',$order->store_id)->first();
- if(empty($vipLog) && $order->total>=2){
- VipLogW::create([
- 'user_id'=>$order->user_id,
- 'store_id'=>$store->id,
- 'order_no'=>$message['out_trade_no'],
- 'type'=>2,//购买两套,添加vip
- 'remark'=>'购买自动添加vip'
- ]);
- OrderW::where('order_no',$message['out_trade_no'])->update([
- 'vip'=>1
- ]);
- }
- //支付日志
- Amount::create([
- 'user_id' => $order->user_id,
- 'store_id' => $order->store_id,
- 'order_no' => $message['out_trade_no'],
- 'transaction_id'=> $message['transaction_id'],
- 'money' => $total_fee,
- 'type' => 1, //支付
- 'status' => 1, //成功
- 'service_fee' => 0,
- 'start_money' => $start_money,
- 'end_money' => $store->pending_amount,
- 'start_amount' => $store->available_amount,//支付前可用金额
- 'end_amount' => $store->available_amount,//支付后可用金额
- 'remark' => '收款',
- ]);
- },5);
- //减库存
- DB::connection('mysql')->transaction(function()use($order) {
- event(new RetailOutboundEvent($order->order_no));
- },5);
- //算争霸赛学分
- ZbsOrder::create([
- 'order_id'=>$order->id,
- 'status'=>0,
- 'is_cancel'=>0,
- ]);
- //代下单通知客户
- $user=UserW::where('id',$order->user_id)->first();
- $agent_id=Store::where('id',$order->store_id)->value('user_id');
- $agent = User::where('id',$agent_id)->first();
- if($user->openId){
- $data['openid']=$user->openId;
- $data['data']=[
- 'first' =>'代理【'.$agent->nickname .'】已帮您下单成功,请及时查看订单',
- 'keyword1' => $order->order_no,
- 'keyword2' => number_format($order->account, 2),
- 'keyword3' => $order->op_name,
- 'keyword4' => $agent->mobile,
- 'remark' => '点击链接进入系统,查看详情',
- ];
- event(new HelpOrderEvent($data));
- }
- //代下单通知代理
- //新订单通知
- // $store=Store::where('id',$order->store_id)->first();
- // $user=User::where('id',$store->user_id)->first();
- if($agent->openid){
- $data['openid']=$agent->openid;
- $data['data']=[
- 'first' => '您有新的客户订单,请及时处理',
- 'keyword1' => $user->nickname,
- 'keyword2' => number_format($order->account, 2),
- 'keyword3' => $order->order_no,
- 'keyword4' => $order->created_at
- ];
- event(new NewOrder($data));
- }
- }
- return true;
- }else{
- Log::info('通信失败');
- return $fail('通信失败,请稍后再通知我');
- }
- });
- return $response;
- }
- public function GetPay(){
- // 根据返回的订单号查询订单数据
- // $message=['appid' => 'wx5224793b7dc7f7b7',
- // 'bank_type' => 'OTHERS',
- // 'cash_fee' => '153700',
- // 'fee_type' => 'CNY',
- // 'is_subscribe' => 'Y',
- // 'mch_id' => '1603992271',
- // 'nonce_str' => '60628be3521c8',
- // 'openid' => 'ogTajwF_jHXaMTNcXLy1zT_XW-VU',
- // 'out_trade_no' => '2657_DX21033010243392320927494',
- // 'result_code' => 'SUCCESS',
- // 'return_code' => 'SUCCESS',
- // 'sign' => '8CC558CED364CB2384F188EBEF5D3255',
- // 'sub_mch_id' => '1607799110',
- // 'time_end' => '20210330102440',
- // 'total_fee' => '153700',
- // 'trade_type' => 'JSAPI',
- // 'transaction_id' => '4200000896202103308732225144',];
- // Log::error($message);
- Log::error('主动回调');
- $rand_no=explode('_',$message['out_trade_no'])[0];
- $message['out_trade_no']=explode('_',$message['out_trade_no'])[1];
- $order=OrderW::where('order_no',$message['out_trade_no'])->first();
- if (!$order || $order->status == 1) {
- Log::info('订单不存在:'.$message['out_trade_no'].'/'.$message['transaction_id'].'/'.$message['result_code']);
- return true;//订单不存在 或者 订单已支付
- }
- if ($message['result_code'] === 'FAIL') { //支付失败
- Log::warning('[wechat-pay]:' . json_encode($message, true));
- return true;
- }
- if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
- // 支付成功后的业务逻辑
- if($message['result_code'] === 'SUCCESS') {
- $total_fee=round($message['total_fee']/100,2);
- DB::connection('mysql_w')->transaction(function()use($order,$message,$total_fee,$rand_no){
- //修改订单状态
- $order->status = 1;
- $order->is_pay = 1;
- $order->pay_type = 1;
- $order->pay_money = $total_fee;
- $order->rand_no = $rand_no;
- $order->pay_open_id = $message['openid'];
- $order->self_pay = 1;
- $order->wechat_pay_no = $message['transaction_id'];
- $order->pay_at = $message['time_end'];
- $order->save();
- //店铺信息
- $store=Store::where('id',$order->store_id)->lockForUpdate()->first();
- $start_money= $store->pending_amount;
- Log::error($store->pending_amount);
- Log::error($total_fee);
- $store->pending_amount += $total_fee;
- $store->save();
- //规格销量
- $details=OrderDetailW::where('order_no',$order->order_no)->get();
- foreach($details as $key=>$val){
- $where=[];
- $where['goods_id']=$val->goods_id;
- $where['size']=$val->size;
- $where['type']=$val->type;
- $sku=StoreGoodsSku::where($where)->lockForUpdate()->first();
- $sku->sale_num += $val->num;
- $sku->save();
- //商品销量
- $goods=StoreGoods::where('id',$val->goods_id)->lockForUpdate()->first();
- $goods->sale_num += $val->num;
- $goods->save();
- }
- //用户vip变更
- $vipLog=VipLogW::where('user_id',$order->user_id)
- ->where('store_id',$order->store_id)->first();
- /*张奇新增**/
- UserW::where('id',$order->user_id)->update(['is_vip'=>1]);
- if(empty($vipLog) && $order->total>=2){
- VipLogW::create([
- 'user_id'=>$order->user_id,
- 'store_id'=>$store->id,
- 'order_no'=>$message['out_trade_no']
- ]);
- OrderW::where('order_no',$message['out_trade_no'])->update([
- 'vip'=>1
- ]);
- }
- //支付日志
- Amount::create([
- 'user_id' => $order->user_id,
- 'store_id' => $order->store_id,
- 'order_no' => $message['out_trade_no'],
- 'transaction_id'=> $message['transaction_id'],
- 'money' => $total_fee,
- 'type' => 1, //支付
- 'status' => 1, //成功
- 'service_fee' => 0,
- 'start_money' => $start_money,
- 'end_money' => $store->pending_amount,
- 'start_amount' => $store->available_amount,//支付前可用金额
- 'end_amount' => $store->available_amount,//支付后可用金额
- 'remark' => '收款',
- ]);
- },5);
- //减库存
- DB::connection('mysql')->transaction(function()use($order) {
- event(new RetailOutboundEvent($order->order_no));
- },5);
- //代下单通知客户
- $user=UserW::where('id',$order->user_id)->first();
- $agent_id=Store::where('id',$order->store_id)->value('user_id');
- $agent = User::where('id',$agent_id)->first();
- if($user->openId){
- $data['openid']=$user->openId;
- $data['data']=[
- 'first' =>'代理【'.$agent->nickname .'】已帮您下单成功,请及时查看订单',
- 'keyword1' => $order->order_no,
- 'keyword2' => number_format($order->account, 2),
- 'keyword3' => $order->op_name,
- 'keyword4' => $agent->mobile,
- 'remark' => '点击链接进入系统,查看详情',
- ];
- event(new HelpOrderEvent($data));
- }
- //代下单通知代理
- //新订单通知
- // $store=Store::where('id',$order->store_id)->first();
- // $user=User::where('id',$store->user_id)->first();
- if($agent->openid){
- $data['openid']=$agent->openid;
- $data['data']=[
- 'first' => '您有新的客户订单,请及时处理',
- 'keyword1' => $user->nickname,
- 'keyword2' => number_format($order->account, 2),
- 'keyword3' => $order->order_no,
- 'keyword4' => $order->created_at
- ];
- event(new NewOrder($data));
- }
- }
- return true;
- }
- }
- }
|