WxService.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. namespace App\Service\Wx;
  3. use App\Model\WxEmployeeOfficial;
  4. use Illuminate\Support\Facades\Redis;
  5. class WxService extends Service
  6. {
  7. // public $appid = 'wx4e1324c600df37a6';
  8. // public $secret = '72f8c912d462b0f4ff46cbedac0c80bf';
  9. //测试
  10. // public $appid = 'wx4e1324c600df37a6';
  11. // public $secret = 'cec65770bf168a57dc8e5a012d4c9537';
  12. //正式
  13. public $appid = 'wxc0bc3dfc58b4e00e';
  14. public $secret = 'ad37474f1a646281052438206b8aaed2';
  15. public function getOpenid($code){
  16. $appid = $this->appid;
  17. $secret = $this->secret;
  18. // $code = '0b1tFv100Sm91Q1kko0004vZGu0tFv12';
  19. $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$secret.'&js_code='.$code.'&grant_type=authorization_code';
  20. list($status,$res) = $this->wx_return($url);
  21. if($status) return [true,$res['openid']];
  22. else return [false,$res];
  23. }
  24. public function getToken(){
  25. $token_key = $this->appid.'_wx_token';
  26. $token = Redis::get($token_key);
  27. if(!empty($token)){
  28. return [true,$token];
  29. }
  30. $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->secret;
  31. list($status,$res) = $this->wx_return($url);
  32. if($status) {
  33. Redis::setex($token_key,7100,$res['access_token']);
  34. return [true,$res['access_token']];
  35. }
  36. else return [false,$res];
  37. }
  38. public function getMobile($code){
  39. list($status,$token) = $this->getToken();
  40. $url = 'https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token='.$token;
  41. $post = [
  42. 'post'=>json_encode([
  43. 'code' => $code,
  44. ]),
  45. ];
  46. $post['header'][] = "Content-Type:application/json";
  47. list($status,$res) = $this->wx_return($url,$post);
  48. if($status) return [true,$res['phone_info']['phoneNumber']];
  49. else return [false,$res];
  50. }
  51. private function wx_return($url,$data=[]){
  52. $res = $this->curlOpen($url,$data);
  53. $res = json_decode($res,true);
  54. if(isset($res['errcode'])&&$res['errcode'] !== 0) return [false,$res['errmsg']];
  55. return [true,$res];
  56. }
  57. //写一个单独的微信推送
  58. /**
  59. * @param $user_id
  60. * @param $type 1审核申请 2抄送 3 审核结果
  61. * @param $state 0申请审核1审核通过2审核拒绝
  62. * @param $menu_id
  63. * @param $order_data
  64. * @return array
  65. */
  66. public function wx_sendMsg($user_id,$type,$state,$menu_id,$order_data){
  67. file_put_contents('tt.txt',json_encode([$user_id,$type,$state,$menu_id,$order_data]));
  68. $openid = WxEmployeeOfficial::where('employee_id',$user_id)->value('openid');
  69. if(empty($openid)) return [false,'not invaild openid'];
  70. $config = config('wx.msg');
  71. switch ($type){
  72. case '1':
  73. case '2':
  74. $menu_type = $menu_id.'_'.$type;
  75. break;
  76. case '3':
  77. $menu_type = $menu_id.'_'.$type.'_'.$state;
  78. break;
  79. default :
  80. $menu_type = '';
  81. }
  82. if(!isset($config['wx_menu'][$menu_type])) return [false,'not invaild menu_type'];
  83. $tmp_data = $config['wx_tmp_id'][$config['wx_menu'][$menu_type]];
  84. $detail = $tmp_data['param'];
  85. $tmp_id = $tmp_data['tmp_id'];
  86. $data = [];
  87. foreach ($detail as $k=>$v){
  88. $data[$v] = $order_data[$k];
  89. }
  90. $this->sendTmpMsg($openid,$tmp_id,['detail'=>$data]);
  91. return [true,''];
  92. }
  93. public function sendTmpMsg($openid,$tempid,$data){
  94. $reload_url = $data['reload_url']??'';
  95. list($status,$token) = $this->getToken();
  96. if(!$status) return [false,$token];
  97. $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$token;
  98. $post = '{
  99. "touser":"'.$openid.'",
  100. "template_id":"'.$tempid.'",
  101. "url":"'.$reload_url.'",
  102. "data":{
  103. "first": {
  104. "value":"1",
  105. "color":"#173177"
  106. },
  107. %s
  108. "remark":{
  109. "value":"1",
  110. "color":"#173177"
  111. }
  112. }
  113. }';
  114. $content = "";
  115. foreach ($data['detail'] as $k=>$v){
  116. $content .= '"'.$k.'": {
  117. "value":"'.$v.'",
  118. "color":"#173177"
  119. },';
  120. }
  121. $post = sprintf($post,$content);
  122. $res = $this->curlOpen($url,['post'=>$post]);
  123. $res = json_decode($res,true);
  124. if(isset($res['errcode'])&&$res['errcode'] != 0) return [false,$res['errmsg']];
  125. if(isset($res['errcode'])&&$res['errcode'] === 0) return [true,''];
  126. return [false,json_encode($res)];
  127. }
  128. }