Model_fedexv1.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. <?php
  2. class Model_Fedexv1 extends Lin_Model {
  3. function __construct(){
  4. parent::__construct();
  5. $this->load->_model('Model_aapeizhi','aapeizhi');
  6. $this->load->_model("Model_logic_ding",'logic_ding');
  7. }
  8. public $base_url = "https://apis.fedex.com.cn";
  9. public $f_config = [
  10. "account"=>"692362136",
  11. "key"=>"l7c6ae3d27cce34bdca31cf6e0ff4af125",
  12. 'secret' =>'475eb390bf334bda8b5f44f1c07b7c10',
  13. "client_id"=>"l7c6ae3d27cce34bdca31cf6e0ff4af125",
  14. "client_secret"=>"475eb390bf334bda8b5f44f1c07b7c10",
  15. ];
  16. public function getAccessToken(){
  17. $res = $this->setting->find("skey='fedex_v1_access_token'");
  18. if($res){
  19. if(time() > $res['expiretime']){
  20. $this->setting->query("DELETE FROM `crowd_setting` WHERE `skey`='fedex_v1_access_token'");
  21. return $this->makeAccessToken();
  22. }
  23. return $res['svalue'];
  24. }else{
  25. return $this->makeAccessToken();
  26. }
  27. }
  28. public function makeAccessToken(){
  29. $url = "/oauth/token";
  30. $headers = [
  31. "Content-Type:application/x-www-form-urlencoded",
  32. ];
  33. $params = [
  34. "grant_type"=>"client_credentials",
  35. "client_id"=> $this->f_config['client_id'],
  36. "client_secret"=> $this->f_config['client_secret'],
  37. ];
  38. $params=http_build_query($params);
  39. $res = $this->sendPost($url,$params,$headers);
  40. if(isset($res['access_token'])){
  41. $this->setting->insert([
  42. 'skey'=>"fedex_v1_access_token",
  43. 'svalue' => $res['access_token'],
  44. 'expiretime' => time() + 3600 -10
  45. ]);
  46. }
  47. return $res['access_token'];
  48. }
  49. private function setData($order_info){
  50. $customer_streets = [];
  51. $customer_streets[] = $order_info['address'];
  52. if(!empty($order_info['address2'])){
  53. $customer_streets[] = $order_info['address2'];
  54. }
  55. $state_codes = $this->aapeizhi->getFedexStateCode();
  56. $params = [
  57. "labelResponseOptions"=>"URL_ONLY",
  58. "accountNumber"=>[
  59. "value"=> (int)$this->f_config['account']
  60. ],
  61. "requestedShipment"=>[
  62. "shipper"=>[
  63. "contact"=>[
  64. "personName"=>"LONGYI",
  65. "phoneNumber"=>"18539006340",
  66. "companyName"=>"LONGYI",
  67. ],
  68. "address"=>[
  69. "streetLines"=> [
  70. "1403, Buliding C, Bodi Center",
  71. "NingWei Street, XiaoShan"
  72. ],
  73. "city"=>"Hangzhou",
  74. "stateOrProvinceCode"=>"",
  75. "postalCode"=>310000,//杭州邮编
  76. "countryCode"=>$order_info['warehouse']['lb']
  77. ],
  78. ],
  79. "recipients"=>[
  80. [
  81. "contact" => [
  82. "personName"=>$order_info['name'],
  83. "phoneNumber"=>$order_info['phone'],
  84. "companyName"=>$order_info['client']
  85. ],
  86. "address"=>[
  87. "streetLines" =>$customer_streets,
  88. "city"=>$order_info['city'],
  89. "stateOrProvinceCode"=>strlen($order_info['province'])==2?strtoupper($order_info['province']):$state_codes[strtolower($order_info['province'])],
  90. "postalCode"=>(string)$order_info['zipcode'],
  91. "countryCode"=>$order_info['lb'],
  92. ],
  93. ]
  94. ],
  95. "shipDatestamp"=>date("Y-m-d"),
  96. "serviceType"=>($order_info['js'] == 3)?"FEDEX_INTERNATIONAL_PRIORITY":"FEDEX_INTERNATIONAL_CONNECT_PLUS",
  97. "packagingType"=> "FEDEX_BOX",
  98. "pickupType"=>"DROPOFF_AT_FEDEX_LOCATION",
  99. "blockInsightVisibility"=>false,
  100. "shippingChargesPayment"=>[
  101. "paymentType"=>"SENDER"
  102. ],
  103. "shipmentSpecialServices"=>[
  104. "specialServiceTypes"=>[
  105. "ELECTRONIC_TRADE_DOCUMENTS",
  106. ],
  107. "etdDetail"=>[
  108. "requestedDocumentTypes"=>[
  109. "COMMERCIAL_INVOICE"
  110. ]
  111. ]
  112. ],
  113. "shippingDocumentSpecification"=>[
  114. "shippingDocumentTypes"=>[
  115. "COMMERCIAL_INVOICE"
  116. ],
  117. "commercialInvoiceDetail"=>[
  118. "documentFormat"=>[
  119. "docType"=>"PDF",
  120. "stockType"=>"PAPER_LETTER"
  121. ],
  122. "customerImageUsages"=>[
  123. [
  124. "id"=> "IMAGE_1",
  125. "type"=> "SIGNATURE",
  126. "providedImageType"=> "SIGNATURE"
  127. ],
  128. [
  129. "id"=> "IMAGE_2",
  130. "type"=> "LETTER_HEAD",
  131. "providedImageType"=> "LETTER_HEAD"
  132. ]
  133. ]
  134. ]
  135. ],
  136. "labelSpecification"=>[
  137. "imageType"=>"PDF",
  138. "labelStockType"=>"STOCK_4X6",
  139. "customerSpecifiedDetail"=>[
  140. "docTabContent"=>[
  141. "docTabContentType"=>"STANDARD"
  142. ]
  143. ]
  144. ],
  145. "customsClearanceDetail"=>[
  146. "dutiesPayment"=>[
  147. "paymentType"=>"SENDER",
  148. ],
  149. "documentContent"=>"COMMODITY",
  150. "commodities"=>[
  151. [
  152. "description"=>$order_info['sbpm'].'-'.$order_info['ts'].'PCS',
  153. "countryOfManufacture"=> "CN",
  154. "quantity"=> $order_info['ts'],
  155. "quantityUnits"=> "cm",
  156. "unitPrice"=> [
  157. "amount"=> $order_info['dtsbjz'],
  158. "currency"=> "USD"
  159. ],
  160. "customsValue"=> [
  161. "amount"=>$order_info['zsbjz'],
  162. "currency"=> "USD"
  163. ],
  164. "weight"=> [
  165. "units"=> "KG",
  166. "value"=> 0.4
  167. ]
  168. ]
  169. ]
  170. ],
  171. "requestedPackageLineItems"=>[
  172. [
  173. "weight"=>[
  174. "units"=>"KG",
  175. "value"=>0.4
  176. ]
  177. ]
  178. ]
  179. ]
  180. ];
  181. return $params;
  182. }
  183. //上传货物信息 获取运单 托运
  184. public function get_data($order_info){
  185. try{
  186. $url = "/ship/v1/shipments";
  187. $headers = [
  188. "x-customer-transaction-id"=>$order_info['number'],
  189. "Content-Type:application/json",
  190. "Authorization: Bearer ".$this->getAccessToken(),
  191. "x-locale" => "en_US",//这个是语种加国家
  192. "Accept: application/json",
  193. ];
  194. // echo "<pre>";
  195. // var_dump("Bearer ".$this->getAccessToken());
  196. $params = $this->setData($order_info);
  197. //var_dump($params);
  198. $params=json_encode($params);
  199. //var_dump($params);
  200. $res = $this->sendPost($url,$params,$headers);
  201. //var_dump(json_encode($res,JSON_UNESCAPED_UNICODE));
  202. //var_dump($res);
  203. //die;
  204. if(isset($res['code']) && $res['code'] == -1){
  205. return array('x'=>'0','Description'=>$res['msg']);
  206. }
  207. if(!isset($res["transactionId"])){
  208. return array('x'=>'0','Description'=>'请求异常');
  209. }
  210. if(isset($res["errors"])){
  211. return array('x'=>'0','Description'=>json_encode($res["errors"]));
  212. }
  213. $invoice_url = "";
  214. foreach($res['output']['transactionShipments'][0]['shipmentDocuments'] as $v){
  215. if($v['contentType'] == "COMMERCIAL_INVOICE"){
  216. $invoice_url = $v['url'];
  217. }
  218. }
  219. return
  220. [
  221. 'x'=>'1',
  222. 'waybill'=>$res['output']['transactionShipments'][0]['masterTrackingNumber'],
  223. 'label'=>$res['output']['transactionShipments'][0]['pieceResponses'][0]['packageDocuments'][0]['url'],
  224. 'invoice'=>$invoice_url,
  225. ];
  226. }catch(Exception $e){
  227. $error_msg = "error:[fedexv1]创建发货单出错".$e->getMessage()."|".$e->getLine()."|".$e->getFile()."|请求参数".json_encode($order_info,JSON_UNESCAPED_UNICODE);
  228. $this->logic_ding->sendToDing($error_msg);
  229. if(isset($res)){
  230. $error_msg = "error:[fedexv1]创建发货单出错".$e->getMessage()."|".$e->getLine()."|".$e->getFile()."|返回参数".json_encode($res,JSON_UNESCAPED_UNICODE);
  231. $this->logic_ding->sendToDing($error_msg);
  232. }
  233. }
  234. }
  235. //根据单号获取 快递信息
  236. public function get_logistics($number){
  237. }
  238. public function sendPost($url,$params,$headers){
  239. // var_dump($bodyString);
  240. // 设置请求的URL
  241. $all_url = $this->base_url.$url;
  242. var_dump($all_url);
  243. // 初始化cURL会话
  244. $ch = curl_init($all_url);
  245. // 设置cURL选项
  246. $options = array(
  247. CURLOPT_SSL_VERIFYPEER=>false,
  248. CURLOPT_SSL_VERIFYHOST=>false,
  249. CURLOPT_RETURNTRANSFER => true,
  250. CURLOPT_POST => true,
  251. CURLOPT_POSTFIELDS => $params,
  252. CURLOPT_HTTPHEADER => $headers,
  253. CURLOPT_ENCODING => "gzip,deflate"
  254. );
  255. // 应用这些选项到cURL会话
  256. curl_setopt_array($ch, $options);
  257. // 执行cURL会话并获取响应
  258. $response = curl_exec($ch);
  259. // 检查是否有错误发生
  260. if ($response === false) {
  261. $error = curl_error($ch);
  262. curl_close($ch);
  263. return [
  264. "code"=> -1,
  265. "msg"=> $error
  266. ];
  267. }
  268. // 关闭cURL会话
  269. curl_close($ch);
  270. // 输出响应内容
  271. return json_decode($response,true);
  272. }
  273. //上传数字签名 和 信头 接口在 文件上传api 主要就传一次 用postman传就行 不费事了 etd 必须先传
  274. public function upload_img(){
  275. $all_url = "https://documentapitest.prod.fedex.com/sandbox/documents/v1/lhsimages/upload";
  276. }
  277. public function send_sign(){
  278. $params = [
  279. "document"=>[
  280. "referenceId"=>"1234",
  281. "name"=>"sign.png",
  282. "contentType"=>"image/png",
  283. "meta"=>[
  284. "imageType"=>"SIGNATURE",
  285. "imageIndex"=>"IMAGE_1"
  286. ]
  287. ],
  288. "rules"=>[
  289. "workflowName"=> "LetterheadSignature"
  290. ]
  291. ];
  292. $body = [
  293. 'document'=>json_encode($params),
  294. 'attachment'=>new CURLFile("D:\wwwroot\cerp.wepolicy.cn\sign.png")
  295. ];
  296. $headers = [
  297. "x-customer-transaction-id"=>time(),
  298. "Content-Type:multipart/form-data",
  299. "Authorization: Bearer ".$this->getAccessToken(),
  300. "x-locale" => "en_US",//这个是语种加国家
  301. "Accept: application/json",
  302. ];
  303. $r = $this->send_img_post($body,$headers);
  304. echo "<pre>";
  305. var_dump($r);
  306. }
  307. public function send_xintou(){
  308. $params = [
  309. "document"=>[
  310. "referenceId"=>"1234",
  311. "name"=>"Logo.png",
  312. "contentType"=>"image/png",
  313. "meta"=>[
  314. "imageType"=>"LETTERHEAD",
  315. "imageIndex"=>"IMAGE_2"
  316. ]
  317. ],
  318. "rules"=>[
  319. "workflowName"=> "LetterheadSignature"
  320. ]
  321. ];
  322. $body = [
  323. 'document'=>json_encode($params),
  324. 'attachment'=>new CURLFile("D:\wwwroot\cerp.wepolicy.cn\Logo.png")
  325. ];
  326. $headers = [
  327. "x-customer-transaction-id"=>time(),
  328. "Content-Type:multipart/form-data",
  329. "Authorization: Bearer ".$this->getAccessToken(),
  330. "x-locale" => "en_US",//这个是语种加国家
  331. "Accept: application/json",
  332. ];
  333. $r = $this->send_img_post($body,$headers);
  334. echo "<pre>";
  335. var_dump($r);
  336. }
  337. public function send_img_post($body,$headers){
  338. $upload_img_url = "/documents/v1/lhsimages/upload";
  339. $all_url = "https://documentapi.prod.fedex.com/documents/v1/lhsimages/upload";
  340. var_dump($all_url);
  341. var_dump($body);
  342. // 初始化cURL会话
  343. $ch = curl_init($all_url);
  344. // 设置cURL选项
  345. $options = array(
  346. CURLOPT_SSL_VERIFYPEER=>false,
  347. CURLOPT_SSL_VERIFYHOST=>false,
  348. CURLOPT_RETURNTRANSFER => true,
  349. CURLOPT_POST => true,
  350. CURLOPT_POSTFIELDS => $body,
  351. CURLOPT_HTTPHEADER => $headers,
  352. CURLOPT_ENCODING => "gzip,deflate"
  353. );
  354. // 应用这些选项到cURL会话
  355. curl_setopt_array($ch, $options);
  356. // 执行cURL会话并获取响应
  357. $response = curl_exec($ch);
  358. // 检查是否有错误发生
  359. if ($response === false) {
  360. $error = curl_error($ch);
  361. curl_close($ch);
  362. return [
  363. "code"=> -1,
  364. "msg"=> $error
  365. ];
  366. }
  367. // 关闭cURL会话
  368. curl_close($ch);
  369. // 输出响应内容
  370. return json_decode($response,true);
  371. }
  372. }