PhOrderPay.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <?php
  2. namespace app\common\model;
  3. use app\common\util\AppMsg;
  4. use app\hander\HelpHander;
  5. use think\Db;
  6. use think\Exception;
  7. use think\Log;
  8. use tools\Hwsms;
  9. class PhOrderPay extends Base
  10. {
  11. // 用户生成支付单
  12. public function addSave($userId,$orgId,$orderId,$money,$busType=0){
  13. $data = [
  14. 'sn' => get_unique_id('PH'),
  15. 'order_id' => $orderId,
  16. 'money' => $money,
  17. 'type' => 2,
  18. 'cate' => 1,
  19. 'status' => 0,
  20. 'create_time' => date('Y-m-d H:i:s')
  21. ];
  22. $map[] = ['id','=',$orderId];
  23. $map[] = ['form','=',1];
  24. $map[] = ['user_id','=',$userId];
  25. $map[] = ['org_id','=',$orgId];
  26. if($busType == 1){
  27. $map[] = ['status','=',0];
  28. }else{
  29. $map[] = ['status','in',[0,1]];
  30. }
  31. $order = Db::name('ph_orders')
  32. ->where($map)
  33. ->find();
  34. if(!$order){
  35. HelpHander::error('订单不存在');
  36. }
  37. $payId = Db::name('ph_order_pay')->insertGetId($data);
  38. if(!$payId){
  39. HelpHander::error('操作失败');
  40. }
  41. return $payId;
  42. }
  43. // 用户支付成功预收款,改变状态
  44. public function paySuccess($payId,$type=2){
  45. Db::startTrans();
  46. try{
  47. $pay = Db::name('ph_order_pay')
  48. ->where('id',$payId)
  49. ->find();
  50. if(!$pay){
  51. \exception('支付单不存在');
  52. }
  53. $order = Db::name('ph_orders')
  54. ->where('id',$pay['order_id'])
  55. ->lock(true)
  56. ->find();
  57. if(!$order){
  58. \exception('订单不存在');
  59. }
  60. $res = Db::name('ph_order_pay')->where('id',$payId)->update([
  61. 'status' => 1,
  62. 'type' => $type,
  63. 'pay_time' => date('Y-m-d H:i:s')
  64. ]);
  65. if(!$res){
  66. \exception('操作失败');
  67. }
  68. if($pay['bus_type'] == 0){
  69. $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([
  70. 'pre_money' => $order['pre_money'] + $pay['money']
  71. ]);
  72. if(!$ret){
  73. \exception('操作失败');
  74. }
  75. }else{
  76. $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([
  77. 'is_service' => 1,
  78. 'update_time' => date("Y-m-d H:i:s")
  79. ]);
  80. if(!$ret){
  81. \exception('操作失败');
  82. }
  83. }
  84. Db::commit();
  85. }catch (Exception $e){
  86. Db::rollback();
  87. $this->error = $e->getMessage();
  88. return false;
  89. }
  90. return true;
  91. }
  92. // 调度生成支付单
  93. public function addSaveDispatch($orgId,$orderId,$money,$remark='',$busType=0){
  94. $data = [
  95. 'sn' => get_unique_id('PH'),
  96. 'order_id' => $orderId,
  97. 'money' => $money,
  98. 'type' => 1,
  99. 'cate' => 2,
  100. 'status' => 1,
  101. 'create_time' => date('Y-m-d H:i:s'),
  102. 'pay_time' => date('Y-m-d H:i:s'),
  103. 'remark' => $remark,
  104. 'bus_type' => $busType
  105. ];
  106. Db::startTrans();
  107. try{
  108. $order = Db::name('ph_orders')
  109. ->where('id',$orderId)
  110. ->where('status','in',[0,1])
  111. ->where('org_id',$orgId)
  112. ->lock(true)
  113. ->find();
  114. if(!$order){
  115. \exception('订单不存在');
  116. }
  117. $payId = Db::name('ph_order_pay')->insertGetId($data);
  118. if(!$payId){
  119. \exception('操作失败');
  120. }
  121. if($busType == 1){
  122. $ret = Db::name('ph_orders')->where('id',$orderId)->update([
  123. 'service_money' => $order['service_money'] + $money
  124. ]);
  125. }else{
  126. $ret = Db::name('ph_orders')->where('id',$orderId)->update([
  127. 'pre_money' => $order['pre_money'] + $money
  128. ]);
  129. }
  130. if(!$ret){
  131. \exception('操作失败');
  132. }
  133. Db::commit();
  134. }catch (Exception $e){
  135. Db::rollback();
  136. $this->error = $e->getMessage();
  137. return false;
  138. }
  139. return true;
  140. }
  141. public function refundOrder($userId){
  142. $data = [
  143. 'type' => input('type/d',1),
  144. 'money' => input('money/f',0),
  145. 'pay_id' => input('id/d',0),
  146. 'user_id' => $userId,
  147. 'remark' => input('remark','','trim'),
  148. 'create_time' => date('Y-m-d H:i:s'),
  149. ];
  150. if(!in_array($data['type'],[1,2])){
  151. $this->error = '类型不正确';
  152. return false;
  153. }
  154. if($data['money'] <= 0){
  155. $this->error = '金额必须大于0';
  156. return false;
  157. }
  158. $pay = Db::name('ph_order_pay')->where('id',$data['pay_id'])->find();
  159. if(!$pay||$pay['status'] != 1){
  160. $this->error = '订单不存在';
  161. return false;
  162. }
  163. $data['sn'] = get_unique_id('TPH');
  164. $data['order_id'] = $pay['order_id'];
  165. if($data['money'] > ($pay['money'] - $pay['money2'])){
  166. $this->error = '退款金额过大';
  167. return false;
  168. }
  169. if($pay['type'] == 1 && $data['type'] == 2){
  170. $this->error = '线下的记录不能线上退款';
  171. return false;
  172. }
  173. Db::startTrans();
  174. try{
  175. $ret = Db::name('ph_order_refund')->insert($data);
  176. if(!$ret){
  177. \exception('操作失败');
  178. }
  179. $ret2 = Db::name('ph_order_pay')->where('id',$data['pay_id'])->update(['money2' => $pay['money2'] + $data['money']]);
  180. if(!$ret2){
  181. \exception('操作失败');
  182. }
  183. $order = Db::name('ph_orders')
  184. ->where('id',$pay['order_id'])
  185. ->lock(true)
  186. ->find();
  187. if(!$order){
  188. \exception('订单不存在');
  189. }
  190. if($pay['bus_type'] == 1){
  191. $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([
  192. 'service_money' => $order['service_money'] - $data['money']
  193. ]);
  194. }else{
  195. $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([
  196. 'pre_money' => $order['pre_money'] - $data['money']
  197. ]);
  198. }
  199. if(!$ret){
  200. \exception('操作失败');
  201. }
  202. if($data['type'] == 2){ // 线上,微信退款
  203. $config = config('app.wx_config');
  204. $app = \EasyWeChat\Factory::payment($config);
  205. $ret = $app->refund->byOutTradeNumber($pay['sn'], $data['sn'], $pay['money']*100, $data['money']*100);
  206. if($ret['return_code'] != 'SUCCESS' || $ret['result_code'] != 'SUCCESS'){
  207. \exception('退款申请提交失败');
  208. }
  209. }
  210. Db::commit();
  211. }catch (\Exception $e){
  212. Db::rollback();
  213. trace($e->getMessage());
  214. $this->error = $e->getMessage();
  215. return false;
  216. }
  217. return true;
  218. }
  219. }