Quhulian.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. /**
  3. * Quhulian.php UTF-8
  4. * huosdk_mini_program
  5. *
  6. * @date : 2019/3/21 13:56
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : chenbingling <cbl@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huomp\controller\cpa_reversal;
  13. use huo\controller\common\Base;
  14. use huolib\constant\MemConst;
  15. use huolib\tool\StrUtils;
  16. use huomp\model\agent\AgentAdsCfgModel;
  17. use huomp\model\log\LogAdsQuhulianModel;
  18. use think\Log;
  19. class Quhulian extends Base {
  20. private $url = ''; //异步地址
  21. private $key = ''; //密钥
  22. /***
  23. * 趣互联异步通知
  24. *
  25. * @param $data
  26. *
  27. * @return bool
  28. */
  29. public function QuhulianNotify($data) {
  30. if (MemConst::MEMBER_OLD == $data['status']) {
  31. return $this->insertLog($data);
  32. }
  33. if (empty($data['openid_m']) || empty($data['device_id'])) {
  34. return true;
  35. }
  36. if (empty($data['agent_id'])) {
  37. Log::write(
  38. 'line='.__LINE__.'&func='.__FUNCTION__.'&class='.__CLASS__.'&param='.json_encode($data).'&msg=缺少渠道参数',
  39. Log::ERROR
  40. );
  41. return false;
  42. }
  43. $_rs = $this->getAgentCfg($data['agent_id']);
  44. if (false == $_rs) {
  45. Log::write(
  46. 'line='.__LINE__.'&func='.__FUNCTION__.'&class='.__CLASS__.'&param='.json_encode($data).'&rs='
  47. .json_encode($_rs).'&msg=缺少渠道参数', Log::ERROR
  48. );
  49. return false;
  50. }
  51. $_param = $this->setParam($data);
  52. $_i = 0;
  53. $_return = false;
  54. while (1) {
  55. $_i++;
  56. $_rs = $this->curlBack($this->url, $_param);
  57. if ($_rs > 0) {
  58. $_return = true;
  59. $this->insertLog($data);
  60. break;
  61. } else {
  62. sleep(1);
  63. }
  64. if ($_i == 3) {
  65. break;
  66. }
  67. }
  68. return $_return;
  69. }
  70. /**
  71. * 插入记录
  72. *
  73. * @param $data
  74. *
  75. * @return bool
  76. */
  77. public function insertLog($data) {
  78. $_data = [
  79. 'mp_id' => get_val($data, 'mp_id'),
  80. 'openid' => get_val($data, 'openid'),
  81. 'openid_m' => get_val($data, 'openid_m'),
  82. 'device_id' => get_val($data, 'device_id'),
  83. 'mem_id' => get_val($data, 'mem_id', 0),
  84. 'status' => get_val($data, 'status', 1),
  85. ];
  86. $_rs = (new LogAdsQuhulianModel())->addData($_data);
  87. if (false == $_rs) {
  88. Log::write(
  89. 'line='.__LINE__.'&func='.__FUNCTION__.'&class='.__CLASS__.'&param='.json_encode([$data, $_data]).'&rs='
  90. .json_encode($_rs), Log::ERROR
  91. );
  92. }
  93. return $_rs;
  94. }
  95. /**
  96. * 获取配置信息
  97. *
  98. * @param $agent_id
  99. *
  100. * @return bool
  101. */
  102. public function getAgentCfg($agent_id) {
  103. $_cfg = (new AgentAdsCfgModel())->getInfoByAgentId($agent_id);
  104. if (empty($_cfg)) {
  105. return false;
  106. }
  107. if (empty($_cfg['back_url']) || empty($_cfg['key'])) {
  108. return false;
  109. }
  110. $this->url = $_cfg['back_url'];
  111. $this->key = $_cfg['key'];
  112. return true;
  113. }
  114. /**
  115. * 设置回调参数
  116. *
  117. * @param array $data
  118. *
  119. * @return bool|string
  120. */
  121. public function setParam($data = []) {
  122. $_rq_data['openid_m'] = get_val($data, 'openid_m');
  123. $_rq_data['openid_x'] = get_val($data, 'openid');
  124. $_rq_data['appid'] = get_val($data, 'mp_id');
  125. $_rq_data['device_id'] = get_val($data, 'device_id');
  126. $_param = StrUtils::argSort($_rq_data);
  127. $_sign_str = StrUtils::createLinkString($_param);
  128. $_sign = strtoupper(md5($_sign_str."&key=".$this->key));
  129. $_rq_data['sign'] = $_sign;
  130. return $_sign_str."&sign=".$_sign;
  131. }
  132. /**
  133. * 回调请求函数
  134. *
  135. * @param $url string 请求地址与端口
  136. * @param $params string post数据
  137. *
  138. * @return int 请求结果
  139. */
  140. public static function curlBack($url, $params) {
  141. $curl = curl_init(); //初始化curl
  142. curl_setopt($curl, CURLOPT_URL, $url);
  143. curl_setopt($curl, CURLOPT_HEADER, 0); // 过滤HTTP头
  144. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
  145. curl_setopt($curl, CURLOPT_POST, 1); // post传输数据
  146. curl_setopt($curl, CURLOPT_POSTFIELDS, $params);// post传输数据
  147. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);//设置等待时间
  148. //https 请求
  149. if (strlen($url) > 5 && strtolower(substr($url, 0, 5)) == "https") {
  150. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  151. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  152. }
  153. $header = array("Content-Type: application/x-www-form-urlencoded; charset=UTF-8");
  154. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  155. //https 请求
  156. if (strlen($url) > 5 && strtolower(substr($url, 0, 5)) == "https") {
  157. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  158. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  159. }
  160. $_rs = curl_exec($curl);
  161. curl_close($curl);
  162. if (isset($_rs['errno']) && 0 == $_rs['errno']) {
  163. $result = 1;
  164. } else {
  165. Log::write(
  166. 'line='.__LINE__.'&func='.__FUNCTION__.'&class='.__CLASS__.'&param='.json_encode($params).'&rs='
  167. .json_encode($_rs), Log::ERROR
  168. );
  169. $result = 0;
  170. }
  171. return $result;
  172. }
  173. }