WxBase.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. namespace app\common\library\wechat;
  3. use think\Cache;
  4. use app\common\exception\BaseException;
  5. /**
  6. * 微信api基类
  7. * Class wechat
  8. * @package app\library
  9. */
  10. class WxBase
  11. {
  12. protected $appId;
  13. protected $appSecret;
  14. protected $error;
  15. /**
  16. * 构造函数
  17. * WxBase constructor.
  18. * @param $appId
  19. * @param $appSecret
  20. */
  21. public function __construct($appId = null, $appSecret = null)
  22. {
  23. $this->setConfig($appId, $appSecret);
  24. }
  25. protected function setConfig($appId = null, $appSecret = null)
  26. {
  27. !empty($appId) && $this->appId = $appId;
  28. !empty($appSecret) && $this->appSecret = $appSecret;
  29. }
  30. /**
  31. * 写入日志记录
  32. * @param $values
  33. * @return bool|int
  34. */
  35. protected function doLogs($values)
  36. {
  37. return log_write($values);
  38. }
  39. /**
  40. * 获取access_token
  41. * @return mixed
  42. * @throws BaseException
  43. */
  44. protected function getAccessToken()
  45. {
  46. $cacheKey = $this->appId . '@access_token';
  47. if (!Cache::get($cacheKey)) {
  48. // 请求API获取 access_token
  49. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}";
  50. $result = $this->get($url);
  51. $data = $this->jsonDecode($result);
  52. if (array_key_exists('errcode', $data)) {
  53. throw new BaseException(['msg' => "access_token获取失败,错误信息:{$result}"]);
  54. }
  55. // 记录日志
  56. $this->doLogs([
  57. 'describe' => '获取access_token',
  58. 'url' => $url,
  59. 'appId' => $this->appId,
  60. 'result' => $result
  61. ]);
  62. // 写入缓存
  63. Cache::set($cacheKey, $data['access_token'], 6000); // 7000
  64. }
  65. return Cache::get($cacheKey);
  66. }
  67. /**
  68. * 模拟GET请求 HTTPS的页面
  69. * @param string $url 请求地址
  70. * @return string $result
  71. */
  72. protected function get($url)
  73. {
  74. $curl = curl_init();
  75. curl_setopt($curl, CURLOPT_URL, $url);
  76. curl_setopt($curl, CURLOPT_HEADER, 0);
  77. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  78. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
  79. $result = curl_exec($curl);
  80. curl_close($curl);
  81. return $result;
  82. }
  83. /**
  84. * 模拟POST请求
  85. * @param $url
  86. * @param array $data
  87. * @param bool $useCert
  88. * @param array $sslCert
  89. * @return mixed
  90. */
  91. protected function post($url, $data = [], $useCert = false, $sslCert = [])
  92. {
  93. $header = [
  94. 'Content-type: application/json;'
  95. ];
  96. $curl = curl_init();
  97. curl_setopt($curl, CURLOPT_URL, $url);
  98. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  99. curl_setopt($curl, CURLOPT_HEADER, false);
  100. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  101. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  102. curl_setopt($curl, CURLOPT_POST, TRUE);
  103. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  104. if ($useCert == true) {
  105. // 设置证书:cert 与 key 分别属于两个.pem文件
  106. curl_setopt($curl, CURLOPT_SSLCERTTYPE, 'PEM');
  107. curl_setopt($curl, CURLOPT_SSLCERT, $sslCert['certPem']);
  108. curl_setopt($curl, CURLOPT_SSLKEYTYPE, 'PEM');
  109. curl_setopt($curl, CURLOPT_SSLKEY, $sslCert['keyPem']);
  110. }
  111. $result = curl_exec($curl);
  112. curl_close($curl);
  113. return $result;
  114. }
  115. /**
  116. * 数组转json
  117. * @param $data
  118. * @return string
  119. */
  120. protected function jsonEncode($data)
  121. {
  122. return json_encode($data, JSON_UNESCAPED_UNICODE);
  123. }
  124. /**
  125. * json转数组
  126. * @param $json
  127. * @return mixed
  128. */
  129. protected function jsonDecode($json)
  130. {
  131. return json_decode($json, true);
  132. }
  133. /**
  134. * 返回错误信息
  135. * @return mixed
  136. */
  137. public function getError()
  138. {
  139. return $this->error;
  140. }
  141. }