Complex.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. /**
  3. * sdk接口公共控制器类
  4. *
  5. */
  6. namespace app\complex\controller;
  7. use app\common\controller\Base;
  8. use app\common\model\ComplexPay as PayModel;
  9. use app\common\model\PayCpinfo;
  10. use app\common\model\ComplexMembers;
  11. use app\common\model\PolychannelGame;
  12. use app\common\logic\PayCallback;
  13. use think\Db;
  14. class Complex extends Base {
  15. protected $payInfo; //订单支付信息,子类里面有调用
  16. /**
  17. * 初始化操作
  18. */
  19. public function _initialize() {
  20. }
  21. /**
  22. * 检验订单
  23. *
  24. * @param $orderid string 订单ID
  25. * @param $amount string 订单金额
  26. *
  27. * @return boolean 验签结果
  28. */
  29. protected function checkOrder($orderid,$amount)
  30. {
  31. $payModel = new PayModel;
  32. $payInfo = $payModel->field('userid,amount,gameid,channel_id')->where(['orderid'=>$orderid,'status'=>0])->find();
  33. if(empty($payInfo))
  34. return false;
  35. elseif(floatval($payInfo['amount'])!=floatval($amount)){
  36. return false;
  37. }
  38. $this->payInfo = $payInfo;
  39. return true;
  40. }
  41. /**
  42. * 更新订单信息
  43. *
  44. * @param $orderId string 订单号
  45. * @param $sub_orderid string 下级渠道订单号
  46. * @param $pay_time int 支付时间
  47. *
  48. * @return bool
  49. */
  50. protected function updateOrder($orderid,$sub_orderid,$pay_time=NOW_TIMESTAMP) {
  51. $payModel = new PayModel;
  52. $payCpinfoModel = new PayCpinfo;
  53. $memberModel = new ComplexMembers;
  54. //消费订单信息
  55. $payInfo = $payModel->field('id,amount,userid,gameid,channel_id')->where(['orderid'=>$orderid])->find();
  56. if($payInfo){
  57. $payModel->save(['status'=>1,'sub_orderid'=>$sub_orderid,'pay_time'=>$pay_time],['orderid'=>$orderid]);
  58. $payCpinfoModel->save(['payflag'=>1],['orderid'=>$orderid]);
  59. //更新nw_complex_members表的total_pay_amount
  60. $memberModel->where(['id'=>$payInfo['userid']])->update(['total_pay_amount'=> Db::raw('total_pay_amount+'.$payInfo['amount'])]);
  61. }
  62. }
  63. /**
  64. * 判断请求次数是否过多,默认为10次
  65. * @param $attach 麻花网络订单号
  66. * @param $orderid cp订单号
  67. * @param $msg 提示信息
  68. * @param $mark 渠道标识
  69. */
  70. protected function requestTimes($attach,$orderid,$msg,$mark){
  71. $res = can_do_request('complex_sdk_pay_callback:' . $mark . '_request_count_' . md5($attach));
  72. if ($res){
  73. log_message('请求次数超出限制,orderid='.$orderid,'error',LOG_PATH . '../complexPaylog/');
  74. die($msg);
  75. }
  76. }
  77. /**
  78. * 写入数据库,通知cp
  79. * @param $attach 麻花网络订单号
  80. * @param $orderid cp订单号
  81. * @param $msg 提示信息
  82. * @param $pay_time 支付时间
  83. */
  84. protected function writeDb($attach,$orderid,$msg,$pay_time=''){
  85. // 启动事务
  86. Db::startTrans();
  87. try{
  88. if (empty($pay_time)){
  89. $this->updateOrder($attach,$orderid);
  90. }else{
  91. $this->updateOrder($attach,$orderid,$pay_time);
  92. }
  93. // 提交事务
  94. Db::commit();
  95. }
  96. catch (\Exception $e) {
  97. // 回滚事务
  98. Db::rollback();
  99. log_message('订单生成失败'.$e->getMessage(),LOG_PATH . '../complexPaylog/');
  100. // die('订单生成失败'.$e->getMessage());
  101. die($msg);
  102. }
  103. // 通知CP,支付成功
  104. (new PayCallback())->callBackToCp($attach);
  105. }
  106. /**
  107. * 验证订单金额是否一致,获取游戏配置参数
  108. * @param $attach 麻花网络
  109. 订单号
  110. * @param $amount 金额 单位 元
  111. * @param $orderid cp订单号
  112. * @param $msg 提示信息
  113. * @return mixed 配置参数
  114. */
  115. protected function checkAndGetParam($attach,$amount,$orderid,$msg){
  116. if(!$this->checkOrder($attach,$amount)){
  117. log_message('订单不存在或订单金额不一致,orderid='.$orderid,'error',LOG_PATH . '../complexPaylog/');
  118. //die('订单不存在或订单金额不一致');
  119. die($msg);
  120. }
  121. $polyChannelGameModel = new PolychannelGame;
  122. $param = $polyChannelGameModel->where(['game_id'=>$this->payInfo['gameid'],'channel_id'=>$this->payInfo['channel_id']])->value('param');
  123. if(empty($param)){
  124. log_message('后台渠道游戏中,用于该游戏的验签参数还未设置,orderid='.$orderid,'error',LOG_PATH . '../complexPaylog/');
  125. //die('用于验签的参数还未设置');
  126. die($msg);
  127. }
  128. $param = unserialize($param);
  129. return $param;
  130. }
  131. /**
  132. * 验证出错时,写日志,返回信息给cp,终止程序
  133. * @param $errMsg 返回给cp的信息
  134. * @param $logMsg 记录日志的信息
  135. * @param string $path 日志存放路径
  136. * @param string $errLeve 日志类型
  137. */
  138. protected function errAction($errMsg,$logMsg,$path='',$errLeve='error'){
  139. if (empty($path)){
  140. $path = LOG_PATH.'../complexPaylog/';
  141. }
  142. log_message($logMsg,$errLeve,$path);
  143. die($errMsg);
  144. }
  145. }