RechargeNotify.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: wniu
  5. * Date: 2021/11/5
  6. * Time: 10:17 上午
  7. */
  8. namespace common\logic\notify;
  9. use addons\AllinTax\common\service\PayService;
  10. use addons\Recharge\common\models\AddonsRechargeActive;
  11. use addons\Recharge\common\models\AddonsRechargeLog;
  12. use common\enums\AddonsEnum;
  13. use common\enums\AssetsType;
  14. use common\enums\PayTypeEnum;
  15. use common\enums\RefundStatusEnum;
  16. use common\enums\StatusEnum;
  17. use common\enums\UserWalletEnum;
  18. use common\events\order\RechargeOrderPaidEvent;
  19. use common\helpers\LockHelper;
  20. use common\models\census\CensusMallSingleMonth;
  21. use common\models\common\PaymentTrade;
  22. use common\models\common\PaymentTradeOrder;
  23. use common\models\common\RechargeOrders;
  24. use common\models\mall\MallAddons;
  25. use common\models\order\OrderRefund;
  26. use common\models\statistics\UserStatisticsTotal;
  27. use common\listeners\user\UserUpgradeListener;
  28. use common\models\user\User;
  29. use common\traits\ErrorTrait;
  30. use Exception;
  31. use services\common\UserWalletService;
  32. class RechargeNotify
  33. {
  34. const LOCK = 'update_user_recharge_order_status';
  35. use ErrorTrait;
  36. public function notify($order_info): bool
  37. {
  38. $lock_key = self::LOCK . $order_info['order_no'];
  39. $identification = uniqid();
  40. try {
  41. //加锁
  42. $res = LockHelper::lock($lock_key, $identification, 100, 100);
  43. if (!$res) throw new \PHPUnit\Util\Exception('获取锁失败');
  44. $order = RechargeOrders::findOne(['order_no' => $order_info['order_no']]);
  45. $order->pay_type = $order_info['pay_type'];
  46. $order->is_pay = $order_info['is_pay'];
  47. $order->pay_at = $order_info['updated_at'];
  48. if (!$order->save()) {
  49. throw new Exception(RechargeOrders::getStaticError());
  50. }
  51. // 增加充值统计数据
  52. \Yii::$app->services->statistics->user->set($order->mall_id, $order->user_id, ['recharge_money' => $order->pay_price]);
  53. UserStatisticsTotal::setUserStatisticsTotal($order->mall_id, $order->user_id, ['recharge_money' => $order->pay_price]);
  54. $desc = '余额充值';
  55. $money = bcadd($order->pay_price, $order->give_money, 2);
  56. if ($order_info['is_pay'] == RechargeOrders::IS_PAY) {
  57. $data = ['message_id' => 0, 'mall_id' => $order->mall_id, 'user_id' => $order->user_id,
  58. 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
  59. 'is_frozen' => false, 'unfrozen' => false, 'money' => abs($money),
  60. 'desc' => $desc, 'source_table' => AssetsType::RECHARGE_FRONT, 'source_table_id' => $order->id,
  61. 'from_type' => UserWalletEnum::RECHARGE,
  62. 'capital_type' => UserWalletEnum::USER_RECHARGE
  63. ];
  64. UserWalletService::handle(0, $data);
  65. //给上级赠送
  66. if (!empty(\Qiniu\json_decode($order->recharge_give_up_info))) {
  67. $parent_id = User::getUser([['id' => $order->user_id]], 'parent_id');
  68. if ($parent_id->parent_id > 0) {
  69. RechargeOrders::doGiveUp(0, $order->recharge_give_up_info, $parent_id->parent_id, $order, '下级', false);
  70. }
  71. }
  72. //充值插件充值活动
  73. if (\Yii::$app->services->addons->findByName(AddonsEnum::ADDONS_NAME_RECHARGE)) {
  74. //以下充值活动赠送:当多个进行中的活动时赠送失败
  75. /**
  76. $active = new AddonsRechargeActive();
  77. $now_active = $active->getNowActive($order->mall_id);
  78. if ($now_active) {
  79. if ($now_active['give_cond'] == 1) {//累计充值
  80. $now_price = RechargeOrders::getDateNum($now_active['start_at'], $order->user_id);
  81. } else {
  82. $now_price = $order->pay_price;
  83. }
  84. $now_price = number_format($now_price, 2);
  85. $num_list = [];
  86. foreach ($now_active['give_info'] as $key) {
  87. $num_list[number_format($key['num'], 2)] = $key['data'];
  88. }
  89. if (isset($num_list[$now_price])) {
  90. RechargeOrders::doGiveUp($now_active['id'], $num_list[$now_price], $order->user_id, $order);
  91. }
  92. }
  93. */
  94. $this->rechargeActive($order);
  95. }
  96. //满足充值条件升级
  97. $listener = new UserUpgradeListener();
  98. $order_by = 'level desc';
  99. $listener->conditionUpgrade($order->mall_id, $order->user_id, $order->id, $order_by);
  100. }
  101. //unlock
  102. LockHelper::uLock($lock_key, $identification);
  103. $this->mallSingleMonth($order->mall_id,$order->pay_price);
  104. if($order->is_pay==1){
  105. $data = [];
  106. $event = new RechargeOrderPaidEvent($order['mall_id']);
  107. $data['id'] = $order['id'];
  108. \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  109. }
  110. self::signalAgentPay($order);
  111. return true;
  112. } catch (Exception $e) {
  113. echo $e->getMessage().$e->getFile().$e->getLine();
  114. LockHelper::uLock($lock_key, $identification);
  115. $this->setStaticError($e->getMessage());
  116. return false;
  117. }
  118. }
  119. public function mallSingleMonth($mall_id,$recharge_money){
  120. $data = ['total_recharge_money' => $recharge_money];
  121. CensusMallSingleMonth::setSingleMonthCache($mall_id, 'total_recharge_money', $data, 'total_recharge_money');
  122. }
  123. /**
  124. * 充值活动赠送
  125. * @param $order
  126. * @return bool
  127. */
  128. public function rechargeActive($order)
  129. {
  130. $active = new AddonsRechargeActive();
  131. $now_active_list = $active->getNowActiveList($order->mall_id);
  132. $send = false;
  133. foreach ($now_active_list as $one_active) {
  134. $num_list = [];
  135. foreach ($one_active['give_info'] as $key) {
  136. if ($one_active['give_cond'] == 1) {
  137. $num_list[$key['num']] = $key['data'];
  138. } else {
  139. $num_list[number_format($key['num'], 2)] = $key['data'];
  140. }
  141. }
  142. if ($one_active['give_cond'] == 1) {
  143. //累计充值
  144. $now_price = RechargeOrders::getDateNum($one_active['start_at'], $order->user_id);
  145. $all_nums = array_keys($num_list);
  146. $all_nums[] = $now_price;
  147. sort($all_nums);
  148. $now_key = array_search($now_price, $all_nums);
  149. $now_key = $now_key - 1;
  150. if ($now_key >= 0) {
  151. $num_list_key = $all_nums[$now_key];
  152. //活动是累计充值:判断用户是否领取过活动下 该赠送选项的
  153. $check = AddonsRechargeLog::findOne(['user_id' => $order->user_id,'recharge_active_id' => $one_active['id'],'give_condition' => $num_list_key]);
  154. if($check) continue;
  155. //满足赠送条件
  156. RechargeOrders::doGiveUp($one_active['id'], $num_list[$num_list_key], $order->user_id, $order,'',true,$num_list_key);
  157. $send = true;
  158. break;
  159. }
  160. } else {
  161. $now_price = number_format($order->pay_price, 2);
  162. if (isset($num_list[$now_price])) {
  163. RechargeOrders::doGiveUp($one_active['id'], $num_list[$now_price], $order->user_id, $order);
  164. $send = true;
  165. break;
  166. }
  167. }
  168. }
  169. if(!$send) \Yii::error('订单号'.$order->order_no.' 不满足充值活动赠送');
  170. return true;
  171. }
  172. public static function uploadShippingInfo($params){
  173. try {
  174. if(empty($params['id'])) throw new Exception("id:不存在");
  175. $order_model = RechargeOrders::findOne(['id' => $params['id']]);
  176. $mall_id = $order_model['mall_id'];
  177. $payment_trade_order_model = \common\models\common\PaymentTradeOrder::findOne(['order_no'=>$order_model['order_no'],'is_pay'=>1]);
  178. if(empty($payment_trade_order_model)) throw new Exception("order_no:".$order_model['order_no'].",payment_trade_order_model不存在");
  179. $pay_type = [\common\enums\PayTypeEnum::WECHAT];
  180. $trade_type = ['JSAPI'];
  181. $payment_trade_model = \common\models\common\PaymentTrade::findOne(['id'=>$payment_trade_order_model['trade_id'],'pay_type'=>$pay_type,'trade_type'=>$trade_type]);
  182. if(empty($payment_trade_model)) throw new Exception("trade_id:".$payment_trade_order_model['trade_id'].",payment_trade_model不存在");
  183. switch ($payment_trade_model['pay_type']){
  184. case 1:
  185. //微信支付
  186. $delivery_mode = 1;
  187. $user_info_model = \common\models\user\UserInfo::findOne(['mall_id'=>$mall_id,'user_id'=>$order_model['user_id'],'platform'=>'mp-wx', 'status' => StatusEnum::ENABLED]);
  188. $user_model = User::findOne(['mall_id'=>$mall_id,'id'=>$order_model['user_id'], 'status' => StatusEnum::ENABLED]);
  189. if(empty($user_info_model))throw new Exception("user_id,mp-wx:".$order_model['user_id'].",user_info_model不存在");
  190. $openid = $user_info_model['openid'];
  191. // $logistics_type = 1;//物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
  192. $params['mall_id'] = $mall_id;
  193. $params['openid'] = $openid;
  194. $params['third_trade_no'] = $payment_trade_model['third_trade_no'];
  195. $params['delivery_mode'] = $delivery_mode;
  196. $params['logistics_type'] = 3;
  197. $params['receiver_contact'] = substr_replace($user_model['mobile'], '****', 3, 4);
  198. $params['item_desc'] = '余额充值';
  199. \common\logic\wechat\WechatMiniProgramLogic::uploadShippingInfoWechat($params);
  200. break;
  201. }
  202. return true;
  203. }catch (\Exception $e){
  204. var_dump('RechargeNotify:uploadShippingInfo:'.$e->getMessage());
  205. return true;
  206. }
  207. }
  208. public static function signalAgentPay($order)
  209. {
  210. try {
  211. if (!MallAddons::isInstall($order['mall_id'], 'AllinTax')) return true;
  212. $model = PaymentTradeOrder::findOne(['order_no' => $order['order_no'], 'is_pay' => 1, 'pay_type' => PayTypeEnum::ALLIN_TAX_PAY]);
  213. if (empty($model)) return true;
  214. $trade = PaymentTrade::findOne(['id' => $model->trade_id]);
  215. if (empty($trade)) return true;
  216. PayService::signalAgentPay($order['mall_id'], $trade['out_trade_no']);
  217. } catch (\Exception $e) {
  218. var_dump($order['order_no'] . ':signalAgentPay:' . $e->getMessage());
  219. }
  220. }
  221. }