delivery.logic.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <?php
  2. /**
  3. * 物流推送
  4. *
  5. *
  6. *
  7. *
  8. * by Jeff Wan
  9. */
  10. defined('InShopNC') or exit('Access Invalid!');
  11. require_once (BASE_CORE_PATH . '/framework/function/http.php');
  12. class deliveryLogic
  13. {
  14. const oms_url = 'http://oapi.lrlz.com/lrlzApiRest/router/rest';
  15. private static $appkey = '2015panda';
  16. private static $appPassWord = 'nEs5vu86JSjh89WPW4de2d3e87rwli3e8rw';
  17. private function sign($data) {
  18. return md5(self::$appkey . self::$appPassWord . $data);
  19. }
  20. public function putOrder($pay_sn, $trade_no,$log_fail = true)
  21. {
  22. // 调试模式下不能推送到oms
  23. if(defined('OMS_PUSH_OFF') && OMS_PUSH_OFF == true) {
  24. return false;
  25. }
  26. $order_list = Model('order')->getNormalOrderList(array('pay_sn'=> $pay_sn), $this->page, '*', 'order_id desc', '', array('order_address', 'order_goods'));
  27. if(empty($order_list)) {
  28. Log::record("putOrder:cannot get order list when pay_sn={$pay_sn},trade_no={$trade_no} ",Log::DEBUG);
  29. return false;
  30. }
  31. $order_sn = '';
  32. $delivery_order_list = array();
  33. foreach ($order_list as $order_info)
  34. {
  35. if ($order_info['order_state'] === '20')
  36. {
  37. $nick_name = $order_info['reciver_name'];
  38. $delivery_order = array();
  39. $order_sn = $order_info['order_sn'];
  40. $delivery_order['tid'] = $order_info['order_sn'];
  41. $delivery_order['total_fee'] = $order_info['order_amount'];
  42. $delivery_order['discount_fee'] = '';
  43. $delivery_order['post_fee'] = $order_info['shipping_fee'];
  44. $delivery_order['created'] = date('Y-m-d H:i:s', $order_info['add_time']);
  45. $delivery_order['pay_time'] = date('Y-m-d H:i:s',$order_info['payment_time']);
  46. $delivery_order['buyer_message'] = '';
  47. $delivery_order['express_code'] = '';
  48. $delivery_order['pay_account_type'] = $order_info['payment_code'] == 'wxpay' ? '微信支付': '支付宝';
  49. $delivery_order['pay_account_id'] = '';
  50. $delivery_order['pay_account_no'] = $trade_no;
  51. $delivery_order['buyer_nick'] = $nick_name;
  52. $delivery_order['buyer_email'] = $order_info['buyer_email'];
  53. $delivery_order['trade_memo'] = '';
  54. $delivery_order['receiver_name'] = $order_info['reciver_name'];
  55. $delivery_area = explode("\t", $order_info['reciver_info']['area']);
  56. $delivery_order['receiver_state'] = $delivery_area[0];
  57. $delivery_order['receiver_city'] = $delivery_area[1];
  58. $delivery_order['receiver_district'] = $delivery_area[2];
  59. Log::record("{$delivery_order['receiver_state']} {$delivery_order['receiver_city']} {$delivery_order['receiver_district']}");
  60. $delivery_order['receiver_address'] = $order_info['reciver_info']['street'];
  61. $delivery_order['receiver_zip'] = '000000';
  62. $delivery_order['receiver_mobile'] = $order_info['reciver_info']['mob_phone'];
  63. $delivery_order['receiver_phone'] = $order_info['reciver_info']['tel_phone'];
  64. $delivery_order['order_size'] = count($order_info['extend_order_goods']);
  65. $delivery_order['orderList'] = array();
  66. foreach($order_info['extend_order_goods'] as $key => $goods)
  67. {
  68. $delivery_goods = array();
  69. $delivery_goods['oid'] = $order_info['order_sn'] . $key;
  70. $delivery_goods['tid'] = $order_info['order_sn'];
  71. $delivery_goods['title'] = $goods['goods_name'];
  72. $delivery_goods['price'] = $goods['goods_price'];
  73. $delivery_goods['num'] = $goods['goods_num'];
  74. $goods_serial = Model('goods')->getGoodsInfo(array('goods_id'=>$goods['goods_id']));
  75. $delivery_goods['outer_sku_id'] = $goods_serial['goods_serial'];
  76. $delivery_goods['outer_sku_properties_name'] = $goods['goods_name'];
  77. $delivery_goods['buyer_nick'] = $nick_name;
  78. array_push($delivery_order['orderList'] , $delivery_goods);
  79. }
  80. array_push($delivery_order_list, $delivery_order);
  81. }
  82. }
  83. // 订单状态不对
  84. if (empty($delivery_order_list) || count($delivery_order_list) == 0) {
  85. Log::record("putOrder: pay_sn={$pay_sn}, 错误原因: 订单状态不对");
  86. return fasle;
  87. }
  88. $data = array('type' => 'PUT_TRADE', 'data' => $delivery_order_list);
  89. $body = json_encode($data,JSON_UNESCAPED_UNICODE);
  90. $sign = $this->sign($body);
  91. $headers = array('v_appkey: '.self::$appkey, 'v_sign: '.$sign, 'Content-Type: application/json');
  92. $resp = http_post_data(self::oms_url,urlencode($body),$headers);
  93. if($resp === false)
  94. { //网络出现异常时,后台重新推送
  95. if($log_fail) {
  96. $log = array();
  97. $log['pay_sn'] = $pay_sn;
  98. $log['order_sn'] = $order_sn;
  99. $log['trade_no'] = $trade_no;
  100. $log['push_time'] = time();
  101. $log['order_status'] = 0;
  102. Model('omsfail')->insert($log);
  103. }
  104. return false;
  105. }
  106. $success = $this->check($resp,$err_state,$reson);
  107. if($success == false)
  108. {
  109. Log::record("post data={$resp}",Log::ERR);
  110. if($log_fail) {
  111. $log = array();
  112. $log['pay_sn'] = $pay_sn;
  113. $log['order_sn'] = $order_sn;
  114. $log['trade_no'] = $trade_no;
  115. $log['push_time'] = time();
  116. $log['reson'] = $reson;
  117. $log['order_status'] = $err_state;
  118. $log['oms_response'] = $resp;
  119. Model('omsfail')->insert($log);
  120. }
  121. return false;
  122. } else {
  123. return true;
  124. }
  125. }
  126. public function handleCallback($param)
  127. {
  128. $model_order = Model('order');
  129. $condition = array('order_sn' => $param['order_sn']);
  130. $order_info = $model_order->getOrderInfo($condition,array('order_common','order_goods'));
  131. $model_express = Model('express');
  132. $express_info = $model_express->getExpressInfoByOMS($param['oms_code']);
  133. $data['reciver_name'] = $order_info['reciver_name'];
  134. $data['reciver_info'] = $order_info['reciver_info'];
  135. $data['deliver_explain'] = $order_info['deliver_explain'];
  136. $data['daddress_id'] = intval($order_info['daddress_id']);
  137. $data['shipping_express_id'] =intval($express_info['express_id']);
  138. $data['shipping_code'] = $param['shipping_code'];
  139. $logic_order = Logic('order');
  140. $result = $logic_order->changeOrderSend($order_info, 'seller', $order_info['buyer_name'], $data);
  141. return $result;
  142. }
  143. /**
  144. * @param $pay_sn
  145. * @param $trade_no
  146. * @param $result
  147. * @param $order_sn
  148. * @return mixed
  149. */
  150. private function check($resp,&$err_state,&$reson)
  151. {
  152. $err_state = 0;
  153. //1:成功 0 :失败
  154. // 1:新订单 2:等待仓库处理 99:已拦截 90:库存不足 7:已发货
  155. // -99:发货失败 -2:订单关闭 -3:订单已存在(没有进行拦截的订单不予更新) -1:异常订单 -2:订单关闭
  156. $result = json_decode($resp, true);
  157. if (!empty($result) && is_array($result))
  158. {
  159. if ($result['apiCode'] == 'success')
  160. {
  161. if (!empty($result['data']) && is_array($result['data']) && count($result['data']) > 0)
  162. {
  163. // 填充错误理由
  164. $reson = $result['data'][0]['errorMessge'];
  165. if (!empty($result['data'][0]['status'])) {
  166. $status = intval($result['data'][0]['status']);
  167. if ($status == 1 || $status == 2 || $status == 3 || $status == 7 || $status == 99) {
  168. return true;
  169. }
  170. } else {
  171. $msg = $result['data'][0]['errorMessge'];
  172. if (strstr($msg, '订单已存在')) {
  173. return true;
  174. } else {
  175. $err_state = 2;
  176. }
  177. }
  178. }
  179. }
  180. }
  181. return false;
  182. }
  183. }