pay_op.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. /**
  3. * 刷新充值订单(领取充值结果) , 客户端收到SDK成功支付返回的订单号后,请求游戏服务器发货,
  4. * 游戏服务器拿订单号和uid、zoneid一起来pay_op验证订单,如果验证通过, 会主动调用发货方法,
  5. * 请游戏发货方法成功返回true,失败返回false. 本方法后续逻辑会判断游戏服务器是否发货成功,
  6. * 发货成功的化,会更新订单的领取状态.
  7. * 用法:
  8. *
  9. * require_once dirname(__FILE__) . '/../../../public/sdk/official/pay/pay_op.php';
  10. * use loyalsoft\pay_op;
  11. *
  12. * pay_op::CheckAndDrawOrders($uid, $deliverFunc);
  13. *
  14. */
  15. namespace loyalsoft;
  16. require_once __DIR__ . '/../../../main.php'; # 导入基础库
  17. require_once __DIR__ . '/../Mo/resp.php'; # 响应模型
  18. require_once __DIR__ . '/../../../process/PayProc.php';
  19. use loyalsoft\resp;
  20. class pay_op {
  21. const orderTab = 'tpl_order_tab'; # 订单表表名
  22. //
  23. // <editor-fold defaultstate="collapsed" desc="旧">
  24. /**
  25. * 刷新充值订单(领取充值结果) , 客户端收到SDK成功支付返回的订单号后,请求游戏服务器发货,
  26. * 游戏服务器拿订单号和uid、zoneid一起来pay_op验证订单,如果验证通过, 会主动调用发货方法,
  27. * 请游戏发货方法成功返回true,失败返回false. 本方法后续逻辑会判断游戏服务器是否发货成功,
  28. * 发货成功的化,会更新订单的领取状态.
  29. * 本方法 全部执行完毕返回 err=0, 任意步骤 出现错误会返回相应的错误码.
  30. * 游戏服务器调用本方法后注意判断返回值,err==0,代表一切正常, 否则请放弃本次执行结果.
  31. * @version 2020年1月2日 第二版 去掉了zoneid参数, 订单编号长度从16位改为19位.
  32. * 2019年12月11日 第一版 --gwang
  33. * @author gwang<wanggangzero@qq.com>
  34. * @param type $uid
  35. * @param type $cpOrderId
  36. * @param bool function $deliverFunc 发货成功返回 true,否则返回false
  37. * @return {"err":0,"ret":obj,"msg":"错误信息"}
  38. * @deprecated since version 0 使用CheckAndDrawOrders
  39. */
  40. static function CheckAndDrawOrder($uid, $cpOrderId,$deliverFunc) {
  41. if (!$uid || strlen($cpOrderId) != 19) { # 订单编号长19位
  42. return resp::err("1", "参数错误");
  43. }
  44. $order = daoInst()->select()->from(self::orderTab) # 取订单数据
  45. ->where('cpOrderId')->eq($cpOrderId)
  46. ->limit(1)->fetch();
  47. if (!$order) {
  48. CLog::pay(' 订单不存在! ' . $cpOrderId);
  49. return resp::err(2, "订单不存在");
  50. }
  51. if (false === strpos($uid, $order->uid)) { # UID不符
  52. return resp::err(3, "UID不符");
  53. }
  54. if ($order->status != 1) { # 订单状态
  55. CLog::pay(' 订单尚未完成支付!');
  56. return resp::err(4, "订单尚未完成支付");
  57. }
  58. if ($order->drawed_ts > 0) { # 定单已经发过货了
  59. CLog::pay(' 订单重复请求发货!' . $cpOrderId);
  60. return resp::err(5, "订单重复请求发货");
  61. }
  62. if (!is_callable($deliverFunc)) { # 校验回调函数是否可执行
  63. CLog::pay('发货回调函数不是可执行对象!' . $cpOrderId);
  64. return resp::err(6, "发货函数不可调用!");
  65. }
  66. $bOk = call_user_func($deliverFunc, $order); # 调用游戏发货逻辑, 要求游戏逻辑返回true/false
  67. if (!$bOk) {
  68. CLog::pay("订单发货失败: $cpOrderId");
  69. return resp::err(7, "游戏发货逻辑执行失败");
  70. }
  71. $n = daoInst()->update(self::orderTab) # 更新订单状态
  72. ->data(array('drawed_ts' => now()))
  73. ->where('cpOrderId')->eq($cpOrderId)
  74. ->exec();
  75. if (!$n) {
  76. CLog::pay("数据库更新订单状态失败: $cpOrderId");
  77. return resp::err(8, "更新订单状态,数据库操作失败"); # 数据库操作失败
  78. }
  79. CLog::pay("订单发货成功: $cpOrderId");
  80. return resp::ok("");
  81. }
  82. /**
  83. * 查询已支付未发货订单
  84. * @param string $uid 账号ID
  85. * @return array 订单编号数组
  86. * @version 2020年1月2日 第一版, 增加查询订单接口.流程上变为先查询订单再调用校验发货方法.
  87. */
  88. static function FindReadOrders($uid) {
  89. if (!$uid) { # uid不能为空
  90. return resp::err("1", "参数错误");
  91. }
  92. $orders = daoInst()->select('cpOrderId')->from(pay_op::orderTab) # 取订单数据
  93. ->where('uid')->eq($uid)
  94. ->andWhere('status')->eq(1)
  95. ->andWhere('drawed_ts')->le(0)
  96. ->limit(10)->fetchAll(); # 一次最多返10条
  97. return $orders;
  98. }
  99. // </editor-fold>
  100. //
  101. }
  102. //
  103. //$orders = json_decode(json_encode(array(
  104. // array('Id' => 3),
  105. // array('Id' => 2)
  106. // )));
  107. //$arrOrderId = array(1, 2);
  108. //array_map(function($o)use(&$arrOrderId) {
  109. // $arrOrderId[] = $o->Id;
  110. //}, $orders);
  111. //var_dump($arrOrderId);
  112. //$n = daoInst()->update(pay_op::orderTab) # 更新订单状态
  113. // ->data(array('drawed_ts' => now()))
  114. // ->where('Id')->in($arrOrderId)
  115. // ->exec();
  116. //$uid = "0BB6B1D602621423EBA082F17A57712F";
  117. //$orders = daoInst()->select('cpOrderId')->from(pay_op::orderTab) # 取订单数据
  118. // ->where('uid')->eq($uid)
  119. // ->andWhere('status')->eq(1)
  120. // ->andWhere('drawed_ts')->le(0)
  121. // ->limit(10)->fetchAll(); # 一次最多返10条
  122. //
  123. //var_dump($orders);