Open.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. <?php
  2. namespace app\adminapi\controller\v1\merchant;
  3. use app\adminapi\controller\AuthController;
  4. use app\lib\wx_encode\WXBizMsgCrypt;
  5. use app\models\merchant\MerchantCodeAudit;
  6. use app\models\merchant\MerchantMiniprogram;
  7. use app\models\merchant\Merchant;
  8. use app\Request;
  9. use crmeb\basic\BaseModel;
  10. use crmeb\services\CacheService;
  11. use crmeb\services\UtilService;
  12. use Psr\SimpleCache\InvalidArgumentException;
  13. use SimpleXMLElement;
  14. use think\db\exception\DbException;
  15. use think\Exception;
  16. use think\facade\Log;
  17. class Open extends AuthController
  18. {
  19. protected $encodingAesKey = ''; //第三方平台解密key
  20. protected $appId = ''; //第三方平台appid
  21. protected $appSecret = ''; //第三方平台appSecret
  22. protected $token = ''; //第三方平台消息验证token
  23. public function __construct(\think\facade\App $app, $escape = false)
  24. {
  25. if (!$escape) {
  26. parent::__construct($app);
  27. } else {
  28. $this->app = $app;
  29. $this->request = app('request');
  30. $this->initialize($escape);
  31. }
  32. }
  33. public function initialize($escape = false)
  34. {
  35. if (!($this->request->action() == 'wxTicketCallback') && !($this->request->action() == 'wxCallback') && !$escape) {
  36. parent::initialize();
  37. }
  38. $this->encodingAesKey = config('third.encodingAesKey');
  39. $this->appId = config('third.appId');
  40. $this->appSecret = config('third.appSecret');
  41. $this->token = config('third.token');
  42. }
  43. /**
  44. * 票据获取接口
  45. * @param Request $request
  46. * @throws InvalidArgumentException
  47. */
  48. public function wxTicketCallback(Request $request)
  49. {
  50. $msg = '';
  51. $timeStamp = $request->param('timestamp', '');
  52. $nonce = $request->param('nonce', '');
  53. $msg_sign = $request->param('msg_signature', '');
  54. $encryptMsg = file_get_contents('php://input');
  55. $pc = new WXBizMsgCrypt($this->token, $this->encodingAesKey, $this->appId);
  56. $errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $encryptMsg, $msg);
  57. if ($errCode == 0) {
  58. $data = $this->_xmlToArr($msg);
  59. switch ($data['InfoType']) {
  60. case'component_verify_ticket':
  61. //接收验证票据
  62. CacheService::redisHandler()->set('component_verify_ticket', $data['ComponentVerifyTicket']);
  63. break;
  64. case 'unauthorized';
  65. //todo 发送授权取消通知
  66. break;
  67. case 'updateauthorized':
  68. //todo 发送授权更新通知
  69. break;
  70. case 'authorized':
  71. //todo 发送授权成功通知
  72. break;
  73. default:
  74. break;
  75. }
  76. echo 'success';
  77. } else {
  78. echo '解密失败' . $errCode;
  79. }
  80. }
  81. /**
  82. * 消息与事件接受接口
  83. * @param $appid
  84. * @param Request $request
  85. */
  86. public function wxCallback($appid, Request $request)
  87. {
  88. $msg = '';
  89. $timeStamp = $request->param('timestamp', '');
  90. $nonce = $request->param('nonce', '');
  91. $msg_sign = $request->param('msg_signature', '');
  92. $encryptMsg = file_get_contents('php://input');
  93. $pc = new WXBizMsgCrypt($this->token, $this->encodingAesKey, $this->appId);
  94. Log::error('77777777777');
  95. Log::error($msg_sign);
  96. Log::error($timeStamp);
  97. Log::error($nonce);
  98. Log::error($encryptMsg);
  99. Log::error($msg);
  100. $errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $encryptMsg, $msg);
  101. Log::error($errCode);
  102. Log::error($this->_xmlToArr($msg));
  103. @file_put_contents('call_back_log.txt', '[' . date('Y-m-d H:i:s') . ']' . json_encode($data) . PHP_EOL, FILE_APPEND);
  104. if ($errCode == 0) {
  105. $data = $this->_xmlToArr($msg);
  106. @file_put_contents('call_back_log.txt', '[' . date('Y-m-d H:i:s') . ']' . json_encode($data) . PHP_EOL, FILE_APPEND);
  107. $mer_id = MerchantMiniprogram::where(['appid' => $appid])->value('mer_id');
  108. BaseModel::beginTrans();
  109. try {
  110. switch ($data['Event']) {
  111. case'weapp_audit_success':
  112. $info = MerchantCodeAudit::where('mer_id', $mer_id)->where('status', 2)->order('commit_time', 'desc')->find();
  113. $info->save(['success_time' => $data['SuccTime'], 'status' => 0]);
  114. //todo 某小程序代码审核通过
  115. break;
  116. case 'weapp_audit_fail';
  117. $info = MerchantCodeAudit::where('mer_id', $mer_id)->where('status', 2)->order('commit_time', 'desc')->find();
  118. $info->save(['fail_time' => $data['FailTime'], 'status' => 1, 'reason' => $data['Reason'], 'screenshot' => $data['ScreenShot']]);
  119. //todo 某小程序代码审核不通过
  120. break;
  121. case 'weapp_audit_delay':
  122. $info = MerchantCodeAudit::where('mer_id', $mer_id)->where('status', 2)->order('commit_time', 'desc')->find();
  123. $info->save(['delay_time' => $data['DelayTime'], 'status' => 4, 'reason' => $data['Reason']]);
  124. //todo 某小程序代码核延后
  125. break;
  126. default:
  127. break;
  128. }
  129. BaseModel::commitTrans();
  130. echo 'success';
  131. } catch (Exception $e) {
  132. BaseModel::rollbackTrans();
  133. echo $e->getMessage();
  134. } catch (DbException $e) {
  135. BaseModel::rollbackTrans();
  136. echo $e->getMessage();
  137. }
  138. } else {
  139. BaseModel::rollbackTrans();
  140. echo '解密失败' . $errCode;
  141. }
  142. }
  143. /**
  144. * @param $xml
  145. * @return mixed|SimpleXMLElement
  146. */
  147. protected function _xmlToArr($xml)
  148. {
  149. $res = @simplexml_load_string($xml, NULL, LIBXML_NOCDATA);
  150. $res = json_decode(json_encode($res), true);
  151. return $res;
  152. }
  153. /**
  154. * 获取令牌
  155. * @return mixed
  156. * @throws \Exception
  157. * @throws InvalidArgumentException
  158. */
  159. public function getComponentAccessToken()
  160. {
  161. try {
  162. if (CacheService::redisHandler()->get('component_access_token')) {
  163. return CacheService::redisHandler()->get('component_access_token');
  164. }
  165. $url = 'https://api.weixin.qq.com/cgi-bin/component/api_component_token';
  166. $data = [
  167. 'component_appid' => $this->appId,
  168. 'component_appsecret' => $this->appSecret,
  169. 'component_verify_ticket' => CacheService::redisHandler()->get('component_verify_ticket'),
  170. ];
  171. // $data['component_verify_ticket'] = 'ticket@@@iWDHjOTCGw8wIGeopp1Nux6gbi7KYD-MtFroWBw6WkEReGbCQWBesNMd-c3LlaR07J1cx4AQF48LYDMmcmdqZQ';
  172. $res = json_decode(doRequest($url, $data, null, true, true), true);
  173. if (isset($res['component_access_token'])) {
  174. CacheService::redisHandler()->set('component_access_token', $res['component_access_token'], $res['expires_in']);
  175. return $res['component_access_token'];
  176. } else {
  177. throw exception($res['errmsg'] ?? $res['msg'] ?? '请求错误');
  178. }
  179. } catch (Exception $e) {
  180. throw exception($e->getMessage());
  181. }
  182. }
  183. /**
  184. * 获取预授权码
  185. * @return mixed
  186. * @throws \Exception
  187. * @throws InvalidArgumentException
  188. */
  189. protected function getPreAuthCode()
  190. {
  191. try {
  192. if (CacheService::redisHandler()->get('pre_auth_code')) {
  193. return CacheService::redisHandler()->get('pre_auth_code');
  194. }
  195. $component_access_token = $this->getComponentAccessToken();
  196. $url = 'https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=' . $component_access_token;
  197. $data = [
  198. 'component_appid' => $this->appId,
  199. ];
  200. $res = json_decode(doRequest($url, $data, null, true, true), true);
  201. if (isset($res['pre_auth_code'])) {
  202. CacheService::redisHandler()->set('pre_auth_code', $res['pre_auth_code'], $res['expires_in']);
  203. return $res['pre_auth_code'];
  204. } else {
  205. throw exception($res['errmsg'] ?? $res['msg'] ?? '请求错误');
  206. }
  207. } catch (Exception $e) {
  208. throw exception($e->getMessage());
  209. }
  210. }
  211. /**
  212. * 生成授权地址
  213. * @param string $re_url 回调地址
  214. * @param int $type 授权地址类型:1桌面端,其他移动端
  215. * @return mixed
  216. * @throws InvalidArgumentException
  217. */
  218. public function createAuthUrl($type = 1)
  219. {
  220. try {
  221. $re_url = $this->request->get('re_url');
  222. if (!$re_url) {
  223. return app('json')->fail('请传入回调地址');
  224. }
  225. $url_base = $type == 1 ? 'https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=' : 'https://mp.weixin.qq.com/safe/bindcomponent?action=bindcomponent&auth_type=3&no_scan=1&component_appid=';
  226. $pre_auth_code = $this->getPreAuthCode();
  227. $url = $url_base . $this->appId
  228. . '&pre_auth_code=' . $pre_auth_code
  229. . '&redirect_uri=' . $re_url;//todo 改成前端的接收页面
  230. if ($type != 1) {
  231. $url .= '#wechat_redirect';
  232. }
  233. return app('json')->success('ok', ['url' => $url]);
  234. } catch (Exception $e) {
  235. return app('json')->fail($e->getMessage(), ['file' => $e->getFile(), 'line' => $e->getLine()]);
  236. }
  237. }
  238. /**
  239. * 接收授权码
  240. * @param $mer_id
  241. * @param Request $request
  242. * @return mixed
  243. * @throws InvalidArgumentException
  244. */
  245. public function wxAuthRedirect(Request $request, $mer_id)
  246. {
  247. $auth_code = $request->post('authorization_code');
  248. $expires_in = $request->post('expires_in');
  249. if ($auth_code && $expires_in) {
  250. try {
  251. CacheService::redisHandler()->set($mer_id . '_authorization_code', $auth_code, $expires_in);
  252. //return $this->getAuthInfo(['mer_id' => $mer_id]);
  253. return app('json')->success('获取授权码成功');
  254. } catch (Exception $e) {
  255. return app('json')->fail($e->getMessage(), ['file' => $e->getFile(), 'line' => $e->getLine()]);
  256. }
  257. } else {
  258. return app('json')->fail('获取授权码失败');
  259. }
  260. }
  261. /**
  262. *使用授权码获取授权信息
  263. * @param array $param
  264. * @return mixed
  265. * @throws \Exception
  266. * @throws InvalidArgumentException
  267. */
  268. protected function getAuthInfo($param = ['mer_id' => ''])
  269. {
  270. BaseModel::beginTrans();
  271. try {
  272. $mer_id = $param['mer_id'] ?? '';
  273. if (!$mer_id) {
  274. BaseModel::rollbackTrans();
  275. throw exception('未找到商家');
  276. }
  277. $mer_info = Merchant::get($mer_id);
  278. if (!$mer_info) {
  279. BaseModel::rollbackTrans();
  280. throw exception('未找到商家');
  281. }
  282. $authorization_code = CacheService::redisHandler()->get($param['mer_id'] . '_authorization_code');
  283. if (!$authorization_code) {
  284. BaseModel::rollbackTrans();
  285. throw exception('请先获取授权码');
  286. }
  287. $component_access_token = $this->getComponentAccessToken();
  288. $url = 'https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=' . $component_access_token;
  289. $data = [
  290. 'component_appid' => $this->appId,
  291. 'authorization_code' => $authorization_code,
  292. ];
  293. $res = json_decode(doRequest($url, $data, null, true, true), true);
  294. if (isset($res['authorization_info'])) {
  295. //保存/更新内容到商户小程序表
  296. if (MerchantMiniprogram::vaildWhere()->where(['mer_id' => $mer_id])->find()) {
  297. MerchantMiniprogram::vaildWhere()->where('mer_id', $mer_id)->update([
  298. 'appid' => $res['authorization_info']['authorizer_appid'],
  299. 'authorizer_refresh_token' => $res['authorization_info']['authorizer_refresh_token'],
  300. 'func_info' => json_encode($res['authorization_info']),
  301. 'update' => time(),
  302. ]);
  303. BaseModel::commitTrans();
  304. } else {
  305. $app_secret = self::createAppSecret();
  306. MerchantMiniprogram::create([
  307. 'mer_id' => $mer_id,
  308. 'appid' => $res['authorization_info']['authorizer_appid'],
  309. 'authorizer_refresh_token' => $res['authorization_info']['authorizer_refresh_token'],
  310. 'func_info' => json_encode($res['authorization_info']),
  311. 'add_time' => time(),
  312. 'update' => time(),
  313. 'boofly_app_secret' => $app_secret,
  314. ]);
  315. BaseModel::commitTrans();
  316. }
  317. //保存authorizer_access_token到redis,过期时间为expires_in
  318. CacheService::redisHandler()->set($mer_id . '_authorizer_access_token', $res['authorization_info']['authorizer_access_token'], $res['authorization_info']['expires_in']);
  319. return array_merge($res['authorization_info'], ['boofly_app_secret' => $app_secret ?? '']);
  320. } else {
  321. BaseModel::rollbackTrans();
  322. throw exception($res['errmsg'] ?? $res['msg'] ?? '请求错误');
  323. }
  324. } catch (Exception $e) {
  325. BaseModel::rollbackTrans();
  326. throw exception($e->getMessage());
  327. } catch (DbException $e) {
  328. BaseModel::rollbackTrans();
  329. throw exception($e->getMessage());
  330. }
  331. }
  332. /**
  333. * 创建app_secret
  334. * @return string
  335. * @throws \Exception
  336. */
  337. private static function createAppSecret()
  338. {
  339. return md5(bin2hex(random_bytes(8)));
  340. }
  341. /**
  342. *获取/刷新商户接口调用令牌
  343. * @param array $param
  344. * @return mixed
  345. * @throws InvalidArgumentException
  346. * @throws \Exception
  347. */
  348. public function getAuthorizerAccessToken($param = ['mer_id' => '', 'get_token' => 1, 'return_array' => false])
  349. {
  350. BaseModel::beginTrans();
  351. try {
  352. $mer_id = $param['mer_id'] ?? '';
  353. $get_token = isset($param['get_token']) ? $param['get_token'] : 1;
  354. $return_array = isset($param['return_array']) ? $param['return_array'] : false;
  355. if (!$mer_id) {
  356. throw exception('未找到商家');
  357. }
  358. if (CacheService::redisHandler()->get($mer_id . '_authorizer_access_token') && $get_token == 1) {
  359. BaseModel::commitTrans();
  360. return CacheService::redisHandler()->get($mer_id . '_authorizer_access_token');
  361. }
  362. // 根据商户id从商户表获取authorizer_appid和authorizer_refresh_token
  363. $authorizer_info = MerchantMiniprogram::vaildWhere()->where(['mer_id' => $mer_id])->find();
  364. if (!$authorizer_info) {
  365. throw exception('未找到商家');
  366. }
  367. $component_access_token = $this->getComponentAccessToken();
  368. $url = 'https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token?component_access_token=' . $component_access_token;
  369. $data = [
  370. 'component_appid' => $this->appId,
  371. 'authorizer_appid' => $authorizer_info['appid'],
  372. 'authorizer_refresh_token' => $authorizer_info['authorizer_refresh_token'],
  373. ];
  374. $res = json_decode(doRequest($url, $data, null, true, true), true);
  375. if (isset($res['authorizer_access_token'])) {
  376. MerchantMiniprogram::vaildWhere()->where('mer_id', $mer_id)->update([
  377. 'authorizer_refresh_token' => $res['authorizer_refresh_token'],
  378. 'update' => time(),
  379. ]);
  380. BaseModel::commitTrans();
  381. //保存新的authorizer_access_token到redis,过期时间为expires_in
  382. CacheService::redisHandler()->set($mer_id . '_authorizer_access_token', $res['authorizer_access_token'], $res['expires_in']);
  383. return $return_array ? ['access_token' => $res['authorizer_access_token'], 'expires_in' => $res['expires_in']] : $res['authorizer_access_token'];
  384. } else {
  385. BaseModel::rollbackTrans();
  386. throw exception($res['errmsg'] ?? $res['msg'] ?? '请求错误');
  387. }
  388. } catch (Exception $e) {
  389. BaseModel::rollbackTrans();
  390. throw exception($e->getMessage());
  391. } catch (DbException $e) {
  392. BaseModel::rollbackTrans();
  393. throw exception($e->getMessage());
  394. }
  395. }
  396. /**
  397. * 获取授权方的帐号基本信息
  398. * 包括头像、昵称、帐号类型、认证类型、微信号、原始ID和二维码图片URL
  399. * 具体参数详见https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/api_get_authorizer_info.html#%E5%85%AC%E4%BC%97%E5%8F%B7%E5%B8%90%E5%8F%B7%E4%BF%A1%E6%81%AF
  400. * @param array $param
  401. * @return mixed
  402. * @throws InvalidArgumentException
  403. * @throws \Exception
  404. */
  405. protected function getAuthorizerInfo($param = ['mer_id' => ''])
  406. {
  407. BaseModel::beginTrans();
  408. try {
  409. $mer_id = $param['mer_id'] ?? '';
  410. if (!$mer_id) {
  411. BaseModel::rollbackTrans();
  412. throw exception('未找到商家');
  413. }
  414. //根据商户id从商户表获取authorizer_appid和authorizer_refresh_token
  415. $authorizer_info = MerchantMiniprogram::vaildWhere()->where(['mer_id' => $mer_id])->find();
  416. if (!$authorizer_info) {
  417. BaseModel::rollbackTrans();
  418. throw exception('未找到商家');
  419. }
  420. $component_access_token = $this->getComponentAccessToken();
  421. $url = 'https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=' . $component_access_token;
  422. $data = [
  423. 'component_appid' => $this->appId,
  424. 'authorizer_appid' => $authorizer_info['appid'],
  425. ];
  426. $res = json_decode(doRequest($url, $data, null, true, true), true);
  427. if (isset($res['authorizer_info'])) {
  428. //更新商户信息到商户表
  429. MerchantMiniprogram::vaildWhere()->where('mer_id', $mer_id)->update([
  430. 'nick_name' => $res['authorizer_info']['nick_name'],
  431. 'head_img' => $res['authorizer_info']['head_img'],
  432. 'signature' => $res['authorizer_info']['signature'],
  433. 'principal_name' => $res['authorizer_info']['principal_name'],
  434. 'categories' => $res['authorizer_info']['nick_name'],
  435. 'business_info' => json_encode($res['authorizer_info']['business_info']),
  436. 'service_type_info' => $res['authorizer_info']['service_type_info']['id'],
  437. 'user_name' => $res['authorizer_info']['user_name'],
  438. 'qrcode_url' => $res['authorizer_info']['qrcode_url'],
  439. 'update' => time(),
  440. ]);
  441. BaseModel::commitTrans();
  442. // CacheService::redisHandler()->set($mer_id . '_authorizer_access_token', $res['authorizer_access_token'], $res['expires_in']);
  443. return $res;
  444. } else {
  445. BaseModel::rollbackTrans();
  446. throw exception($res['errmsg'] ?? $res['msg'] ?? '请求错误');
  447. }
  448. } catch (Exception $e) {
  449. BaseModel::rollbackTrans();
  450. throw exception($e->getMessage());
  451. } catch (DbException $e) {
  452. BaseModel::rollbackTrans();
  453. throw exception($e->getMessage());
  454. }
  455. }
  456. /**
  457. *获取授权方选项信息(可能不常用)
  458. * 如:地理位置上报,语音识别开关,多客服开关
  459. * @param array $param
  460. * @return mixed
  461. * @throws InvalidArgumentException
  462. * @throws \Exception
  463. */
  464. protected function getAuthorizerOption($param = ['mer_id' => '', 'option_name' => ''])
  465. {
  466. try {
  467. $mer_id = $param['mer_id'] ?? '';
  468. $option_name = $param['option_name'] ?? '';
  469. if (!$mer_id) {
  470. throw exception('未找到商家');
  471. }
  472. //根据商户id从商户表获取authorizer_appid和authorizer_refresh_token
  473. $authorizer_info = MerchantMiniprogram::vaildWhere()->where(['mer_id' => $mer_id])->find();
  474. if (!$authorizer_info) {
  475. throw exception('未找到商家');
  476. }
  477. $component_access_token = $this->getComponentAccessToken();
  478. $url = 'https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option?component_access_token=' . $component_access_token;
  479. $data = [
  480. 'component_appid' => $this->appId,
  481. 'authorizer_appid' => $authorizer_info['appid'],
  482. 'option_name' => $option_name,
  483. ];
  484. $res = json_decode(doRequest($url, $data, null, true, true), true);
  485. if (isset($res['option_value'])) {
  486. return $res['option_value'];
  487. } else {
  488. throw exception($res['errmsg'] ?? $res['msg'] ?? '请求错误');
  489. }
  490. } catch (Exception $e) {
  491. throw exception($e->getMessage());
  492. }
  493. }
  494. /**
  495. * 设置授权方选项信息
  496. * @param $mer_id
  497. * @param $option_name
  498. * @param $option_value
  499. * @return mixed
  500. * @throws InvalidArgumentException
  501. * @throws \Exception
  502. */
  503. public function setAuthorizerOption($mer_id, $option_name, $option_value)
  504. {
  505. try {
  506. if (!$mer_id) {
  507. return app('json')->fail('未找到商家');
  508. }
  509. //根据商户id从商户表获取authorizer_appid和authorizer_refresh_token
  510. $authorizer_info = MerchantMiniprogram::vaildWhere()->where(['mer_id' => $mer_id])->find();
  511. if (!$authorizer_info) {
  512. throw exception('未找到商家');
  513. }
  514. $component_access_token = $this->getComponentAccessToken();
  515. $url = 'https://api.weixin.qq.com/cgi-bin/component/api_set_authorizer_option?component_access_token=' . $component_access_token;
  516. $data = [
  517. 'component_appid' => $this->appId,
  518. 'authorizer_appid' => $authorizer_info['appid'],
  519. 'option_name' => $option_name,
  520. 'option_value' => $option_value,
  521. ];
  522. $res = json_decode(doRequest($url, $data, null, true, true), true);
  523. if (isset($res['errcode'])) {
  524. if ($res['errcode'] == 0) {
  525. return app('json')->success('设置成功');
  526. } else {
  527. return app('json')->fail($res['errmsg']);
  528. }
  529. } else {
  530. return app('json')->fail($res['errmsg'] ?? $res['msg'] ?? '请求错误');
  531. }
  532. } catch (Exception $e) {
  533. return app('json')->fail($e->getMessage(), ['file' => $e->getFile(), 'line' => $e->getLine()]);
  534. }
  535. }
  536. /**
  537. * 拉取所有已授权的帐号信息
  538. * @param array $page
  539. * @return mixed
  540. * @throws InvalidArgumentException
  541. * @throws \Exception
  542. */
  543. protected function getAuthorizerList($page = ['offset' => 1, 'count' => 10])
  544. {
  545. $offset = $page['offset'] ?? 1;
  546. $count = $page['count'] ?? 10;
  547. BaseModel::beginTrans();
  548. try {
  549. $component_access_token = $this->getComponentAccessToken();
  550. $url = 'https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list?component_access_token=' . $component_access_token;
  551. $data = [
  552. 'component_appid' => $this->appId,
  553. 'offset' => $offset,
  554. 'count' => $count,
  555. ];
  556. $res = json_decode(doRequest($url, $data, null, true, true), true);
  557. if (isset($res['total_count'])) {
  558. foreach ($res['list'] as $v) {
  559. MerchantMiniprogram::vaildWhere()->where('appid', $v['authorizer_appid'])->update(['authorizer_refresh_token' => $v['refresh_token'], 'update' => time()]);
  560. }
  561. BaseModel::commitTrans();
  562. return $res;
  563. } else {
  564. BaseModel::rollbackTrans();
  565. throw exception($res['errmsg'] ?? '请求错误');
  566. }
  567. } catch (Exception $e) {
  568. BaseModel::rollbackTrans();
  569. throw exception($e->getMessage());
  570. } catch (DbException $e) {
  571. BaseModel::rollbackTrans();
  572. throw exception($e->getMessage());
  573. }
  574. }
  575. /**
  576. * 前端获取某些信息
  577. * @param Request $request
  578. * @param string $info_type 获取的信息类型
  579. * @return mixed
  580. */
  581. public function getInfoForFront(Request $request, $info_type = 'AuthorizerAccessToken')
  582. {
  583. try {
  584. $function = 'get' . $info_type;
  585. if (method_exists($this, $function)) {
  586. if (!$request->param()) {
  587. $res = $this->$function();
  588. } else {
  589. $res = $this->$function($request->param());
  590. }
  591. return app('json')->success('ok', ['res' => $res]);
  592. } else {
  593. return app('json')->fail('获取失败');
  594. }
  595. } catch (Exception $e) {
  596. return app('json')->fail($e->getMessage(), ['file' => $e->getFile(), 'line' => $e->getLine()]);
  597. }
  598. }
  599. }