WeixinService.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. namespace App\Service\Weixin;
  3. use App\Service\Service;
  4. use Illuminate\Support\Facades\Redis;
  5. class WeixinService extends Service
  6. {
  7. const APPID = 'wxe048bcdcc21aae6e';
  8. const APPSECRET = '191789c5b4ef2b3d5b9e79bb62428092';
  9. const ACCESS_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';
  10. const OPENID = '';
  11. const TOKEN = '';
  12. const KEY = 'weixintnine';
  13. const STABLE_TOKEN_URL = 'https://api.weixin.qq.com/cgi-bin/stable_token'; // 稳定版接口
  14. const KEY_STABLE = 'weixinMessage';
  15. public function getToken(){
  16. $token_key = self::KEY.'_'.'token';
  17. $token = Redis::get($token_key);
  18. if(! $token){
  19. $url = sprintf(self::ACCESS_URL,self::APPID,self::APPSECRET);
  20. $res = $this->curlOpen($url);
  21. $res = json_decode($res,true);
  22. if(isset($res['errmsg'])) return [false,$res['errmsg']];
  23. if(!isset($res['access_token'])) return [false,'request error'];
  24. $token = $res['access_token'];
  25. $expire_time = $res['expires_in']-300;
  26. Redis::set($token_key,$token);
  27. Redis::expire($token_key, $expire_time);
  28. return [true,$token];
  29. }
  30. return [true,$token];
  31. }
  32. public function getTokenSTABLE() {
  33. $token_key = self::KEY_STABLE . '_token';
  34. $token = Redis::get($token_key);
  35. // 缓存存在且有效
  36. if ($token) return [true, $token];
  37. // 构建 POST 请求体
  38. $postData = json_encode([
  39. 'grant_type' => 'client_credential',
  40. 'appid' => self::APPID,
  41. 'secret' => self::APPSECRET,
  42. // 可选:'force_refresh' => true 强制刷新
  43. ]);
  44. list($status, $res) = $this->post_helper(self::STABLE_TOKEN_URL, $postData);
  45. if(! $status) return [false, $res];
  46. // 错误处理
  47. if (isset($res['errcode']) && $res['errcode'] != 0) return [false, "{$res['errcode']}: {$res['errmsg']}"];
  48. if (empty($res['access_token'])) return [false, 'access_token missing'];
  49. // 缓存 Token(有效期7200秒,提前300秒刷新)
  50. $token = $res['access_token'];
  51. $expire = $res['expires_in'] - 300; // 实际6900秒(1小时55分)
  52. Redis::setex($token_key, $expire, $token);
  53. return [true, $token];
  54. }
  55. public function getOpenid($data){
  56. if(empty($data['code'])) return [false, 'code不能为空'];
  57. $code = $data['code'];
  58. $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code';
  59. $url = sprintf($url,self::APPID,self::APPSECRET,$code);
  60. $res = $this->curlOpen($url);
  61. $res = json_decode($res,true);
  62. if(!isset($res['openid'])) return [false,$res['errmsg']??'request error'];
  63. $openid = $res['openid'];
  64. return [true,['openid' => $openid]];
  65. }
  66. public function setWebHook($data){
  67. // file_put_contents('22.txt',json_encode($data));
  68. $uri = isset($data['uri']) ? $data['uri'] : '';
  69. $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
  70. $param = isset($data['param']) ? $data['param'] : '';
  71. $redirect_uri = urlencode('https://t9api.qingyaokeji.com/wxapi/getUnionid?uri='.$uri.'&param='.$param);
  72. $url = sprintf($url,self::APPID,$redirect_uri);
  73. header("Location:".$url);exit;
  74. echo 'ok';die;
  75. }
  76. public function getUnionid($data){
  77. file_put_contents('22.txt',date('YmdHis').json_encode($data));
  78. // echo $data['code'];
  79. if(isset($data['code'])) {
  80. list($status,$openid) = $this->getOpenid($data);
  81. file_put_contents('222.txt',date('YmdHis').json_encode($openid));
  82. if(!$status) return [false,$openid];
  83. $uri = $data['uri'];
  84. $openid = $openid['openid'];
  85. $param = isset($data['param']) ? $data['param'] : '';
  86. $url = 'https://t9.qingyaokeji.com/#/wxGet?uri='.$uri.'&openid='.$openid.'&param='.$param;
  87. header('Location:'.$url);exit();
  88. }
  89. }
  90. // public function sendTmpMsg($data){
  91. // // $openid = 'okXNa69ggEX61KvHUhCq9PcGrPKI';
  92. // $data = [
  93. // 'openid' => 'o7B4f68DuDlBSevGdctFyP8MD-nw',
  94. // 'tempid' => '5azHlaoAu6MgRzkxn_HL6ygFt_wIkXEz9CklPWEdP70',
  95. // 'reload_url' => '',
  96. // 'first' => '工资发放',
  97. // 'remark' => '请查收',
  98. // 'detail' => [
  99. // 'thing2' => '姓名',
  100. // 'thing6' => '10',
  101. // 'time4' => '2023-09-01',
  102. // 'character_string3' => 'st.1231',
  103. // 'thing1' => '类型',
  104. // ]
  105. // ];
  106. // if(!isset($data['detail'])) return [false,'invalid detail'];
  107. // if(!isset($data['openid'])) return [false,'invalid openid'];
  108. // if(!isset($data['tempid'])) return [false,'invalid tempid'];
  109. // if(!isset($data['reload_url'])) return [false,'invalid reload_url'];
  110. // $templateID = $data['tempid'];
  111. // $reload_url = $data['reload_url'];
  112. // list($status,$token) = $this->getToken();
  113. // if(!$status) return [false,$token];
  114. // $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$token;
  115. // $post = '{
  116. // "touser":"'.$data['openid'].'",
  117. // "template_id":"'.$templateID.'",
  118. // "url":"'.$reload_url.'",
  119. // "data":{
  120. // "first": {
  121. // "value":"'.$data['first'].'",
  122. // "color":"#173177"
  123. // },
  124. // %s
  125. // "remark":{
  126. // "value":"'.$data['remark'].'",
  127. // "color":"#173177"
  128. // }
  129. // }
  130. // }';
  131. // $content = "";
  132. // foreach ($data['detail'] as $k=>$v){
  133. //
  134. // $content .= '"'.$k.'": {
  135. // "value":"'.$v.'",
  136. // "color":"#173177"
  137. // },';
  138. // }
  139. // $post = sprintf($post,$content);
  140. //// var_dump($post);
  141. //// var_dump(json_decode($post));die;
  142. //// var_dump($url);
  143. //// var_dump(json_encode(json_decode($post)));
  144. // $res = $this->curlOpen($url,['post'=>$post]);
  145. // $res = json_decode($res,true);
  146. // if(isset($res['errcode'])&&$res['errcode'] != 0) return [false,$res['errmsg']];
  147. // if(isset($res['errcode'])&&$res['errcode'] === 0) return [true,''];
  148. // return [false,json_encode($res)];
  149. //
  150. // }
  151. }