Model_fedexv1.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  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. ]
  123. ],
  124. "labelSpecification"=>[
  125. "imageType"=>"PDF",
  126. "labelStockType"=>"STOCK_4X6",
  127. "customerSpecifiedDetail"=>[
  128. "docTabContent"=>[
  129. "docTabContentType"=>"STANDARD"
  130. ]
  131. ]
  132. ],
  133. "customsClearanceDetail"=>[
  134. "dutiesPayment"=>[
  135. "paymentType"=>"SENDER",
  136. ],
  137. "documentContent"=>"COMMODITY",
  138. "commodities"=>[
  139. [
  140. "description"=>$order_info['sbpm'].'-'.$order_info['ts'].'PCS',
  141. "countryOfManufacture"=> "CN",
  142. "quantity"=> $order_info['ts'],
  143. "quantityUnits"=> "cm",
  144. "unitPrice"=> [
  145. "amount"=> $order_info['dtsbjz'],
  146. "currency"=> "USD"
  147. ],
  148. "customsValue"=> [
  149. "amount"=>$order_info['zsbjz'],
  150. "currency"=> "USD"
  151. ],
  152. "weight"=> [
  153. "units"=> "KG",
  154. "value"=> 0.4
  155. ]
  156. ]
  157. ]
  158. ],
  159. "requestedPackageLineItems"=>[
  160. [
  161. "weight"=>[
  162. "units"=>"KG",
  163. "value"=>0.4
  164. ]
  165. ]
  166. ]
  167. ]
  168. ];
  169. return $params;
  170. }
  171. //上传货物信息 获取运单 托运
  172. public function get_data($order_info){
  173. try{
  174. $url = "/ship/v1/shipments";
  175. $headers = [
  176. "x-customer-transaction-id"=>$order_info['number'],
  177. "Content-Type:application/json",
  178. "Authorization: Bearer ".$this->getAccessToken(),
  179. "x-locale" => "en_US",//这个是语种加国家
  180. "Accept: application/json",
  181. ];
  182. echo "<pre>";
  183. var_dump("Bearer ".$this->getAccessToken());
  184. $params = $this->setData($order_info);
  185. $params=json_encode($params);
  186. var_dump($params);
  187. $res = $this->sendPost($url,$params,$headers);
  188. var_dump(json_encode($res,JSON_UNESCAPED_UNICODE));
  189. var_dump($res);
  190. die;
  191. if(isset($res['code']) && $res['code'] == -1){
  192. return array('x'=>'0','Description'=>$res['msg']);
  193. }
  194. if(!isset($res["transactionId"])){
  195. return array('x'=>'0','Description'=>'请求异常');
  196. }
  197. if(isset($res["errors"])){
  198. return array('x'=>'0','Description'=>json_encode($res["errors"]));
  199. }
  200. $invoice_url = "";
  201. foreach($res['output']['transactionShipments'][0]['shipmentDocuments'] as $v){
  202. if($v['contentType'] == "COMMERCIAL_INVOICE"){
  203. $invoice_url = $v['url'];
  204. }
  205. }
  206. return
  207. [
  208. 'x'=>'1',
  209. 'waybill'=>$res['output']['transactionShipments'][0]['masterTrackingNumber'],
  210. 'label'=>$res['output']['transactionShipments'][0]['pieceResponses'][0]['packageDocuments'][0]['url'],
  211. 'invoice'=>$invoice_url,
  212. ];
  213. }catch(Exception $e){
  214. $error_msg = "error:[fedexv1]创建发货单出错".$e->getMessage()."|".$e->getLine()."|".$e->getFile()."|请求参数".json_encode($order_info,JSON_UNESCAPED_UNICODE);
  215. $this->logic_ding->sendToDing($error_msg);
  216. if(isset($res)){
  217. $error_msg = "error:[fedexv1]创建发货单出错".$e->getMessage()."|".$e->getLine()."|".$e->getFile()."|返回参数".json_encode($res,JSON_UNESCAPED_UNICODE);
  218. $this->logic_ding->sendToDing($error_msg);
  219. }
  220. }
  221. }
  222. //根据单号获取 快递信息
  223. public function get_logistics($number){
  224. }
  225. public function sendPost($url,$params,$headers){
  226. // var_dump($bodyString);
  227. // 设置请求的URL
  228. $all_url = $this->base_url.$url;
  229. var_dump($all_url);
  230. // 初始化cURL会话
  231. $ch = curl_init($all_url);
  232. // 设置cURL选项
  233. $options = array(
  234. CURLOPT_SSL_VERIFYPEER=>false,
  235. CURLOPT_SSL_VERIFYHOST=>false,
  236. CURLOPT_RETURNTRANSFER => true,
  237. CURLOPT_POST => true,
  238. CURLOPT_POSTFIELDS => $params,
  239. CURLOPT_HTTPHEADER => $headers,
  240. CURLOPT_ENCODING => "gzip,deflate"
  241. );
  242. // 应用这些选项到cURL会话
  243. curl_setopt_array($ch, $options);
  244. // 执行cURL会话并获取响应
  245. $response = curl_exec($ch);
  246. // 检查是否有错误发生
  247. if ($response === false) {
  248. $error = curl_error($ch);
  249. curl_close($ch);
  250. return [
  251. "code"=> -1,
  252. "msg"=> $error
  253. ];
  254. }
  255. // 关闭cURL会话
  256. curl_close($ch);
  257. // 输出响应内容
  258. return json_decode($response,true);
  259. }
  260. //上传数字签名 和 信头 接口在 文件上传api 主要就传一次 用postman传就行 不费事了 etd 必须先传
  261. public function upload_img(){
  262. $all_url = "https://documentapitest.prod.fedex.com/sandbox/documents/v1/lhsimages/upload";
  263. }
  264. public function send_sign(){
  265. $params = [
  266. "document"=>[
  267. "referenceId"=>"1234",
  268. "name"=>"sign.png",
  269. "contentType"=>"image/png",
  270. "meta"=>[
  271. "imageType"=>"SIGNATURE",
  272. "imageIndex"=>"IMAGE_1"
  273. ]
  274. ],
  275. "rules"=>[
  276. "workflowName"=> "LetterheadSignature"
  277. ]
  278. ];
  279. $body = [
  280. 'document'=>json_encode($params),
  281. 'attachment'=>new CURLFile("D:\wwwroot\cerp.wepolicy.cn\sign.png")
  282. ];
  283. $headers = [
  284. "x-customer-transaction-id"=>time(),
  285. "Content-Type:multipart/form-data",
  286. "Authorization: Bearer ".$this->getAccessToken(),
  287. "x-locale" => "en_US",//这个是语种加国家
  288. "Accept: application/json",
  289. ];
  290. $r = $this->send_img_post($body,$headers);
  291. echo "<pre>";
  292. var_dump($r);
  293. }
  294. public function send_xintou(){
  295. $params = [
  296. "document"=>[
  297. "referenceId"=>"1234",
  298. "name"=>"Logo.png",
  299. "contentType"=>"image/png",
  300. "meta"=>[
  301. "imageType"=>"LETTERHEAD",
  302. "imageIndex"=>"IMAGE_2"
  303. ]
  304. ],
  305. "rules"=>[
  306. "workflowName"=> "LetterheadSignature"
  307. ]
  308. ];
  309. $body = [
  310. 'document'=>json_encode($params),
  311. 'attachment'=>new CURLFile("D:\wwwroot\cerp.wepolicy.cn\Logo.png")
  312. ];
  313. $headers = [
  314. "x-customer-transaction-id"=>time(),
  315. "Content-Type:multipart/form-data",
  316. "Authorization: Bearer ".$this->getAccessToken(),
  317. "x-locale" => "en_US",//这个是语种加国家
  318. "Accept: application/json",
  319. ];
  320. $r = $this->send_img_post($body,$headers);
  321. echo "<pre>";
  322. var_dump($r);
  323. }
  324. public function send_img_post($body,$headers){
  325. $upload_img_url = "/documents/v1/lhsimages/upload";
  326. $all_url = "https://documentapi.prod.fedex.com/documents/v1/lhsimages/upload";
  327. var_dump($all_url);
  328. var_dump($body);
  329. // 初始化cURL会话
  330. $ch = curl_init($all_url);
  331. // 设置cURL选项
  332. $options = array(
  333. CURLOPT_SSL_VERIFYPEER=>false,
  334. CURLOPT_SSL_VERIFYHOST=>false,
  335. CURLOPT_RETURNTRANSFER => true,
  336. CURLOPT_POST => true,
  337. CURLOPT_POSTFIELDS => $body,
  338. CURLOPT_HTTPHEADER => $headers,
  339. CURLOPT_ENCODING => "gzip,deflate"
  340. );
  341. // 应用这些选项到cURL会话
  342. curl_setopt_array($ch, $options);
  343. // 执行cURL会话并获取响应
  344. $response = curl_exec($ch);
  345. // 检查是否有错误发生
  346. if ($response === false) {
  347. $error = curl_error($ch);
  348. curl_close($ch);
  349. return [
  350. "code"=> -1,
  351. "msg"=> $error
  352. ];
  353. }
  354. // 关闭cURL会话
  355. curl_close($ch);
  356. // 输出响应内容
  357. return json_decode($response,true);
  358. }
  359. }