Sample.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace app\extend\Dingtalk;
  3. use AlibabaCloud\SDK\Dingtalk\Voauth2_1_0\Dingtalk;
  4. use \Exception;
  5. use AlibabaCloud\Tea\Exception\TeaError;
  6. use AlibabaCloud\Tea\Utils\Utils;
  7. use Darabonba\OpenApi\Models\Config;
  8. use AlibabaCloud\SDK\Dingtalk\Voauth2_1_0\Models\GetAccessTokenRequest;
  9. use AlibabaCloud\SDK\Dingtalk\Voauth2_1_0\Models\CreateJsapiTicketHeaders;
  10. use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
  11. use think\cache\driver\Redis;
  12. class Sample
  13. {
  14. /**
  15. * 使用 Token 初始化账号Client
  16. * @return Dingtalk Client
  17. */
  18. public static function createClient()
  19. {
  20. $config = new Config([]);
  21. $config->protocol = "https";
  22. $config->regionId = "central";
  23. return new Dingtalk($config);
  24. }
  25. // 获取应用身份相关访问凭证
  26. /**
  27. * 获取企业内部应用的accessToken
  28. **/
  29. public static function accessToken()
  30. {
  31. $redis = new Redis(config('redis.'));
  32. $key = 'dingtalk_accessToken';
  33. $access_token_data = $redis->get($key);
  34. if ($access_token_data) {
  35. return json_decode($access_token_data, true);
  36. }
  37. $config = config('app.dingtalk');
  38. $client = self::createClient();
  39. $getAccessTokenRequest = new GetAccessTokenRequest([
  40. "appKey" => $config['appKey'],
  41. "appSecret" => $config['appSecret']
  42. ]);
  43. try {
  44. $res = $client->getAccessToken($getAccessTokenRequest);
  45. } catch (Exception $err) {
  46. if (!($err instanceof TeaError)) {
  47. $err = new TeaError([], $err->getMessage(), $err->getCode(), $err);
  48. }
  49. if (!Utils::empty_($err->code) && !Utils::empty_($err->message)) {
  50. // err 中含有 code 和 message 属性,可帮助开发定位问题
  51. }
  52. p($err->getMessage(), $err->getCode());exit;
  53. }
  54. // {"accessToken" : "fw8ef8we8f76e6f7s8dxxxx","expireIn" : 7200}
  55. $data = [
  56. 'accessToken' => $res->body->accessToken,
  57. 'expireIn' => $res->body->expireIn,
  58. ];
  59. $redis->set($key, json_encode($data), 7100);
  60. return $data;
  61. }
  62. /**
  63. * 获取jsapiTicket
  64. **/
  65. public static function jsapiTickets(){
  66. $redis = new Redis(config('redis.'));
  67. $key = 'dingtalk_jsapiTicket';
  68. $access_token_data = $redis->get($key);
  69. if ($access_token_data) {
  70. return json_decode($access_token_data, true);
  71. }
  72. $accessToken = self::accessToken()['accessToken'];
  73. $client = self::createClient();
  74. $createJsapiTicketHeaders = new CreateJsapiTicketHeaders([]);
  75. $createJsapiTicketHeaders->xAcsDingtalkAccessToken = $accessToken;
  76. try {
  77. $res = $client->createJsapiTicketWithOptions($createJsapiTicketHeaders, new RuntimeOptions([]));
  78. } catch (Exception $err) {
  79. if (!($err instanceof TeaError)) {
  80. $err = new TeaError([], $err->getMessage(), $err->getCode(), $err);
  81. }
  82. if (!Utils::empty_($err->code) && !Utils::empty_($err->message)) {
  83. // err 中含有 code 和 message 属性,可帮助开发定位问题
  84. }
  85. p($err->getMessage(), $err->getCode());exit;
  86. }
  87. // {"jsapiTicket" : "fw8ef8we8f76e6f7s8dxxxx","expireIn" : 7200}
  88. $data = [
  89. 'jsapiTicket' => $res->body->jsapiTicket,
  90. 'expireIn' => $res->body->expireIn,
  91. ];
  92. $redis->set($key, json_encode($data), 7100);
  93. return $data;
  94. }
  95. }