RechargeNotify.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. /**
  3. * 直充的服务器异步通知控制器
  4. *
  5. */
  6. namespace app\mcpsapi\controller;
  7. use app\common\controller\Base;
  8. use app\common\library\WeixinPay;
  9. use think\Config;
  10. use think\Db;
  11. use think\Controller;
  12. class RechargeNotify extends Base {
  13. /**
  14. * 不进行父类的登录验证,所以增加构造方法重写了父类的初始化方法
  15. */
  16. public function _initialize()
  17. {
  18. }
  19. /**
  20. * 支付宝Aop支付服务器异步通知页面方法
  21. */
  22. public function notify_url() {
  23. import('alipay.pagepay.service.AlipayTradeService',EXTEND_PATH);
  24. $arr = request()->post();
  25. $alipaySevice = new \AlipayTradeService(config('alipayAop'));
  26. /**
  27. * 说明:校验
  28. * 1.通过正常写入数据库 返回给支付宝success
  29. * 2.错误的情况下返回失败通知支付宝fail
  30. */
  31. $result = $alipaySevice->check($arr);
  32. if ($result) {
  33. // 处理支付成功后的逻辑业务
  34. if ($arr['trade_status'] == 'TRADE_SUCCESS') {
  35. //写入日志
  36. log_message($result,'log',LOG_PATH . '../paylog/');
  37. $out_trade_no = input('out_trade_no'); //订单号
  38. $trade_no = input('trade_no');
  39. if(!empty($out_trade_no)){
  40. //更新订单状态处理
  41. $this->updateRehcargeOrder($out_trade_no,input('total_fee'),$trade_no);
  42. }
  43. echo 'success';exit; //请不要修改或删除
  44. }
  45. echo 'fail';exit; //验证失败
  46. }
  47. echo 'fail';exit;
  48. }
  49. /**
  50. * 支付宝同步通知服务器页面
  51. * @return [type] [description]
  52. */
  53. public function return_url()
  54. {
  55. /* *
  56. * 功能:支付宝页面跳转同步通知页面
  57. *
  58. *************************页面功能说明*************************
  59. */
  60. import('alipay.pagepay.service.AlipayTradeService',EXTEND_PATH);
  61. $arr = request()->post();
  62. $alipaySevice = new \AlipayTradeService(config('alipayAop'));
  63. /**
  64. * 说明:校验
  65. * 1.通过正常写入数据库
  66. * 2.错误的情况下返回失败通知前端页面
  67. */
  68. $result = $alipaySevice->check($arr);
  69. if ($result) {
  70. //写入日志
  71. log_message($result,'log',LOG_PATH . '../paylog/');
  72. $out_trade_no = input('out_trade_no'); //订单号
  73. $trade_no = input('trade_no'); //订单号
  74. if(!empty($out_trade_no)){
  75. //更新订单状态处理
  76. $this->updateRehcargeOrder($out_trade_no,input('total_amount'),$trade_no);
  77. }
  78. return json(['data'=>'','code'=>20000,'msg'=>'支付完成']);
  79. }
  80. return json(['data'=>'','code'=>10001,'msg'=>'支付失败,请重新支付']);
  81. }
  82. /**
  83. * 快接微信h5支付
  84. */
  85. public function wxpayh5kj()
  86. {
  87. $request_data = file_get_contents('php://input');
  88. //写入日志
  89. log_message('快接微信h5支付回调参数:'.$request_data,'log',LOG_PATH . '../paylog/');
  90. vendor('kjpaySdk.Kjpay','.class.php');
  91. $kjpay = new \Kjpay();
  92. $data = $_POST;
  93. $retjson = $kjpay->notifyVerify($data);
  94. if($retjson && $retjson['status']=='Success'){
  95. $orderid = $retjson['merchant_order_no'];
  96. $trans_code = trim($retjson['trade_no']);
  97. $amount = floatval($retjson['amount']);
  98. //订单编号不为空时
  99. if(!empty($orderid)){
  100. //更新订单状态处理
  101. $this->updateRehcargeOrder($orderid,$amount,$trans_code);
  102. }
  103. echo "success";
  104. die();
  105. }
  106. else{
  107. log_message('快接微信h5支付签名验证失败:'.print_r($data,true),'error',LOG_PATH . '../paylog/');
  108. echo 'fail';
  109. exit();
  110. }
  111. }
  112. /**
  113. * 更新订单信息
  114. *
  115. * @param string $orderid:订单编号
  116. * @param string $real_amount:第三方支付的金额(现金部分)
  117. *
  118. * @return boolean
  119. */
  120. private function updateRehcargeOrder($orderid,$real_amount='',$trans_code='')
  121. {
  122. $result = false;
  123. //消费订单信息
  124. $rechargeInfo = model('ChannelRecharge')->field('id,orderid,channel_id,channel_name,send_channel_id,status,amount,real_amount,recharge_type,paytype')->where(['orderid'=>$orderid])->find();
  125. if($real_amount!='' && $rechargeInfo['real_amount']!=$real_amount)
  126. {
  127. $result = false;
  128. //写入日志
  129. log_message('充值订单编号:'.$orderid.'支付金额不一致,订单状态更新失败','error',LOG_PATH . '../paylog/');
  130. }
  131. //待支付状态时
  132. elseif($rechargeInfo['status']==0){
  133. $id = $rechargeInfo['id'];
  134. // 启动事务
  135. Db::startTrans();
  136. try{
  137. $rechargeData = array();
  138. $rechargeData['id'] = $id;
  139. $rechargeData['status'] = 1;
  140. $rechargeData['finish_time'] = NOW_TIMESTAMP;
  141. $rechargeData['check_remark'] = '充值回调处理';
  142. $rechargeData['check_admin_type'] = 1;
  143. $rechargeData['check_admin_name'] = '系统自动';
  144. $rechargeData['finish_status'] = 1;
  145. $rechargeData['out_order_no'] = $trans_code;
  146. $result = model('ChannelRecharge')->where(['id'=>$id,'status'=>array('in',[0])])->update($rechargeData);
  147. if (!$result) {
  148. throw new Exception("充值订单回调处理失败");
  149. }
  150. $detData = array();
  151. $detData['channel_id'] = $rechargeInfo['channel_id'];
  152. $detData['channel_name'] = $rechargeInfo['channel_name'];
  153. $detData['change_amount'] = $rechargeInfo['amount'];
  154. $detData['account_type'] = 1; //通用账户
  155. $detData['type'] = 4; //充值收入
  156. $detData['out_orderid'] = $rechargeInfo['orderid'];
  157. $detData['create_time'] = NOW_TIMESTAMP;
  158. $insertDetId = model('ChannelAccountDet')->insertGetId($detData);
  159. if ( !$insertDetId) {
  160. throw new Exception("添加账户变动明细失败");
  161. }
  162. $updData = array();
  163. $updData['amount'] = Db::raw("amount+".$rechargeInfo['amount']);
  164. $updData['update_time'] = time();
  165. $updToResult = model('Channel')->where(['id'=>$rechargeInfo['channel_id']])->update($updData);
  166. if (!$updToResult) {
  167. throw new Exception("账户金额变动失败");
  168. }
  169. $result = true;
  170. // 提交事务
  171. Db::commit();
  172. } catch (\Exception $e) {
  173. // 回滚事务
  174. Db::rollback();
  175. $result = false;
  176. //写入日志
  177. log_message('订单编号:'.$orderid.'充值订单回调处理状态更新失败'.$e->getMessage(),'error',LOG_PATH . '../paylog/');
  178. }
  179. log_message('订单编号:'.$orderid.'充值订单回调处理状态更新成功','error',LOG_PATH . '../paylog/');
  180. }
  181. else{
  182. $result = false;
  183. log_message('订单编号:'.$orderid.'充值订单回调处理状态更新失败:该充值订单已处理过','error',LOG_PATH . '../paylog/');
  184. }
  185. }
  186. }