weixinOpenUtil.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace common\components;
  3. use common\services\xhWxOpenService;
  4. use Yii;
  5. use yii\helpers\Json;
  6. use common\models\xhWxOpen;
  7. use common\components\configDict;
  8. use linslin\yii2\curl;
  9. /**
  10. * 微信开放平台
  11. */
  12. class weixinOpenUtil
  13. {
  14. /**
  15. * 获取第三方平台component_access_token
  16. * @return unknown
  17. */
  18. public static function getComponentAccessToken($open)
  19. {
  20. $id = $open['id'];
  21. $componentAccessToken = $open['componentAccessToken'];
  22. $componentAccessTokenTime = $open['componentAccessTokenTime'];
  23. $now = time();
  24. if ($now > strtotime($componentAccessTokenTime)) {
  25. $appId = $open['appId'];
  26. $appSecret = $open['appSecret'];
  27. $verifyTicket = $open['verifyTicket'];
  28. $data = ['component_appid' => $appId, 'component_appsecret' => $appSecret, 'component_verify_ticket' => $verifyTicket];
  29. $url = 'https://api.weixin.qq.com/cgi-bin/component/api_component_token';
  30. $curl = new curl\Curl();
  31. $result = $curl->setOption(CURLOPT_POSTFIELDS, Json::encode($data))->post($url);
  32. $result = Json::decode($result);
  33. if (isset($result['component_access_token']) == false || empty($result['component_access_token'])) {
  34. echo '<pre>';
  35. print_r($result);
  36. Yii::info('get component access token error:' . json_encode($result));
  37. Yii::$app->end();
  38. }
  39. $component_access_token = $result['component_access_token'];
  40. $expiresIn = $result['expires_in'];
  41. $oData = [];
  42. $oData['componentAccessToken'] = $component_access_token;
  43. $oData['componentAccessTokenTime'] = date("Y-m-d H:i:s", ($now + $expiresIn - 100));//安全起见,将过期时间设置得比微信里还短
  44. xhWxOpenService::updateById($id, $oData);
  45. return $component_access_token;
  46. } else {
  47. return $componentAccessToken;
  48. }
  49. }
  50. /**
  51. * 获取预授权码pre_auth_code
  52. */
  53. public static function getPreAuthCode($open)
  54. {
  55. $id = $open['id'];
  56. $preAuthCode = $open['preAuthCode'];
  57. $preAuthCodeTime = $open['preAuthCodeTime'];
  58. $now = time();
  59. if ($now > strtotime($preAuthCodeTime)) {
  60. $token = self::getComponentAccessToken($open);
  61. $appId = $open['appId'];
  62. $url = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token={$token}";
  63. $curl = new curl\Curl();
  64. $data = ['component_appid' => $appId];
  65. $result = $curl->setOption(CURLOPT_POSTFIELDS, Json::encode($data))->post($url);
  66. $result = Json::decode($result);
  67. Yii::info($result);
  68. if (isset($result['pre_auth_code']) == false || empty($result['pre_auth_code'])) {
  69. echo "没有取到pre_auth_code,原因:" . json_encode($result) . " appid:" . $appId . " token:" . $token;
  70. Yii::$app->end();
  71. }
  72. $preAuthCode = $result['pre_auth_code'];
  73. $expiresIn = $result['expires_in'];
  74. $oData = [];
  75. $oData['preAuthCode'] = $preAuthCode;
  76. $oData['preAuthCodeTime'] = date("Y-m-d H:i:s", ($now + $expiresIn - 100));//安全起见,将过期时间设置得比微信里还短100秒
  77. xhWxOpenService::updateById($id, $oData);
  78. return $preAuthCode;
  79. } else {
  80. return $preAuthCode;
  81. }
  82. }
  83. /**
  84. * 使用授权码换取公众号的接口调用凭据和授权信息
  85. * authorizer_access_token authorizer_refresh_token
  86. */
  87. public static function getAuthorizer($code)
  88. {
  89. $id = configDict::getConfig('openId');
  90. $open = xhWxOpenService::getById($id);
  91. $appId = $open['appId'];
  92. $accessToken = self::getComponentAccessToken($open);
  93. $url = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token={$accessToken}";
  94. $curl = new curl\Curl();
  95. $data = ['authorization_code' => $code, 'component_appid' => $appId];
  96. $result = $curl->setOption(CURLOPT_POSTFIELDS, Json::encode($data))->post($url);
  97. $result = Json::decode($result);
  98. return $result;
  99. }
  100. /**
  101. * 获取授权方的公众号帐号基本信息
  102. * @param $authorizerAppId
  103. * @return unknown
  104. */
  105. public static function getAuthorizerInfo($authorizerAppId)
  106. {
  107. $id = configDict::getConfig('openId');
  108. $open = xhWxOpenService::getById($id);
  109. $appId = $open['appId'];
  110. $accessToken = self::getComponentAccessToken($open);
  111. $url = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token={$accessToken}";
  112. $curl = new curl\Curl();
  113. $data = ['component_appid' => $appId, 'authorizer_appid' => $authorizerAppId];
  114. $result = $curl->setOption(CURLOPT_POSTFIELDS, Json::encode($data))->post($url);
  115. $result = Json::decode($result);
  116. return $result;
  117. }
  118. }