pay_op.php 6.2 KB

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