weixinOpenUtil.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. if (empty($result)) {
  33. util::stop('没有取到ComponentAccessToken');
  34. }
  35. $result = Json::decode($result);
  36. if (isset($result['component_access_token']) == false || empty($result['component_access_token'])) {
  37. echo '<pre>';
  38. print_r($result);
  39. Yii::info('get component access token error:' . json_encode($result));
  40. Yii::$app->end();
  41. }
  42. $component_access_token = $result['component_access_token'];
  43. $expiresIn = $result['expires_in'];
  44. $oData = [];
  45. $oData['componentAccessToken'] = $component_access_token;
  46. $oData['componentAccessTokenTime'] = date("Y-m-d H:i:s", ($now + $expiresIn - 100));//安全起见,将过期时间设置得比微信里还短
  47. xhWxOpenService::updateById($id, $oData);
  48. return $component_access_token;
  49. } else {
  50. return $componentAccessToken;
  51. }
  52. }
  53. /**
  54. * 获取预授权码pre_auth_code
  55. */
  56. public static function getPreAuthCode($open)
  57. {
  58. $id = $open['id'];
  59. $preAuthCode = $open['preAuthCode'];
  60. $preAuthCodeTime = $open['preAuthCodeTime'];
  61. $now = time();
  62. if ($now > strtotime($preAuthCodeTime)) {
  63. $token = self::getComponentAccessToken($open);
  64. $appId = $open['appId'];
  65. $url = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token={$token}";
  66. $curl = new curl\Curl();
  67. $data = ['component_appid' => $appId];
  68. $result = $curl->setOption(CURLOPT_POSTFIELDS, Json::encode($data))->post($url);
  69. $result = Json::decode($result);
  70. Yii::info($result);
  71. if (isset($result['pre_auth_code']) == false || empty($result['pre_auth_code'])) {
  72. echo "没有取到pre_auth_code,原因:" . json_encode($result) . " appid:" . $appId . " token:" . $token;
  73. Yii::$app->end();
  74. }
  75. $preAuthCode = $result['pre_auth_code'];
  76. $expiresIn = $result['expires_in'];
  77. $oData = [];
  78. $oData['preAuthCode'] = $preAuthCode;
  79. $oData['preAuthCodeTime'] = date("Y-m-d H:i:s", ($now + $expiresIn - 100));//安全起见,将过期时间设置得比微信里还短100秒
  80. xhWxOpenService::updateById($id, $oData);
  81. return $preAuthCode;
  82. } else {
  83. return $preAuthCode;
  84. }
  85. }
  86. /**
  87. * 使用授权码换取公众号的接口调用凭据和授权信息
  88. * authorizer_access_token authorizer_refresh_token
  89. */
  90. public static function getAuthorizer($code)
  91. {
  92. $id = configDict::getConfig('openId');
  93. $open = xhWxOpenService::getById($id);
  94. $appId = $open['appId'];
  95. $accessToken = self::getComponentAccessToken($open);
  96. $url = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token={$accessToken}";
  97. $curl = new curl\Curl();
  98. $data = ['authorization_code' => $code, 'component_appid' => $appId];
  99. $result = $curl->setOption(CURLOPT_POSTFIELDS, Json::encode($data))->post($url);
  100. $result = Json::decode($result);
  101. return $result;
  102. }
  103. /**
  104. * 获取授权方的公众号帐号基本信息
  105. * @param $authorizerAppId
  106. * @return unknown
  107. */
  108. public static function getAuthorizerInfo($authorizerAppId)
  109. {
  110. $id = configDict::getConfig('openId');
  111. $open = xhWxOpenService::getById($id);
  112. $appId = $open['appId'];
  113. $accessToken = self::getComponentAccessToken($open);
  114. $url = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token={$accessToken}";
  115. $curl = new curl\Curl();
  116. $data = ['component_appid' => $appId, 'authorizer_appid' => $authorizerAppId];
  117. $result = $curl->setOption(CURLOPT_POSTFIELDS, Json::encode($data))->post($url);
  118. $result = Json::decode($result);
  119. return $result;
  120. }
  121. }