WxService.php 4.7 KB

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