WxService.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 = 'wxe048bcdcc21aae6e';
  10. public $secret = '191789c5b4ef2b3d5b9e79bb62428092';
  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. $openid = WxEmployeeOfficial::where('employee_id',$user_id)->value('openid');
  64. if(empty($openid)) return [false,'not invaild openid'];
  65. $config = config('wx.msg');
  66. switch ($type){
  67. case '1':
  68. case '2':
  69. $menu_type = $menu_id.'_'.$type;
  70. break;
  71. case '3':
  72. $menu_type = $menu_id.'_'.$type.'_'.$state;
  73. break;
  74. default :
  75. $menu_type = '';
  76. }
  77. if(!isset($config['wx_menu'][$menu_type])) return [false,'not invaild menu_type'];
  78. $tmp_data = $config['wx_tmp_id'][$config['wx_menu'][$menu_type]];
  79. $detail = $tmp_data['param'];
  80. $tmp_id = $tmp_data['tmp_id'];
  81. $data = [];
  82. foreach ($detail as $k=>$v){
  83. $data[$v] = $order_data[$k];
  84. }
  85. $this->sendTmpMsg($openid,$tmp_id,['detail'=>$data]);
  86. return [true,''];
  87. }
  88. public function sendTmpMsg($openid,$tempid,$data){
  89. $reload_url = $data['reload_url']??'';
  90. list($status,$token) = $this->getToken();
  91. if(!$status) return [false,$token];
  92. $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$token;
  93. $post = '{
  94. "touser":"'.$openid.'",
  95. "template_id":"'.$tempid.'",
  96. "url":"'.$reload_url.'",
  97. "data":{
  98. "first": {
  99. "value":"1",
  100. "color":"#173177"
  101. },
  102. %s
  103. "remark":{
  104. "value":"1",
  105. "color":"#173177"
  106. }
  107. }
  108. }';
  109. $content = "";
  110. foreach ($data['detail'] as $k=>$v){
  111. $content .= '"'.$k.'": {
  112. "value":"'.$v.'",
  113. "color":"#173177"
  114. },';
  115. }
  116. $post = sprintf($post,$content);
  117. $res = $this->curlOpen($url,['post'=>$post]);
  118. $res = json_decode($res,true);
  119. if(isset($res['errcode'])&&$res['errcode'] != 0) return [false,$res['errmsg']];
  120. if(isset($res['errcode'])&&$res['errcode'] === 0) return [true,''];
  121. return [false,json_encode($res)];
  122. }
  123. }