delivery.logic.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  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 OMSOrderStatus
  13. {
  14. private $mResp;
  15. const intercept_success = 1;
  16. const send_success = 7;
  17. public function __construct($resp)
  18. {
  19. $this->mResp = $resp;
  20. }
  21. public function cancel_status(&$status_text)
  22. {
  23. $status = intval($this->mResp['interceptStatus']);
  24. switch ($status) {
  25. case 0:
  26. $status_text = '待拦截';
  27. break;
  28. case 1:
  29. $status_text = '拦截成功';
  30. break;
  31. case 2:
  32. $status_text = '拦截失败';
  33. break;
  34. case 3:
  35. $status_text = '已进入拦截队列不重复拦截';
  36. break;
  37. default:
  38. $status_text = 'Oms系统未定义的状态';
  39. break;
  40. }
  41. return $status;
  42. }
  43. public function cancel_success(&$status_text) {
  44. return ($this->cancel_status($status_text) == self::intercept_success);
  45. }
  46. public function send_status(&$status_text)
  47. {
  48. $status = intval($this->mResp['status']);
  49. switch ($status)
  50. {
  51. case 0:
  52. $status_text = $this->message();
  53. break;
  54. case 1:
  55. $status_text = '新订单';
  56. break;
  57. case 2:
  58. $status_text = '等待仓库处理';
  59. break;
  60. case 99:
  61. $status_text = '已拦截';
  62. break;
  63. case 90:
  64. $status_text = '库存不足';
  65. break;
  66. case 7:
  67. $status_text = '已发货';
  68. break;
  69. case -99:
  70. $status_text = '发货失败';
  71. break;
  72. case -1:
  73. $status_text = '异常订单';
  74. break;
  75. case -2:
  76. $status_text = '订单关闭';
  77. break;
  78. case -3:
  79. $status_text = '订单已存在(没有进行拦截的订单不予更新)';
  80. break;
  81. default:
  82. $status_text = 'Oms系统未定义的状态';
  83. break;
  84. }
  85. return $status;
  86. }
  87. public function send_success(&$status_text) {
  88. return ($this->send_status($status_text) == self::send_success);
  89. }
  90. public function message() {
  91. return $this->mResp['message'];
  92. }
  93. public function send_time() {
  94. if(empty($this->mResp['sendTime'])) {
  95. return 0;
  96. }
  97. else {
  98. return strtotime($this->mResp['sendTime']);
  99. }
  100. }
  101. public function express() {
  102. return $this->mResp['express'];
  103. }
  104. public function company() {
  105. return $this->mResp['expressCompany'];
  106. }
  107. public function order_sn() {
  108. return $this->mResp['tid'];
  109. }
  110. }
  111. class deliveryLogic
  112. {
  113. const oms_url = 'https://oapi.lrlz.com/lrlzApiRest/router/rest';
  114. // const oms_url = 'http://oapitest.lrlz.com/lrlzApiRest/router/rest';
  115. private static $appkey = '2015panda';
  116. private static $appPassWord = 'nEs5vu86JSjh89WPW4de2d3e87rwli3e8rw';
  117. private function sign($data) {
  118. return md5(self::$appkey . self::$appPassWord . $data);
  119. }
  120. public function putOrder($pay_sn, $trade_no,$log_fail = true)
  121. {
  122. Log::record(__METHOD__ . " {$pay_sn} {$trade_no}",Log::DEBUG);
  123. // 调试模式下不能推送到oms
  124. if(defined('OMS_PUSH_OFF') && OMS_PUSH_OFF == true) {
  125. return false;
  126. }
  127. $order_list = Model('order')->getNormalOrderList(array('pay_sn'=> $pay_sn), $this->page, '*', 'order_id desc', '', array('order_address', 'order_goods'),true);
  128. if(empty($order_list)) {
  129. Log::record("putOrder:cannot get order list when pay_sn={$pay_sn},trade_no={$trade_no} ",Log::DEBUG);
  130. return false;
  131. }
  132. $order_sn = '';
  133. $delivery_order_list = array();
  134. foreach ($order_list as $order_info)
  135. {
  136. if ($order_info['order_state'] === '20')
  137. {
  138. $nick_name = $order_info['reciver_name'];
  139. $delivery_order = array();
  140. $order_sn = $order_info['order_sn'];
  141. $delivery_order['tid'] = $order_info['order_sn'];
  142. $delivery_order['total_fee'] = $order_info['order_amount'];
  143. $delivery_order['discount_fee'] = '';
  144. $delivery_order['post_fee'] = $order_info['shipping_fee'];
  145. $delivery_order['created'] = date('Y-m-d H:i:s', $order_info['add_time']);
  146. $delivery_order['pay_time'] = date('Y-m-d H:i:s',$order_info['payment_time']);
  147. $delivery_order['buyer_message'] = '';
  148. $delivery_order['express_code'] = '';
  149. $delivery_order['pay_account_type'] = $order_info['payment_code'] == 'wxpay' ? '微信支付': '支付宝';
  150. $delivery_order['pay_account_id'] = '';
  151. $delivery_order['pay_account_no'] = $trade_no;
  152. $delivery_order['buyer_nick'] = $nick_name;
  153. $delivery_order['buyer_email'] = $order_info['buyer_email'];
  154. $delivery_order['trade_memo'] = '';
  155. $delivery_order['receiver_name'] = $order_info['reciver_name'];
  156. $delivery_area = explode("\t", $order_info['reciver_info']['area']);
  157. $delivery_order['receiver_state'] = $delivery_area[0];
  158. $delivery_order['receiver_city'] = $delivery_area[1];
  159. $delivery_order['receiver_district'] = $delivery_area[2];
  160. Log::record("{$delivery_order['receiver_state']} {$delivery_order['receiver_city']} {$delivery_order['receiver_district']}",Log::DEBUG);
  161. $delivery_order['receiver_address'] = $order_info['reciver_info']['street'];
  162. $delivery_order['receiver_zip'] = '000000';
  163. $delivery_order['receiver_mobile'] = $order_info['reciver_info']['mob_phone'];
  164. $delivery_order['receiver_phone'] = $order_info['reciver_info']['tel_phone'];
  165. $delivery_order['order_size'] = count($order_info['extend_order_goods']);
  166. $delivery_order['orderList'] = array();
  167. foreach($order_info['extend_order_goods'] as $key => $goods)
  168. {
  169. $delivery_goods = array();
  170. $delivery_goods['oid'] = $order_info['order_sn'] . $key;
  171. $delivery_goods['tid'] = $order_info['order_sn'];
  172. $delivery_goods['title'] = $goods['goods_name'];
  173. $delivery_goods['price'] = $goods['goods_price'];
  174. $delivery_goods['num'] = $goods['goods_num'];
  175. $goods_serial = Model('goods')->getGoodsInfo(array('goods_id'=>$goods['goods_id']));
  176. $delivery_goods['outer_sku_id'] = $goods_serial['goods_serial'];
  177. $delivery_goods['outer_sku_properties_name'] = $goods['goods_name'];
  178. $delivery_goods['buyer_nick'] = $nick_name;
  179. array_push($delivery_order['orderList'] , $delivery_goods);
  180. }
  181. array_push($delivery_order_list, $delivery_order);
  182. }
  183. }
  184. // 订单状态不对
  185. if (empty($delivery_order_list) || count($delivery_order_list) == 0) {
  186. Log::record("putOrder: pay_sn={$pay_sn}, 错误原因: 订单状态不对",Log::ERR);
  187. return false;
  188. }
  189. $data = array('type' => 'PUT_TRADE', 'data' => $delivery_order_list);
  190. $body = json_encode($data,JSON_UNESCAPED_UNICODE);
  191. $sign = $this->sign($body);
  192. $headers = array('v_appkey: '.self::$appkey, 'v_sign: '.$sign, 'Content-Type: application/json');
  193. $resp = http_post_data(self::oms_url,urlencode($body),$headers);
  194. if($resp === false)
  195. { //网络出现异常时,后台重新推送
  196. if($log_fail) {
  197. $log = array();
  198. $log['pay_sn'] = $pay_sn;
  199. $log['order_sn'] = $order_sn;
  200. $log['trade_no'] = $trade_no;
  201. $log['push_time'] = time();
  202. $log['order_status'] = 0;
  203. Model('omsfail')->insert($log);
  204. }
  205. return false;
  206. }
  207. $success = $this->check($resp,$err_state,$reason);
  208. if($success == false)
  209. {
  210. Log::record("post data={$resp}",Log::ERR);
  211. if($log_fail) {
  212. $log = array();
  213. $log['pay_sn'] = $pay_sn;
  214. $log['order_sn'] = $order_sn;
  215. $log['trade_no'] = $trade_no;
  216. $log['push_time'] = time();
  217. $log['reason'] = $reason;
  218. $log['order_status'] = $err_state;
  219. $log['oms_response'] = $resp;
  220. Model('omsfail')->insert($log);
  221. }
  222. return false;
  223. } else {
  224. return true;
  225. }
  226. }
  227. public function handleCallback($param)
  228. {
  229. $model_order = Model('order');
  230. $condition = array('order_sn' => $param['order_sn']);
  231. $order_info = $model_order->getOrderInfo($condition,array('order_common','order_goods'));
  232. $model_express = Model('express');
  233. $express_info = $model_express->getExpressInfoByOMS($param['oms_code']);
  234. $data['reciver_name'] = $order_info['reciver_name'];
  235. $data['reciver_info'] = $order_info['reciver_info'];
  236. $data['deliver_explain'] = $order_info['deliver_explain'];
  237. $data['daddress_id'] = intval($order_info['daddress_id']);
  238. $data['shipping_express_id'] =intval($express_info['express_id']);
  239. $data['shipping_code'] = $param['shipping_code'];
  240. $logic_order = Logic('order');
  241. $result = $logic_order->changeOrderSend($order_info, 'seller', $order_info['buyer_name'], $data);
  242. return $result;
  243. }
  244. public function cancel_order($order_sn)
  245. {
  246. $param = array('type' => 'TRADE_INTERCEPT','data' => array('tids' => $order_sn,'remark' => '用户退款'));
  247. $body = json_encode($param,JSON_UNESCAPED_UNICODE);
  248. $sign = $this->sign($body);
  249. $headers = array('v_appkey: '.self::$appkey, 'v_sign: '.$sign, 'Content-Type: application/json');
  250. $resp = http_post_data(self::oms_url,urlencode($body),$headers);
  251. if($resp === false) {
  252. Log::record(__METHOD__ . " NET Error",Log::ERR);
  253. return false;
  254. }
  255. else {
  256. Log::record($resp,Log::DEBUG);
  257. }
  258. return true;
  259. }
  260. const CANCEL_SUCCESS = 99;
  261. public function query_order($order_sn)
  262. {
  263. $param = array('type' => 'TIDS_TRADE_STATUTS','data' => array('tids' => $order_sn,'remark' => '订单查询'));
  264. $body = json_encode($param,JSON_UNESCAPED_UNICODE);
  265. $sign = $this->sign($body);
  266. $headers = array('v_appkey: '.self::$appkey, 'v_sign: '.$sign, 'Content-Type: application/json');
  267. $resp = http_post_data(self::oms_url,urlencode($body),$headers);
  268. if($resp === false) {
  269. Log::record(__METHOD__ . " NET Error",Log::ERR);
  270. return false;
  271. }
  272. Log::record($resp,Log::DEBUG);
  273. //1:成功 0 :失败
  274. // 1:新订单 2:等待仓库处理 99:已拦截 90:库存不足 7:已发货
  275. // -99:发货失败 -2:订单关闭 -3:订单已存在(没有进行拦截的订单不予更新) -1:异常订单 -2:订单关闭
  276. $result = json_decode($resp, true);
  277. if (!empty($result) && is_array($result))
  278. {
  279. if ($result['apiCode'] == 'success')
  280. {
  281. if (!empty($result['data']) && is_array($result['data']) && count($result['data']) > 0)
  282. {
  283. $status = new OMSOrderStatus($result['data'][0]);
  284. return $status;
  285. }
  286. }
  287. }
  288. return false;
  289. }
  290. /**
  291. * @param $pay_sn
  292. * @param $trade_no
  293. * @param $result
  294. * @param $order_sn
  295. * @return mixed
  296. */
  297. private function check($resp,&$err_state,&$reson)
  298. {
  299. $err_state = 0;
  300. //1:成功 0 :失败
  301. // 1:新订单 2:等待仓库处理 99:已拦截 90:库存不足 7:已发货
  302. // -99:发货失败 -2:订单关闭 -3:订单已存在(没有进行拦截的订单不予更新) -1:异常订单 -2:订单关闭
  303. $result = json_decode($resp, true);
  304. if (!empty($result) && is_array($result))
  305. {
  306. if ($result['apiCode'] == 'success')
  307. {
  308. if (!empty($result['data']) && is_array($result['data']) && count($result['data']) > 0)
  309. {
  310. // 填充错误理由
  311. $reson = $result['data'][0]['errorMessge'];
  312. if (!empty($result['data'][0]['status'])) {
  313. $status = intval($result['data'][0]['status']);
  314. if ($status == 1 || $status == 2 || $status == 3 || $status == 7 || $status == 99) {
  315. return true;
  316. }
  317. } else {
  318. $msg = $result['data'][0]['errorMessge'];
  319. if (strstr($msg, '订单已存在')) {
  320. return true;
  321. } else {
  322. $err_state = 2;
  323. }
  324. }
  325. }
  326. }
  327. }
  328. return false;
  329. }
  330. }