| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- <?php
- /**
- * Created by PhpStorm.
- * User: wniu
- * Date: 2021/11/5
- * Time: 10:17 上午
- */
- namespace common\logic\notify;
- use addons\AllinTax\common\service\PayService;
- use addons\Recharge\common\models\AddonsRechargeActive;
- use addons\Recharge\common\models\AddonsRechargeLog;
- use common\enums\AddonsEnum;
- use common\enums\AssetsType;
- use common\enums\PayTypeEnum;
- use common\enums\RefundStatusEnum;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\events\order\RechargeOrderPaidEvent;
- use common\helpers\LockHelper;
- use common\models\census\CensusMallSingleMonth;
- use common\models\common\PaymentTrade;
- use common\models\common\PaymentTradeOrder;
- use common\models\common\RechargeOrders;
- use common\models\mall\MallAddons;
- use common\models\order\OrderRefund;
- use common\models\statistics\UserStatisticsTotal;
- use common\listeners\user\UserUpgradeListener;
- use common\models\user\User;
- use common\traits\ErrorTrait;
- use Exception;
- use services\common\UserWalletService;
- class RechargeNotify
- {
- const LOCK = 'update_user_recharge_order_status';
- use ErrorTrait;
- public function notify($order_info): bool
- {
- $lock_key = self::LOCK . $order_info['order_no'];
- $identification = uniqid();
- try {
- //加锁
- $res = LockHelper::lock($lock_key, $identification, 100, 100);
- if (!$res) throw new \PHPUnit\Util\Exception('获取锁失败');
- $order = RechargeOrders::findOne(['order_no' => $order_info['order_no']]);
- $order->pay_type = $order_info['pay_type'];
- $order->is_pay = $order_info['is_pay'];
- $order->pay_at = $order_info['updated_at'];
- if (!$order->save()) {
- throw new Exception(RechargeOrders::getStaticError());
- }
- // 增加充值统计数据
- \Yii::$app->services->statistics->user->set($order->mall_id, $order->user_id, ['recharge_money' => $order->pay_price]);
- UserStatisticsTotal::setUserStatisticsTotal($order->mall_id, $order->user_id, ['recharge_money' => $order->pay_price]);
- $desc = '余额充值';
- $money = bcadd($order->pay_price, $order->give_money, 2);
- if ($order_info['is_pay'] == RechargeOrders::IS_PAY) {
- $data = ['message_id' => 0, 'mall_id' => $order->mall_id, 'user_id' => $order->user_id,
- 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
- 'is_frozen' => false, 'unfrozen' => false, 'money' => abs($money),
- 'desc' => $desc, 'source_table' => AssetsType::RECHARGE_FRONT, 'source_table_id' => $order->id,
- 'from_type' => UserWalletEnum::RECHARGE,
- 'capital_type' => UserWalletEnum::USER_RECHARGE
- ];
- UserWalletService::handle(0, $data);
- //给上级赠送
- if (!empty(\Qiniu\json_decode($order->recharge_give_up_info))) {
- $parent_id = User::getUser([['id' => $order->user_id]], 'parent_id');
- if ($parent_id->parent_id > 0) {
- RechargeOrders::doGiveUp(0, $order->recharge_give_up_info, $parent_id->parent_id, $order, '下级', false);
- }
- }
- //充值插件充值活动
- if (\Yii::$app->services->addons->findByName(AddonsEnum::ADDONS_NAME_RECHARGE)) {
- //以下充值活动赠送:当多个进行中的活动时赠送失败
- /**
- $active = new AddonsRechargeActive();
- $now_active = $active->getNowActive($order->mall_id);
- if ($now_active) {
- if ($now_active['give_cond'] == 1) {//累计充值
- $now_price = RechargeOrders::getDateNum($now_active['start_at'], $order->user_id);
- } else {
- $now_price = $order->pay_price;
- }
- $now_price = number_format($now_price, 2);
- $num_list = [];
- foreach ($now_active['give_info'] as $key) {
- $num_list[number_format($key['num'], 2)] = $key['data'];
- }
- if (isset($num_list[$now_price])) {
- RechargeOrders::doGiveUp($now_active['id'], $num_list[$now_price], $order->user_id, $order);
- }
- }
- */
- $this->rechargeActive($order);
- }
- //满足充值条件升级
- $listener = new UserUpgradeListener();
- $order_by = 'level desc';
- $listener->conditionUpgrade($order->mall_id, $order->user_id, $order->id, $order_by);
- }
- //unlock
- LockHelper::uLock($lock_key, $identification);
- $this->mallSingleMonth($order->mall_id,$order->pay_price);
- if($order->is_pay==1){
- $data = [];
- $event = new RechargeOrderPaidEvent($order['mall_id']);
- $data['id'] = $order['id'];
- \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
- }
- self::signalAgentPay($order);
- return true;
- } catch (Exception $e) {
- echo $e->getMessage().$e->getFile().$e->getLine();
- LockHelper::uLock($lock_key, $identification);
- $this->setStaticError($e->getMessage());
- return false;
- }
- }
- public function mallSingleMonth($mall_id,$recharge_money){
- $data = ['total_recharge_money' => $recharge_money];
- CensusMallSingleMonth::setSingleMonthCache($mall_id, 'total_recharge_money', $data, 'total_recharge_money');
- }
- /**
- * 充值活动赠送
- * @param $order
- * @return bool
- */
- public function rechargeActive($order)
- {
- $active = new AddonsRechargeActive();
- $now_active_list = $active->getNowActiveList($order->mall_id);
- $send = false;
- foreach ($now_active_list as $one_active) {
- $num_list = [];
- foreach ($one_active['give_info'] as $key) {
- if ($one_active['give_cond'] == 1) {
- $num_list[$key['num']] = $key['data'];
- } else {
- $num_list[number_format($key['num'], 2)] = $key['data'];
- }
- }
- if ($one_active['give_cond'] == 1) {
- //累计充值
- $now_price = RechargeOrders::getDateNum($one_active['start_at'], $order->user_id);
- $all_nums = array_keys($num_list);
- $all_nums[] = $now_price;
- sort($all_nums);
- $now_key = array_search($now_price, $all_nums);
- $now_key = $now_key - 1;
- if ($now_key >= 0) {
- $num_list_key = $all_nums[$now_key];
- //活动是累计充值:判断用户是否领取过活动下 该赠送选项的
- $check = AddonsRechargeLog::findOne(['user_id' => $order->user_id,'recharge_active_id' => $one_active['id'],'give_condition' => $num_list_key]);
- if($check) continue;
- //满足赠送条件
- RechargeOrders::doGiveUp($one_active['id'], $num_list[$num_list_key], $order->user_id, $order,'',true,$num_list_key);
- $send = true;
- break;
- }
- } else {
- $now_price = number_format($order->pay_price, 2);
- if (isset($num_list[$now_price])) {
- RechargeOrders::doGiveUp($one_active['id'], $num_list[$now_price], $order->user_id, $order);
- $send = true;
- break;
- }
- }
- }
- if(!$send) \Yii::error('订单号'.$order->order_no.' 不满足充值活动赠送');
- return true;
- }
- public static function uploadShippingInfo($params){
- try {
- if(empty($params['id'])) throw new Exception("id:不存在");
- $order_model = RechargeOrders::findOne(['id' => $params['id']]);
- $mall_id = $order_model['mall_id'];
- $payment_trade_order_model = \common\models\common\PaymentTradeOrder::findOne(['order_no'=>$order_model['order_no'],'is_pay'=>1]);
- if(empty($payment_trade_order_model)) throw new Exception("order_no:".$order_model['order_no'].",payment_trade_order_model不存在");
- $pay_type = [\common\enums\PayTypeEnum::WECHAT];
- $trade_type = ['JSAPI'];
- $payment_trade_model = \common\models\common\PaymentTrade::findOne(['id'=>$payment_trade_order_model['trade_id'],'pay_type'=>$pay_type,'trade_type'=>$trade_type]);
- if(empty($payment_trade_model)) throw new Exception("trade_id:".$payment_trade_order_model['trade_id'].",payment_trade_model不存在");
- switch ($payment_trade_model['pay_type']){
- case 1:
- //微信支付
- $delivery_mode = 1;
- $user_info_model = \common\models\user\UserInfo::findOne(['mall_id'=>$mall_id,'user_id'=>$order_model['user_id'],'platform'=>'mp-wx', 'status' => StatusEnum::ENABLED]);
- $user_model = User::findOne(['mall_id'=>$mall_id,'id'=>$order_model['user_id'], 'status' => StatusEnum::ENABLED]);
- if(empty($user_info_model))throw new Exception("user_id,mp-wx:".$order_model['user_id'].",user_info_model不存在");
- $openid = $user_info_model['openid'];
- // $logistics_type = 1;//物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
- $params['mall_id'] = $mall_id;
- $params['openid'] = $openid;
- $params['third_trade_no'] = $payment_trade_model['third_trade_no'];
- $params['delivery_mode'] = $delivery_mode;
- $params['logistics_type'] = 3;
- $params['receiver_contact'] = substr_replace($user_model['mobile'], '****', 3, 4);
- $params['item_desc'] = '余额充值';
- \common\logic\wechat\WechatMiniProgramLogic::uploadShippingInfoWechat($params);
- break;
- }
- return true;
- }catch (\Exception $e){
- var_dump('RechargeNotify:uploadShippingInfo:'.$e->getMessage());
- return true;
- }
- }
- public static function signalAgentPay($order)
- {
- try {
- if (!MallAddons::isInstall($order['mall_id'], 'AllinTax')) return true;
- $model = PaymentTradeOrder::findOne(['order_no' => $order['order_no'], 'is_pay' => 1, 'pay_type' => PayTypeEnum::ALLIN_TAX_PAY]);
- if (empty($model)) return true;
- $trade = PaymentTrade::findOne(['id' => $model->trade_id]);
- if (empty($trade)) return true;
- PayService::signalAgentPay($order['mall_id'], $trade['out_trade_no']);
- } catch (\Exception $e) {
- var_dump($order['order_no'] . ':signalAgentPay:' . $e->getMessage());
- }
- }
- }
|