Trace.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. <?php
  2. /*
  3. * FecShop file.
  4. *
  5. * @link http://www.fecshop.com/
  6. * @copyright Copyright (c) 2016 FecShop Software LLC
  7. * @license http://www.fecshop.com/license/
  8. */
  9. namespace fecshop\services\page;
  10. use fecshop\services\Service;
  11. use Yii;
  12. /**
  13. * page Footer services.
  14. * @author Terry Zhao <2358269014@qq.com>
  15. * @since 1.0
  16. */
  17. class Trace extends Service
  18. {
  19. public $traceJsEnable = true; // 是否打开js追踪
  20. public $website_id; // 网站的id,在trace系统中获取
  21. public $trace_url; // trace系统接收数据的url,在trace系统中获取
  22. public $trace_api_url;
  23. // 通过trace系统得到的token
  24. public $access_token;
  25. // api发送数据给trace系统的最大等待时间,超过这个时间将不继续等待
  26. public $api_time_out = 1;
  27. protected $_fta;
  28. protected $_ftactivity;
  29. protected $_ftactivity_child;
  30. protected $_fto;
  31. protected $_ftreferdomain;
  32. protected $_ftreferurl;
  33. protected $_ftreturn;
  34. protected $_fta_site_id; // website_id
  35. protected $_fid; // 广告id
  36. protected $_fec_medium; // 广告渠道
  37. protected $_fec_source; // 广告子渠道
  38. protected $_fec_campaign; // 广告活动
  39. protected $_fec_content; // 广告推广员
  40. protected $_fec_design; // 广告图片设计员
  41. const LOGIN_EMAIL = 'login_email';
  42. const REGISTER_EMAIL = 'register_email';
  43. const CART = 'cart';
  44. const PAYMENT_PENDING_ORDER = 'payment_pending_order';
  45. const PAYMENT_SUCCESS_ORDER = 'payment_success_order';
  46. /**
  47. * @return String, 通用的js部分,需要先设置 website_id 和 trace_url
  48. */
  49. public function getTraceCommonJsCode()
  50. {
  51. if ($this->traceJsEnable) {
  52. return "<script type=\"text/javascript\">
  53. var _maq = _maq || [];
  54. _maq.push(['website_id', '" . $this->website_id . "']);
  55. _maq.push(['fec_store', '" . Yii::$service->store->currentStore . "']);
  56. _maq.push(['fec_lang', '" . Yii::$service->store->currentLangCode . "']);
  57. _maq.push(['fec_app', '" . Yii::$service->store->getCurrentAppName() . "']);
  58. _maq.push(['fec_currency', '" . Yii::$service->page->currency->getCurrentCurrency() . "']);
  59. (function() {
  60. var ma = document.createElement('script'); ma.type = 'text/javascript'; ma.async = true;
  61. ma.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + '".$this->trace_url."';
  62. var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ma, s);
  63. })();
  64. </script>";
  65. } else {
  66. return '';
  67. }
  68. }
  69. /**
  70. * @param $categoryName | String , 填写分类的name,如果是多语言网站,那么这里填写默认语言的分类name
  71. * @return String, 分类页面的js Code
  72. */
  73. public function getTraceCategoryJsCode($categoryName)
  74. {
  75. if ($this->traceJsEnable && $categoryName) {
  76. return "<script type=\"text/javascript\">
  77. var _maq = _maq || [];
  78. _maq.push(['category', '".$categoryName."']);
  79. </script>";
  80. } else {
  81. return '';
  82. }
  83. }
  84. /**
  85. * @param $sku | String , 产品页面的sku编码
  86. * @return String, 产品页面的js Code
  87. * <?= Yii::$service->page->trace->getTraceProductJsCode($sku) ?>
  88. */
  89. public function getTraceProductJsCode($sku)
  90. {
  91. if ($this->traceJsEnable && $sku) {
  92. return "<script type=\"text/javascript\">
  93. var _maq = _maq || [];
  94. _maq.push(['sku', '".$sku."']);
  95. </script>";
  96. } else {
  97. return '';
  98. }
  99. }
  100. /**
  101. * @param $cart | String , 购物车数据,示例JSON数据:
  102. * [
  103. * {
  104. * "sku":"grxjy56002622",
  105. * "qty":1,
  106. * "price":35.52
  107. * },
  108. * {
  109. * "sku":"grxjy5606622",
  110. * "qty":4,
  111. * "price":75.11
  112. * }
  113. * ]
  114. *
  115. * @return String, 购物车页面的js Code
  116. */
  117. public function getTraceCartJsCode($cart)
  118. {
  119. if ($this->traceJsEnable && $cart) {
  120. return "<script type=\"text/javascript\">
  121. var _maq = _maq || [];
  122. _maq.push(['cart', ".$cart."]);
  123. </script>";
  124. } else {
  125. return '';
  126. }
  127. }
  128. /**
  129. * @param $search | String ,搜索的json格式如下:
  130. * {
  131. * "text": "fashion handbag", // 搜索词
  132. * "result_qty":5 // 搜索的产品个数
  133. * }
  134. * @return String, 注册页面的js Code
  135. */
  136. public function getTraceSearchJsCode($search)
  137. {
  138. if ($this->traceJsEnable && $search) {
  139. return "<script type=\"text/javascript\">
  140. var _maq = _maq || [];
  141. _maq.push(['search', ".$search." ]);
  142. </script>";
  143. } else {
  144. return '';
  145. }
  146. }
  147. public function initCookie()
  148. {
  149. // 判断当前是否是appserver端,如果是,则从 Yii::$app->request->post('cookies') 中获取
  150. if (Yii::$service->helper->isApiApp()) {
  151. \Yii::info('is ApiApp', 'fecshop_debug');
  152. $cookies = Yii::$app->request->post('cookies');
  153. } else {
  154. \Yii::info('is not ApiApp', 'fecshop_debug');
  155. $cookies = $_COOKIE;
  156. }
  157. // params.uuid
  158. $this->_fta = $cookies['_fta'];
  159. // params.cl_activity
  160. $this->_ftactivity = $cookies['_ftactivity'];
  161. // params.cl_activity_child
  162. $this->_ftactivity_child = $cookies['_ftactivity_child'];
  163. // params.first_page if(_fto){ first_page = 0 } else { first_page = 1 }
  164. $this->_fto = $cookies['_fto'];
  165. // params.first_referrer_domain
  166. $this->_ftreferdomain = $cookies['_ftreferdomain'];
  167. // params.first_referrer_url
  168. $this->_ftreferurl = $cookies['_ftreferurl'];
  169. // params.is_return
  170. $this->_ftreturn = $cookies['_ftreturn'];
  171. // params.website_id
  172. $this->_fta_site_id = $cookies['_fta_site_id'];
  173. if (!$this->_fta_site_id) {
  174. // 对于paypal ipn修改订单状态,website_id的值从配置中读取
  175. $this->_fta_site_id = $this->website_id;
  176. }
  177. // params.fid
  178. $this->_fid = $cookies['fid'];
  179. // params.fec_medium
  180. $this->_fec_medium = $cookies['fec_medium'];
  181. // params.fec_source
  182. $this->_fec_source = $cookies['fec_source'];
  183. // params.fec_campaign
  184. $this->_fec_campaign = $cookies['fec_campaign'];
  185. // params.fec_content
  186. $this->_fec_content = $cookies['fec_content'];
  187. // params.fec_design
  188. $this->_fec_design = $cookies['fec_design'];
  189. }
  190. // 登录账户,通过api传递数据给trace系统 【已经部署到customer service login函数里面】
  191. public function sendTraceLoginInfoByApi($login_email)
  192. {
  193. if ($this->traceJsEnable && $login_email) {
  194. $this->apiSendTrace([
  195. self::LOGIN_EMAIL => $login_email,
  196. ]);
  197. }
  198. }
  199. // 注册账户,通过api传递数据给trace系统【已经部署到customer service register函数里面】
  200. public function sendTraceRegisterInfoByApi($register_email)
  201. {
  202. if ($this->traceJsEnable && $register_email) {
  203. $this->apiSendTrace([
  204. self::REGISTER_EMAIL => $register_email,
  205. ]);
  206. }
  207. }
  208. // 产品加入购物车,通过api传递数据给trace系统 sku, qty, price
  209. public function sendTraceAddToCartInfoByApi($cart_info)
  210. {
  211. if ($this->traceJsEnable && $cart_info) {
  212. $this->apiSendTrace([
  213. self::CART => $cart_info,
  214. ]);
  215. }
  216. }
  217. // 订单生成成功,通过api传递数据给trace系统
  218. public function sendTracePaymentPendingOrderByApi($order)
  219. {
  220. if ($this->traceJsEnable && $order) {
  221. $this->apiSendTrace([
  222. self::PAYMENT_PENDING_ORDER => $order,
  223. ]);
  224. }
  225. }
  226. // 订单支付成功,通过api传递数据给trace系统
  227. public function sendTracePaymentSuccessOrderByApi($order)
  228. {
  229. if ($this->traceJsEnable && $order) {
  230. $this->apiSendTrace([
  231. self::PAYMENT_SUCCESS_ORDER => $order,
  232. ]);
  233. }
  234. }
  235. /**
  236. * @param $data | Array,目前分类四类:loginEmail, registerEmail, paymentPendingOrder, paymentSuccessOrder,
  237. *
  238. *
  239. */
  240. public function apiSendTrace($data)
  241. {
  242. \Yii::info('apiSendTrace-data', 'fecshop_debug');
  243. ob_start();
  244. ob_implicit_flush(false);
  245. var_dump($data);
  246. $post_log = ob_get_clean();
  247. \Yii::info($post_log, 'fecshop_debug');
  248. // 发送的数据
  249. $this->initCookie();
  250. \Yii::info('apiSendTrace', 'fecshop_debug');
  251. // 对于paypal ipn请求,website_id 从配置中读取。
  252. // params.website_id
  253. $data['website_id'] = $this->_fta_site_id;
  254. $data['fec_store'] = Yii::$service->store->currentStore;
  255. $data['fec_lang'] = Yii::$service->store->currentLangCode;
  256. $data['fec_app'] = Yii::$service->store->getCurrentAppName();
  257. $data['fec_currency'] = Yii::$service->page->currency->getCurrentCurrency();
  258. \Yii::info('begin apiSendTrace data', 'fecshop_debug');
  259. // 进行条件判断
  260. if ($this->_fta) {
  261. \Yii::info('_fta', 'fecshop_debug');
  262. // params.uuid
  263. $data['uuid'] = $this->_fta;
  264. // params.cl_activity
  265. $data['cl_activity'] = $this->_ftactivity;
  266. // params.cl_activity_child
  267. $data['cl_activity_child'] = $this->_ftactivity_child;
  268. // params.first_page if(_fto){ first_page = 0 } else { first_page = 1 }
  269. // if ($this->_fto) {
  270. // $data['first_page'] = '0';
  271. //} else {
  272. // $data['first_page'] = '1';
  273. //}
  274. $data['first_page'] = '0';
  275. // params.first_referrer_domain
  276. $data['first_referrer_domain'] = $this->_ftreferdomain;
  277. // params.first_referrer_url
  278. $data['first_referrer_url'] = $this->_ftreferurl;
  279. // params.is_return
  280. $data['is_return'] = $this->_ftreturn;
  281. // params.fid
  282. $data['fid'] = $this->_fid;
  283. // params.fec_medium
  284. $data['fec_medium'] = $this->_fec_medium;
  285. // params.fec_source
  286. $data['fec_source'] = $this->_fec_source;
  287. // params.fec_campaign
  288. $data['fec_campaign'] = $this->_fec_campaign;
  289. // params.fec_content
  290. $data['fec_content'] = $this->_fec_content;
  291. // params.fec_design
  292. $data['fec_design'] = $this->_fec_design;
  293. //var_dump($data);
  294. ////var_dump($_COOKIE);
  295. //exit;
  296. // curl 发送数据
  297. $this->apiSend($data);
  298. // 完成
  299. return true;
  300. // 如果是paypal ipn发送订单支付成功信息,则使用下面的方式发送数据给trace系统,用于更新订单状态
  301. } elseif (isset($data[self::PAYMENT_SUCCESS_ORDER]) && $data[self::PAYMENT_SUCCESS_ORDER]) {
  302. \Yii::info(self::PAYMENT_SUCCESS_ORDER, 'fecshop_debug');
  303. $this->apiSend($data);
  304. return true;
  305. }
  306. }
  307. /**
  308. * @param $data | Array, 传递给统计系统的数据。
  309. * 通过curl函数,发送数据给统计系统,在使用前,您需要配置
  310. * `trace_api_url` `api_time_out` `access_token`
  311. */
  312. public function apiSend($data)
  313. {
  314. // var_dump($data);exit;
  315. $data = json_encode($data);
  316. $ch = curl_init();
  317. //设置选项,包括URL
  318. curl_setopt($ch, CURLOPT_URL, $this->trace_api_url);
  319. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  320. curl_setopt($ch, CURLOPT_HEADER, 0);
  321. curl_setopt($ch, CURLOPT_TIMEOUT, $this->api_time_out); //定义超时3秒钟
  322. // POST数据
  323. curl_setopt($ch, CURLOPT_POST, 1);
  324. curl_setopt(
  325. $ch,
  326. CURLOPT_HTTPHEADER,
  327. [
  328. 'Accept: application/json',
  329. 'Content-Type: application/json',
  330. 'Access-Token: '.$this->access_token,
  331. 'Content-Length: ' . strlen($data)
  332. ]
  333. );
  334. // 把post的变量加上
  335. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  336. //执行并获取url地址的内容
  337. $output = curl_exec($ch);
  338. // echo $this->trace_url."\n";
  339. // echo $this->api_time_out."\n";
  340. // echo $this->access_token."\n";
  341. // var_dump($data);
  342. // var_dump($output) ;exit;
  343. //释放curl句柄
  344. curl_close($ch);
  345. \Yii::info('#################', 'fecshop_debug');
  346. \Yii::info($output, 'fecshop_debug');
  347. //var_dump($output);exit;
  348. return $output;
  349. }
  350. /**
  351. * @param $order | String , 订单数据,示例JSON数据:
  352. * {
  353. * "invoice": "500023149", // 订单号
  354. * "order_type": "standard or express", // standard(标准支付流程类型)express(基于api的支付类型,譬如paypal快捷支付。)
  355. * "payment_status":"pending", // pending(未支付成功)
  356. * "payment_type":"paypal", // 支付渠道,譬如是paypal还是西联等支付渠道
  357. * //"currency":"RMB", // 当前货币
  358. * //"currency_rate":6.2, // 公式:当前金额 * 汇率 = 美元金额
  359. * "amount":35.52, // 订单总金额
  360. * "shipping":0.00, // 运费金额
  361. * "discount_amount":0.00, // 折扣金额
  362. * "coupon":"xxxxx", // 优惠券,没有则为空
  363. * "city":"fdasfds", // 城市
  364. *
  365. * "email":"2358269014@qq.com", // 下单填写的email
  366. * "first_name":"terry", //
  367. * "last_name":"water", //
  368. * "zip":"266326", // 邮编
  369. * "country_code":"US", // 国家简码
  370. * "state_code":"CT", // 省或州
  371. * "country_name":"Unit states", // 国家简码
  372. * "state_name":"ctrssf", // 省或州
  373. * "address1":"address street 1", // 详细地址1
  374. * "address2":"address street 2", // 详细地址2
  375. * "products":[ // 产品详情
  376. * {
  377. * "sku":"xxxxyr", // sku
  378. * "name":"Fashion Solid Color Warm Coat", // 产品名称
  379. * "qty":1, // 个数
  380. * "price":25.92 // 产品单价
  381. * },
  382. * {
  383. * "sku":"yyyy", // sku
  384. * "name":"Fashion Waist Warm Coat", // 产品名称
  385. * "qty":1, // 个数
  386. * "price":34.16 // 产品单价
  387. * }
  388. * ]
  389. * }
  390. *
  391. * @return String, 未支付订单页面的js Code
  392. */
  393. /* 改成api发送数据
  394. public function getTraceOrderJsCode($order){
  395. if ($this->traceJsEnable && $order) {
  396. return "<script type=\"text/javascript\">
  397. var _maq = _maq || [];
  398. _maq.push(['order', ".$order."]);
  399. </script>";
  400. } else {
  401. return '';
  402. }
  403. }
  404. */
  405. /**
  406. * @param $order | String , 订单数据,示例JSON数据:
  407. * {
  408. * "invoice": "500023149", // 订单号
  409. * "order_type": "standard or express", // standard(标准支付流程类型)express(基于api的支付类型,譬如paypal快捷支付。)
  410. * "payment_status":"pending", // pending(未支付成功)
  411. * "payment_type":"paypal", // 支付渠道,譬如是paypal还是西联等支付渠道
  412. * // "currency":"RMB", // 当前货币
  413. * // "currency_rate":6.2, // 公式:当前金额 * 汇率 = 美元金额
  414. * "amount":35.52, // 订单总金额
  415. * "shipping":0.00, // 运费金额
  416. * "discount_amount":0.00, // 折扣金额
  417. * "coupon":"xxxxx", // 优惠券,没有则为空
  418. * "city":"fdasfds", // 城市
  419. *
  420. * "email":"2358269014@qq.com", // 下单填写的email
  421. * "first_name":"terry", //
  422. * "last_name":"water", //
  423. * "zip":"266326", // 邮编
  424. * "country_code":"US", // 国家简码
  425. * "state_code":"CT", // 省或州
  426. * "country_name":"Unit states", // 国家简码
  427. * "state_name":"ctrssf", // 省或州
  428. * "address1":"address street 1", // 详细地址1
  429. * "address2":"address street 2", // 详细地址2
  430. * "products":[ // 产品详情
  431. * {
  432. * "sku":"xxxxyr", // sku
  433. * "name":"Fashion Solid Color Warm Coat", // 产品名称
  434. * "qty":1, // 个数
  435. * "price":25.92 // 产品单价
  436. * },
  437. * {
  438. * "sku":"yyyy", // sku
  439. * "name":"Fashion Waist Warm Coat", // 产品名称
  440. * "qty":1, // 个数
  441. * "price":34.16 // 产品单价
  442. * }
  443. * ]
  444. * }
  445. *
  446. * @return String, 支付成功订单页面的js Code
  447. */
  448. /* 改成api发送数据
  449. public function getTraceSuccessOrderJsCode($successOrder){
  450. if ($this->traceJsEnable && $successOrder) {
  451. return "<script type=\"text/javascript\">
  452. var _maq = _maq || [];
  453. _maq.push(['successOrder', ".$successOrder."]);
  454. </script>";
  455. } else {
  456. return '';
  457. }
  458. }
  459. */
  460. /**
  461. * @param $login_email | String , 登录的email
  462. * @return String, 登录页面的js Code
  463. */
  464. /* 改成api发送数据
  465. public function getTraceLoginJsCode($login_email){
  466. if ($this->traceJsEnable && $login_email) {
  467. return "<script type=\"text/javascript\">
  468. var _maq = _maq || [];
  469. _maq.push(['login_email', '".$login_email."']);
  470. </script>";
  471. } else {
  472. return '';
  473. }
  474. }
  475. */
  476. /**
  477. * @param $register_email | String , 注册的email
  478. * @return String, 注册页面的js Code
  479. */
  480. /* 改成api发送数据
  481. public function getTraceRegisterJsCode($register_email){
  482. if ($this->traceJsEnable && $register_email) {
  483. return "<script type=\"text/javascript\">
  484. var _maq = _maq || [];
  485. _maq.push(['register_email', '".$register_email."']);
  486. </script>";
  487. } else {
  488. return '';
  489. }
  490. }
  491. */
  492. }