12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- <?php
- /**
- * @note: 公众号相关
- * @author: jdzor <895947580@qq.com>
- * @date: 2019/4/2
- */
- namespace payment\wechat;
- /**
- * 接口文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
- *
- * Class WechatJsapi
- * @package app\common\extend\wechat
- */
- class WechatJsapi extends BaseWechat
- {
- const AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STATE#wechat_redirect";
- const ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
- const REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s";
- const USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN";
- /*
- 1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
- 2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
- 3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,
- 才能根据用户openid来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
- */
- const BASE_SCOPE = 'snsapi_base';
- const USERINFO_SCOPE = 'snsapi_userinfo';
- private $jsapiAppId;
- private $jsapiSecret;
- public function __construct($config)
- {
- parent::__construct($config);
- isset($config['jsapi_appid']) || json_error('缺少参数:jsapi_appid');
- isset($config['jsapi_secret']) || json_error('缺少参数:jsapi_secret');
- $this->jsapiAppId = $config['jsapi_appid'];
- $this->jsapiSecret = $config['jsapi_secret'];
- }
- //获取code
- public function getCode($redirectUrl, $scope = self::BASE_SCOPE)
- {
- $authorizeUrl = sprintf(self::AUTHORIZE_URL, $this->jsapiAppId, urlencode($redirectUrl), $scope);
- //重定向请求微信用户信息
- header("Location: " . $authorizeUrl);
- }
- //获取access_token
- public function getAccessToken($code)
- {
- $accessTokenUrl = sprintf(self::ACCESS_TOKEN_URL, $this->jsapiAppId, $this->jsapiSecret, $code);
- return $this->getCurl($accessTokenUrl);
- }
- //刷新access_token
- public function refreshAccessToken($refreshToken)
- {
- $refreshTokenUrl = sprintf(self::REFRESH_TOKEN_URL, $this->jsapiAppId, $refreshToken);
- return $this->getCurl($refreshTokenUrl);
- }
- //获取用户信息
- public function getUserInfo($accessToken, $openid)
- {
- $userInfoUrl = sprintf(self::USERINFO_URL, $accessToken, $openid);
- return $this->getCurl($userInfoUrl);
- }
- //生成微信公众号分享参数
- public function getShareData()
- {
- $data['appId'] = $this->appId;
- $data['nonceStr'] = $this->getRandomString();
- $data['timeStamp'] = time();
- $data['paySign'] = $this->makeSign($data);
- return $data;
- }
- }
|