WeixinService.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace App\Service\Weixin;
  3. use App\Service\Service;
  4. use Illuminate\Support\Facades\Log;
  5. use Illuminate\Support\Facades\Redis;
  6. class WeixinService extends Service
  7. {
  8. public $appid = '';
  9. public $secret = '';
  10. const ACCESS_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';
  11. const KEY = '';
  12. const STABLE_TOKEN_URL = 'https://api.weixin.qq.com/cgi-bin/stable_token'; // 稳定版接口
  13. const KEY_STABLE = 'weixinsupplymarketing';
  14. public function __construct()
  15. {
  16. $this->appid = config("wx_msg.f_appid");
  17. $this->secret = config("wx_msg.f_appSecret");
  18. }
  19. public function getToken(){
  20. $token_key = self::KEY.'_'.'token';
  21. $token = Redis::get($token_key);
  22. if(! $token){
  23. $url = sprintf(self::ACCESS_URL,$this->appid, $this->secret);
  24. $res = $this->curlOpen($url);
  25. $res = json_decode($res,true);
  26. if(isset($res['errmsg'])) return [false,$res['errmsg']];
  27. if(!isset($res['access_token'])) return [false,'request error'];
  28. $token = $res['access_token'];
  29. $expire_time = $res['expires_in']-300;
  30. Redis::set($token_key,$token);
  31. Redis::expire($token_key, $expire_time);
  32. return [true,$token];
  33. }
  34. return [true,$token];
  35. }
  36. public function getTokenSTABLE() {
  37. $token_key = self::KEY_STABLE . '_token';
  38. $token = Redis::get($token_key);
  39. // 缓存存在且有效
  40. if ($token) return [true, $token];
  41. // 构建 POST 请求体
  42. $postData = json_encode([
  43. 'grant_type' => 'client_credential',
  44. 'appid' => $this->appid,
  45. 'secret' => $this->secret,
  46. // 可选:'force_refresh' => true 强制刷新
  47. ]);
  48. list($status, $res) = $this->post_helper(self::STABLE_TOKEN_URL, $postData);
  49. if(! $status) return [false, $res];
  50. // 错误处理
  51. if (isset($res['errcode']) && $res['errcode'] != 0) return [false, "{$res['errcode']}: {$res['errmsg']}"];
  52. if (empty($res['access_token'])) return [false, 'access_token missing'];
  53. // 缓存 Token(有效期7200秒,提前300秒刷新)
  54. $token = $res['access_token'];
  55. $expire = $res['expires_in'] - 300; // 实际6900秒(1小时55分)
  56. Redis::setex($token_key, $expire, $token);
  57. return [true, $token];
  58. }
  59. public function setWebHook($data){
  60. // file_put_contents('22.txt',json_encode($data));
  61. $uri = isset($data['uri']) ? $data['uri'] : '';
  62. $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
  63. $param = isset($data['param']) ? $data['param'] : '';
  64. $redirect_uri = urlencode('https://xlkjapi.qingyaokeji.com/wxapi/getUnionid?uri='.$uri.'&param='.$param);
  65. $url = sprintf($url,$this->appid,$redirect_uri);
  66. header("Location:".$url);exit;
  67. echo 'ok';die;
  68. }
  69. public function getUnionid($data){
  70. // file_put_contents('22.txt',date('YmdHis').json_encode($data));
  71. // echo $data['code'];
  72. if(isset($data['code'])) {
  73. list($status,$openid) = $this->getOpenid($data);
  74. // file_put_contents('222.txt',date('YmdHis').json_encode($openid));
  75. // Log::channel('apiLog')->info('request', ['param' => $openid]);
  76. if(!$status) return [false,$openid];
  77. $uri = $data['uri'];
  78. $openid = $openid['openid'];
  79. $param = isset($data['param']) ? $data['param'] : '';
  80. $url = 'https://xlkj.qingyaokeji.com/#/wxGet?uri='.$uri.'&openid='.$openid.'&param='.$param;
  81. header('Location:'.$url);exit();
  82. }
  83. }
  84. public function getOpenid($data){
  85. if(empty($data['code'])) return [false, 'code不能为空'];
  86. $code = $data['code'];
  87. $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code';
  88. $url = sprintf($url,$this->appid,$this->secret,$code);
  89. $res = $this->curlOpen($url);
  90. $res = json_decode($res,true);
  91. if(!isset($res['openid'])) return [false,$res['errmsg']??'request error'];
  92. $openid = $res['openid'];
  93. return [true,['openid' => $openid]];
  94. }
  95. }