(2)网页授权获取用户基本信息
(二)网页授权获取用户基本信息
在公众号的配置过程中,许多开发者会在菜单中加入HTML5页面,有时在页面内需要访问页面的用户信息,此时就需要网页授权获取用户基本信息
PS:本博文所阐述的微信开发基于Yii2.0框架
1、设置授权回调域名:开发 ---> 接口权限
找到“网页授权获取用户基本信息”,点击后面对应的“修改”,在弹框响应位置填写授权回调域名即可,此处的域名不需要加http:// (关于网页授权回调域名的说明详情可参考公众平台开发者文档)
2、获取授权
关于OAuth2.0博主参考的是方倍工作室的博文http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html(PS:方倍是一个微信开发大神,其中的微信开发内容还是比较详细的,推荐参考),其中详细剖析了微信官方文档的相关内容,也提供了获取授权的更详细思路和方案。
实际上,获取用户信息的关键在于获取用户的openid。博主想要实现用户点击公众号菜单打开页面即可自动授权,从而针对该用户进行数据库操作,于是有下面两种方式:
(1)利用自定义菜单请求授权页面
自定义菜单后面会单独写一篇博文,在这里先简述一下通过自定义菜单进行授权,该方法需要高级接口权限,且局限于关注公众号的用户直接从菜单进入页面。
1 |
|
需要授权的view直接在url处填写微信提供的授权请求地址,其中:
- appid:填写微信公众平台基本配置中的AppID;
- redirect_uri:填写授权完成后跳转的页面地址,即自己的html5页面;
- state:跳转至回调页面所带参数;
-
response_type:网页授权的两种scope,微信官方文档中说明如下:
1
1<span style=
"color: #000000;"
>、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)</span>2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
登录后复制按照此方法点击“商城”即可接收到返回的openid,继而进行下一步用户信息的获取。
(2)利用JS自动请求授权页面
这个方法相对而言比较笨拙,步骤略复杂,但目前能解决需求还没有研究简化方法,且由于页面的跳转多数情况下访问页面的时间会增加,但相比于前一个方法,该方法可以获取到非关注用户的基本信息。有些程序可能涉及到页面分享,程序没有强制关注但其他用户通过分享直接进入页面也需要记录用户信息,此时可以考虑该方法。(微信开发相关的代码博主封装成工具类调用,这里先贴用到的部分,以后整理完成会全部贴出来并附下载链接)
该方法的思路为:js请求链接获取code ---> 利用code换取openid ---> 得到用户基本信息
a. 编辑配置
为了方便把用到的一些微信参数单独写入一个类,方便修改添加及调用
1
<span style=
"color: #008080;"
> 1</span> <span style=
"color: #000000;"
>php</span><span style=
"color: #008080;"
> 2</span> <span style=
"color: #000000;"
>
namespace
common\tools\wechat;</span><span style=
"color: #008080;"
> 3</span> <span style=
"color: #008080;"
> 4</span> <span style=
"color: #008000;"
>
/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 5</span> <span style="color: #008000;"> * 微信请求相关配置类库</span><span style="color: #008080;"> 6</span> <span style="color: #008000;">*/
</span><span style=
"color: #008080;"
> 7</span> <span style=
"color: #0000ff;"
>
class
</span><span style=
"color: #000000;"
> ConfigTool {</span><span style=
"color: #008080;"
> 8</span> <span style=
"color: #008080;"
> 9</span> <span style=
"color: #008000;"
>
/*</span><span style="color: #008000;">*</span><span style="color: #008080;">10</span> <span style="color: #008000;"> * 微信配置参数</span><span style="color: #008080;">11</span> <span style="color: #008000;"> * @return array 配置参数</span><span style="color: #008080;">12</span> <span style="color: #008000;">*/
</span><span style=
"color: #008080;"
>13</span> <span style=
"color: #0000ff;"
>
public
</span> <span style=
"color: #0000ff;"
>
function
</span><span style=
"color: #000000;"
> setConfig() {</span><span style=
"color: #008080;"
>14</span> <span style=
"color: #008080;"
>15</span> <span style=
"color: #008000;"
>
//</span><span style="color: #008000;"> 用于验证微信接口配置信息的Token,可以任意填写</span><span style="color: #008080;">16</span> <span style="color: #800080;">$config</span>['token'] = '自己的token'<span style="color: #000000;">;</span><span style="color: #008080;">17</span> <span style="color: #008080;">18</span> <span style="color: #008000;">//</span><span style="color: #008000;"> appID</span><span style="color: #008080;">19</span> <span style="color: #800080;">$config</span>['appid'] = '自己的appid'<span style="color: #000000;">;</span><span style="color: #008080;">20</span> <span style="color: #008080;">21</span> <span style="color: #008000;">//</span><span style="color: #008000;"> appSecret</span><span style="color: #008080;">22</span> <span style="color: #800080;">$config</span>['secret'] = '自己的secret'<span style="color: #000000;">;</span><span style="color: #008080;">23</span> <span style="color: #008080;">24</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 回调链接地址</span><span style="color: #008080;">25</span> <span style="color: #800080;">$config</span>['redirect_uri'] = 'http://tx.heivr.com/index.php?'<span style="color: #000000;">;</span><span style="color: #008080;">26</span> <span style="color: #008080;">27</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 是否以 HTTPS 安全协议访问接口</span><span style="color: #008080;">28</span> <span style="color: #800080;">$config</span>['https_request'] = <span style="color: #0000ff;">false</span><span style="color: #000000;">;</span><span style="color: #008080;">29</span> <span style="color: #008080;">30</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),</span><span style="color: #008080;">31</span> <span style="color: #008000;"> // snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,</span><span style="color: #008080;">32</span> <span style="color: #008000;"> // 即使在未关注的情况下,只要用户授权,也能获取其信息)</span><span style="color: #008080;">33</span> <span style="color: #800080;">$config</span>['scope'] = 'snsapi_userinfo'<span style="color: #000000;">;</span><span style="color: #008080;">34</span> <span style="color: #008080;">35</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 语言</span><span style="color: #008080;">36</span> <span style="color: #800080;">$config</span>['lang'] = 'zh_CN'; <span style="color: #008000;">//</span><span style="color: #008000;"> zh_CN 简体,zh_TW 繁体,en 英语</span><span style="color: #008080;">37</span> <span style="color: #008080;">38</span> <span style="color: #008000;"> // 微信公众账户授权地址</span><span style="color: #008080;">39</span> <span style="color: #800080;">$config</span>['mp_authorize_url'] = 'https://api.weixin.qq.com/cgi-bin/token'<span style="color: #000000;">;</span><span style="color: #008080;">40</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 微信公众账户js临时票据地址</span><span style="color: #008080;">41</span> <span style="color: #800080;">$config</span>['jsapi_ticket_url'] = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket'<span style="color: #000000;">;</span><span style="color: #008080;">42</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 授权地址</span><span style="color: #008080;">43</span> <span style="color: #800080;">$config</span>['authorize_url'] = 'https://open.weixin.qq.com/connect/oauth2/authorize'<span style="color: #000000;">;</span><span style="color: #008080;">44</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 获取access token 的地址</span><span style="color: #008080;">45</span> <span style="color: #800080;">$config</span>['access_token_url'] = 'https://api.weixin.qq.com/sns/oauth2/access_token'<span style="color: #000000;">;</span><span style="color: #008080;">46</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 刷新 token 的地址</span><span style="color: #008080;">47</span> <span style="color: #800080;">$config</span>['refresh_token_url'] = 'https://api.weixin.qq.com/sns/oauth2/refresh_token'<span style="color: #000000;">;</span><span style="color: #008080;">48</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 获取用户信息地址</span><span style="color: #008080;">49</span> <span style="color: #800080;">$config</span>['userinfo_url'] = 'https://api.weixin.qq.com/sns/userinfo'<span style="color: #000000;">;</span><span style="color: #008080;">50</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 验证access token</span><span style="color: #008080;">51</span> <span style="color: #800080;">$config</span>['valid_token_url'] = 'https://api.weixin.qq.com/sns/auth'<span style="color: #000000;">;</span><span style="color: #008080;">52</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 上传临时素材地址</span><span style="color: #008080;">53</span> <span style="color: #800080;">$config</span>['media_temp_upload_url'] = 'https://api.weixin.qq.com/cgi-bin/media/upload?'<span style="color: #000000;">;</span><span style="color: #008080;">54</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 上传永久素材地址</span><span style="color: #008080;">55</span> <span style="color: #800080;">$config</span>['media_forever_upload_url'] = 'https://api.weixin.qq.com/cgi-bin/material/add_material?'<span style="color: #000000;">;</span><span style="color: #008080;">56</span> <span style="color: #008080;">57</span> <span style="color: #0000ff;">return</span> <span style="color: #800080;">$config</span><span style="color: #000000;">;</span><span style="color: #008080;">58</span> <span style="color: #008080;">59</span> <span style="color: #000000;"> }</span><span style="color: #008080;">60</span> }
登录后复制b. https请求工具
1
<span style=
"color: #008080;"
> 1</span> <span style=
"color: #000000;"
>php</span><span style=
"color: #008080;"
> 2</span> <span style=
"color: #000000;"
>
namespace
common\tools;</span><span style=
"color: #008080;"
> 3</span> <span style=
"color: #008080;"
> 4</span> <span style=
"color: #008000;"
>
/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 5</span> <span style="color: #008000;"> * https请求相关类库</span><span style="color: #008080;"> 6</span> <span style="color: #008000;">*/
</span><span style=
"color: #008080;"
> 7</span> <span style=
"color: #0000ff;"
>
class
</span><span style=
"color: #000000;"
> HttpsTool {</span><span style=
"color: #008080;"
> 8</span> <span style=
"color: #008080;"
> 9</span> <span style=
"color: #0000ff;"
>
const
</span> TIMEOUT = 5; <span style=
"color: #008000;"
>
//</span><span style="color: #008000;"> 设置超时时间</span><span style="color: #008080;">10</span> <span style="color: #008080;">11</span> <span style="color: #0000ff;">private</span> <span style="color: #800080;">$ch</span>; <span style="color: #008000;">//</span><span style="color: #008000;"> curl对象</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">14</span> <span style="color: #008000;"> * 发送curl请求,并获取请求结果</span><span style="color: #008080;">15</span> <span style="color: #008000;"> * @param string 请求地址</span><span style="color: #008080;">16</span> <span style="color: #008000;"> * @param array 如果是post请求则需要传入请求参数</span><span style="color: #008080;">17</span> <span style="color: #008000;"> * @param string 请求方法,get 或者 post, 默认为get</span><span style="color: #008080;">18</span> <span style="color: #008000;"> * @param bool 是否以https协议请求</span><span style="color: #008080;">19</span> <span style="color: #008000;">*/</span><span style="color: #008080;">20</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> send_request(<span style="color: #800080;">$requests</span>, <span style="color: #800080;">$params</span> = <span style="color: #0000ff;">null</span>, <span style="color: #800080;">$method</span> = 'get', <span style="color: #800080;">$https</span> = <span style="color: #0000ff;">true</span><span style="color: #000000;">) {</span><span style="color: #008080;">21</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 以get方式提交</span><span style="color: #008080;">22</span> <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$method</span> == 'get'<span style="color: #000000;">) {</span><span style="color: #008080;">23</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$params</span><span style="color: #000000;">){</span><span style="color: #008080;">24</span> <span style="color: #800080;">$request</span> = <span style="color: #800080;">$requests</span> . <span style="color: #800080;">$this</span>->create_url(<span style="color: #800080;">$params</span><span style="color: #000000;">);</span><span style="color: #008080;">25</span> }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">26</span> <span style="color: #800080;">$request</span> = <span style="color: #800080;">$requests</span><span style="color: #000000;">;</span><span style="color: #008080;">27</span> <span style="color: #000000;"> }</span><span style="color: #008080;">28</span> }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">29</span> <span style="color: #800080;">$request</span> = <span style="color: #800080;">$requests</span><span style="color: #000000;">;</span><span style="color: #008080;">30</span> <span style="color: #000000;"> }</span><span style="color: #008080;">31</span> <span style="color: #008080;">32</span> <span style="color: #800080;">$this</span>->ch = curl_init(<span style="color: #800080;">$request</span><span style="color: #000000;">);</span><span style="color: #008080;">33</span> curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_RETURNTRANSFER, 1);<span style="color: #008000;">//</span><span style="color: #008000;"> 设置不显示结果,储存入变量</span><span style="color: #008080;">34</span> curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_TIMEOUT, self::TIMEOUT); <span style="color: #008000;">//</span><span style="color: #008000;"> 设置超时限制防止死循环</span><span style="color: #008080;">35</span> <span style="color: #008080;">36</span> <span style="color: #008000;"> // 判断是否以https方式访问</span><span style="color: #008080;">37</span> <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$https</span><span style="color: #000000;">) {</span><span style="color: #008080;">38</span> curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_SSL_VERIFYPEER, 0); <span style="color: #008000;">//</span><span style="color: #008000;"> 对认证证书来源的检查</span><span style="color: #008080;">39</span> curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_SSL_VERIFYHOST, 0); <span style="color: #008000;">//</span><span style="color: #008000;"> 从证书中检查SSL加密算法是否存在</span><span style="color: #008080;">40</span> <span style="color: #000000;"> }</span><span style="color: #008080;">41</span> <span style="color: #008080;">42</span> <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$method</span> == 'post') { <span style="color: #008000;">//</span><span style="color: #008000;"> 以post方式提交</span><span style="color: #008080;">43</span> <span style="color: #008000;"> //curl_setopt($this->ch, CURLOPT_SAFE_UPLOAD, false); //php 5.6文件上传必加内容,5.4不需要</span><span style="color: #008080;">44</span> curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_POST, 1); <span style="color: #008000;">//</span><span style="color: #008000;"> 发送一个常规的Post请求</span><span style="color: #008080;">45</span> curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_POSTFIELDS, <span style="color: #800080;">$params</span>); <span style="color: #008000;">//</span><span style="color: #008000;"> Post提交的数据包</span><span style="color: #008080;">46</span> curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_RETURNTRANSFER, 1<span style="color: #000000;">);</span><span style="color: #008080;">47</span> <span style="color: #000000;"> }</span><span style="color: #008080;">48</span> <span style="color: #008080;">49</span> <span style="color: #800080;">$tmpInfo</span> = curl_exec(<span style="color: #800080;">$this</span>->ch); <span style="color: #008000;">//</span><span style="color: #008000;"> 执行操作</span><span style="color: #008080;">50</span> <span style="color: #0000ff;">if</span> (curl_errno(<span style="color: #800080;">$this</span>-><span style="color: #000000;">ch)) {</span><span style="color: #008080;">51</span> <span style="color: #0000ff;">echo</span> 'Errno:'.curl_error(<span style="color: #800080;">$this</span>->ch);<span style="color: #008000;">//</span><span style="color: #008000;">捕抓异常</span><span style="color: #008080;">52</span> <span style="color: #000000;"> }</span><span style="color: #008080;">53</span> curl_close(<span style="color: #800080;">$this</span>->ch); <span style="color: #008000;">//</span><span style="color: #008000;"> 关闭CURL会话</span><span style="color: #008080;">54</span> <span style="color: #008000;"> //var_dump($tmpInfo);exit;</span><span style="color: #008080;">55</span> <span style="color: #0000ff;">return</span> <span style="color: #800080;">$tmpInfo</span>; <span style="color: #008000;">//</span><span style="color: #008000;"> 返回数据</span><span style="color: #008080;">56</span> <span style="color: #000000;"> }</span><span style="color: #008080;">57</span> <span style="color: #008080;">58</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">59</span> <span style="color: #008000;"> * 生成url</span><span style="color: #008080;">60</span> <span style="color: #008000;">*/</span><span style="color: #008080;">61</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> create_url(<span style="color: #800080;">$data</span><span style="color: #000000;">) {</span><span style="color: #008080;">62</span> <span style="color: #800080;">$temp</span> = '?'<span style="color: #000000;">;</span><span style="color: #008080;">63</span> <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$data</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$item</span><span style="color: #000000;">) {</span><span style="color: #008080;">64</span> <span style="color: #800080;">$temp</span> = <span style="color: #800080;">$temp</span> . <span style="color: #800080;">$key</span> . '=' . <span style="color: #800080;">$item</span> . '&'<span style="color: #000000;">;</span><span style="color: #008080;">65</span> <span style="color: #000000;"> }</span><span style="color: #008080;">66</span> <span style="color: #0000ff;">return</span> <span style="color: #008080;">substr</span>(<span style="color: #800080;">$temp</span>, 0, -1<span style="color: #000000;">);</span><span style="color: #008080;">67</span> <span style="color: #000000;"> }</span><span style="color: #008080;">68</span> }
登录后复制1
<span style=
"font-family: 宋体; font-size: 16px;"
>关于curl_setopt(
$this
->ch, CURLOPT_SAFE_UPLOAD, false)会在微信图片资源上传博文中详细讲述它出现的心酸史,这里暂时用不到,不做解释</span>
登录后复制c. 授权基类
1
<span style=
"color: #008080;"
> 1</span> <span style=
"color: #000000;"
>php </span><span style=
"color: #008080;"
> 2</span> <span style=
"color: #000000;"
>
namespace
common\tools\wechat;</span><span style=
"color: #008080;"
> 3</span> <span style=
"color: #008080;"
> 4</span> <span style=
"color: #0000ff;"
>
use
</span><span style=
"color: #000000;"
> common\tools\wechat\ConfigTool;</span><span style=
"color: #008080;"
> 5</span> <span style=
"color: #0000ff;"
>
use
</span><span style=
"color: #000000;"
> common\tools\HttpsTool;</span><span style=
"color: #008080;"
> 6</span> <span style=
"color: #008000;"
>
/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 7</span> <span style="color: #008000;">* Weixin_oauth 类库</span><span style="color: #008080;"> 8</span> <span style="color: #008000;">*/
</span><span style=
"color: #008080;"
> 9</span> <span style=
"color: #0000ff;"
>
class
</span><span style=
"color: #000000;"
> OauthTool {</span><span style=
"color: #008080;"
>10</span> <span style=
"color: #008080;"
>11</span> <span style=
"color: #0000ff;"
>
public
</span> <span style=
"color: #800080;"
>
$conf
</span><span style=
"color: #000000;"
>;</span><span style=
"color: #008080;"
>12</span> <span style=
"color: #008080;"
>13</span> <span style=
"color: #0000ff;"
>
public
</span> <span style=
"color: #0000ff;"
>
function
</span><span style=
"color: #000000;"
> __construct(){</span><span style=
"color: #008080;"
>14</span> <span style=
"color: #800080;"
>
$re
</span> = <span style=
"color: #0000ff;"
>
new
</span><span style=
"color: #000000;"
> ConfigTool; </span><span style=
"color: #008080;"
>15</span> <span style=
"color: #800080;"
>
$this
</span>->conf = <span style=
"color: #800080;"
>
$re
</span>-><span style=
"color: #000000;"
>setConfig();</span><span style=
"color: #008080;"
>16</span> <span style=
"color: #000000;"
> } </span><span style=
"color: #008080;"
>17</span> <span style=
"color: #008080;"
>18</span> <span style=
"color: #008000;"
>
/*</span><span style="color: #008000;">*</span><span style="color: #008080;">19</span> <span style="color: #008000;"> * 生成用户授权的地址</span><span style="color: #008080;">20</span> <span style="color: #008000;"> * @param string 自定义需要保持的信息</span><span style="color: #008080;">21</span> <span style="color: #008000;"> * @param sting 请求的路由</span><span style="color: #008080;">22</span> <span style="color: #008000;"> * @param bool 是否是通过公众平台方式认真</span><span style="color: #008080;">23</span> <span style="color: #008000;">*/
</span><span style=
"color: #008080;"
>24</span> <span style=
"color: #0000ff;"
>
public
</span> <span style=
"color: #0000ff;"
>
function
</span> authorize_addr(<span style=
"color: #800080;"
>
$route
</span>, <span style=
"color: #800080;"
>
$state
</span>=
''
, <span style=
"color: #800080;"
>
$mp
</span>=<span style=
"color: #0000ff;"
>false</span><span style=
"color: #000000;"
>) {</span><span style=
"color: #008080;"
>25</span> <span style=
"color: #008080;"
>26</span> <span style=
"color: #0000ff;"
>
if
</span> (<span style=
"color: #800080;"
>
$mp
</span><span style=
"color: #000000;"
>) {</span><span style=
"color: #008080;"
>27</span> <span style=
"color: #800080;"
>
$data
</span> =<span style=
"color: #000000;"
> [</span><span style=
"color: #008080;"
>28</span>
'appid'
=> <span style=
"color: #800080;"
>
$this
</span>->conf[
'appid'
],<span style=
"color: #008080;"
>29</span>
'secret'
=> <span style=
"color: #800080;"
>
$this
</span>->conf[
'token'
],<span style=
"color: #008080;"
>30</span>
'grant_type'
=>
'client_credential'
<span style=
"color: #008080;"
>31</span> <span style=
"color: #000000;"
> ];</span><span style=
"color: #008080;"
>32</span> <span style=
"color: #800080;"
>
$url
</span> = <span style=
"color: #800080;"
>
$this
</span>->conf[
'mp_authorize_url'
<span style=
"color: #000000;"
>];</span><span style=
"color: #008080;"
>33</span> } <span style=
"color: #0000ff;"
>
else
</span><span style=
"color: #000000;"
> {</span><span style=
"color: #008080;"
>34</span> <span style=
"color: #800080;"
>
$data
</span> =<span style=
"color: #000000;"
> [</span><span style=
"color: #008080;"
>35</span>
'appid'
=> <span style=
"color: #800080;"
>
$this
</span>->conf[
'appid'
], <span style=
"color: #008000;"
>
//</span><span style="color: #008000;">公众号唯一标识</span><span style="color: #008080;">36</span> 'redirect_uri' => <span style="color: #008080;">urlencode</span>(<span style="color: #800080;">$this</span>->conf['redirect_uri'] . <span style="color: #800080;">$route</span>), <span style="color: #008000;">//</span><span style="color: #008000;">授权后重定向的回调链接地址</span><span style="color: #008080;">37</span> 'response_type' => 'code', <span style="color: #008000;">//</span><span style="color: #008000;">返回类型,此处填写code</span><span style="color: #008080;">38</span> 'scope'=><span style="color: #800080;">$this</span>->conf['scope'], <span style="color: #008000;">//</span><span style="color: #008000;">应用授权作用域</span><span style="color: #008080;">39</span> 'state'=><span style="color: #800080;">$state</span>, <span style="color: #008000;">//</span><span style="color: #008000;">重定向后带上state参数,开发者可以填写任意参数</span><span style="color: #008080;">40</span> '#wechat_redirect'=>'' <span style="color: #008000;">//</span><span style="color: #008000;">直接在微信打开链接,可不填,做页面302重定向时必须带此参数</span><span style="color: #008080;">41</span> <span style="color: #000000;"> ];</span><span style="color: #008080;">42</span> <span style="color: #800080;">$url</span> = <span style="color: #800080;">$this</span>->conf['authorize_url'<span style="color: #000000;">];</span><span style="color: #008080;">43</span> <span style="color: #000000;"> }</span><span style="color: #008080;">44</span> <span style="color: #008080;">45</span> <span style="color: #800080;">$send</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> HttpsTool;</span><span style="color: #008080;">46</span> <span style="color: #008000;">//</span><span style="color: #008000;">var_dump($url . $send->create_url($data));exit;</span><span style="color: #008080;">47</span> <span style="color: #0000ff;">return</span> <span style="color: #800080;">$url</span> . <span style="color: #800080;">$send</span>->create_url(<span style="color: #800080;">$data</span><span style="color: #000000;">);</span><span style="color: #008080;">48</span> <span style="color: #000000;"> }</span><span style="color: #008080;">49</span> <span style="color: #008080;">50</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">51</span> <span style="color: #008000;"> * 获取 access token</span><span style="color: #008080;">52</span> <span style="color: #008000;"> * @param string 用于换取access token的code,微信提供</span><span style="color: #008080;">53</span> <span style="color: #008000;">*/</span><span style="color: #008080;">54</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> access_token(<span style="color: #800080;">$code</span><span style="color: #000000;">) {</span><span style="color: #008080;">55</span> <span style="color: #008080;">56</span> <span style="color: #800080;">$data</span> =<span style="color: #000000;"> [</span><span style="color: #008080;">57</span> 'appid' => <span style="color: #800080;">$this</span>->conf['appid'],<span style="color: #008080;">58</span> 'secret' => <span style="color: #800080;">$this</span>->conf['secret'],<span style="color: #008080;">59</span> 'code' => <span style="color: #800080;">$code</span>,<span style="color: #008080;">60</span> 'grant_type' => 'authorization_code'<span style="color: #008080;">61</span> <span style="color: #000000;"> ];</span><span style="color: #008080;">62</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 生成授权url</span><span style="color: #008080;">63</span> <span style="color: #800080;">$url</span> = <span style="color: #800080;">$this</span>->conf['access_token_url'<span style="color: #000000;">];</span><span style="color: #008080;">64</span> <span style="color: #008080;">65</span> <span style="color: #800080;">$send</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> HttpsTool;</span><span style="color: #008080;">66</span> <span style="color: #0000ff;">return</span> <span style="color: #800080;">$send</span>->send_request(<span style="color: #800080;">$url</span>, <span style="color: #800080;">$data</span><span style="color: #000000;">);</span><span style="color: #008080;">67</span> <span style="color: #000000;"> }</span><span style="color: #008080;">68</span> <span style="color: #008080;">69</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">70</span> <span style="color: #008000;"> * 获取用户信息</span><span style="color: #008080;">71</span> <span style="color: #008000;"> * @param string access token</span><span style="color: #008080;">72</span> <span style="color: #008000;"> * @param string 用户的open id</span><span style="color: #008080;">73</span> <span style="color: #008000;">*/</span><span style="color: #008080;">74</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> userinfo(<span style="color: #800080;">$token</span>, <span style="color: #800080;">$openid</span><span style="color: #000000;">) {</span><span style="color: #008080;">75</span> <span style="color: #008080;">76</span> <span style="color: #800080;">$data</span> =<span style="color: #000000;"> [</span><span style="color: #008080;">77</span> 'access_token' => <span style="color: #800080;">$token</span>,<span style="color: #008080;">78</span> 'openid' => <span style="color: #800080;">$openid</span>,<span style="color: #008080;">79</span> 'lang' => <span style="color: #800080;">$this</span>->conf['lang'<span style="color: #000000;">]</span><span style="color: #008080;">80</span> <span style="color: #000000;"> ];</span><span style="color: #008080;">81</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 生成授权url</span><span style="color: #008080;">82</span> <span style="color: #800080;">$url</span> = <span style="color: #800080;">$this</span>->conf['userinfo_url'<span style="color: #000000;">];</span><span style="color: #008080;">83</span> <span style="color: #008080;">84</span> <span style="color: #800080;">$send</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> HttpsTool;</span><span style="color: #008080;">85</span> <span style="color: #0000ff;">return</span> <span style="color: #800080;">$send</span>->send_request(<span style="color: #800080;">$url</span>, <span style="color: #800080;">$data</span><span style="color: #000000;">);</span><span style="color: #008080;">86</span> <span style="color: #000000;"> }</span><span style="color: #008080;">87</span> <span style="color: #008080;">88</span> }
登录后复制d. 授权基类调用及用户数据处理(在控制器调用前,先对用户数据存入或更新)
1
<span style=
"color: #008080;"
> 1</span> <span style=
"color: #000000;"
>php</span><span style=
"color: #008080;"
> 2</span> <span style=
"color: #000000;"
>
namespace
wechat\controllers\classes;</span><span style=
"color: #008080;"
> 3</span> <span style=
"color: #008080;"
> 4</span> <span style=
"color: #0000ff;"
>
use
</span><span style=
"color: #000000;"
> common\tools\wechat\OauthTool;</span><span style=
"color: #008080;"
> 5</span> <span style=
"color: #0000ff;"
>
use
</span><span style=
"color: #000000;"
> common\models\User;</span><span style=
"color: #008080;"
> 6</span> <span style=
"color: #0000ff;"
>
use
</span><span style=
"color: #000000;"
> common\tools\EmojiTool;</span><span style=
"color: #008080;"
> 7</span> <span style=
"color: #008080;"
> 8</span> <span style=
"color: #008000;"
>
/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 9</span> <span style="color: #008000;"> * 微信用户基本信息获取</span><span style="color: #008080;">10</span> <span style="color: #008000;">*/
</span><span style=
"color: #008080;"
>11</span> <span style=
"color: #0000ff;"
>
class
</span><span style=
"color: #000000;"
> UserinfoClass {</span><span style=
"color: #008080;"
>12</span> <span style=
"color: #008080;"
>13</span> <span style=
"color: #008000;"
>
/*</span><span style="color: #008000;">*</span><span style="color: #008080;">14</span> <span style="color: #008000;"> * 用户授权并获取code </span><span style="color: #008080;">15</span> <span style="color: #008000;"> * @return string 用户code</span><span style="color: #008080;">16</span> <span style="color: #008000;">*/
</span><span style=
"color: #008080;"
>17</span> <span style=
"color: #0000ff;"
>
public
</span> <span style=
"color: #0000ff;"
>
function
</span> getCode(<span style=
"color: #800080;"
>
$route
</span>, <span style=
"color: #800080;"
>
$state
</span><span style=
"color: #000000;"
>){</span><span style=
"color: #008080;"
>18</span> <span style=
"color: #008080;"
>19</span> <span style=
"color: #800080;"
>
$re
</span> = <span style=
"color: #0000ff;"
>
new
</span><span style=
"color: #000000;"
> OauthTool;</span><span style=
"color: #008080;"
>20</span> <span style=
"color: #800080;"
>
$request
</span> = <span style=
"color: #800080;"
>
$re
</span>->authorize_addr(<span style=
"color: #800080;"
>
$route
</span>, <span style=
"color: #800080;"
>
$state
</span><span style=
"color: #000000;"
>);</span><span style=
"color: #008080;"
>21</span> <span style=
"color: #800080;"
>
$code
</span> = <span style=
"color: #0000ff;"
>isset</span>(<span style=
"color: #800080;"
>
$_GET
</span>[
'code'
]) ? <span style=
"color: #800080;"
>
$_GET
</span>[
'code'
] :
''
<span style=
"color: #000000;"
>;</span><span style=
"color: #008080;"
>22</span> <span style=
"color: #008080;"
>23</span> <span style=
"color: #0000ff;"
>
return
</span> [<span style=
"color: #800080;"
>
$request
</span>,<span style=
"color: #800080;"
>
$code
</span><span style=
"color: #000000;"
>];</span><span style=
"color: #008080;"
>24</span> <span style=
"color: #000000;"
> }</span><span style=
"color: #008080;"
>25</span> <span style=
"color: #008080;"
>26</span> <span style=
"color: #008000;"
>
/*</span><span style="color: #008000;">*</span><span style="color: #008080;">27</span> <span style="color: #008000;"> * 获取用户信息并写入数据库(之后加参数传给code)</span><span style="color: #008080;">28</span> <span style="color: #008000;">*/
</span><span style=
"color: #008080;"
>29</span> <span style=
"color: #0000ff;"
>
public
</span> <span style=
"color: #0000ff;"
>
function
</span> info(<span style=
"color: #800080;"
>
$code
</span><span style=
"color: #000000;"
>) {</span><span style=
"color: #008080;"
>30</span> <span style=
"color: #800080;"
>
$re
</span> = <span style=
"color: #0000ff;"
>
new
</span><span style=
"color: #000000;"
> OauthTool;</span><span style=
"color: #008080;"
>31</span> <span style=
"color: #008000;"
>
//</span><span style="color: #008000;">获取access token</span><span style="color: #008080;">32</span> <span style="color: #800080;">$access</span> = <span style="color: #800080;">$re</span>->access_token(<span style="color: #800080;">$code</span><span style="color: #000000;">);</span><span style="color: #008080;">33</span> <span style="color: #800080;">$token</span> = json_decode(<span style="color: #800080;">$access</span>,<span style="color: #0000ff;">true</span><span style="color: #000000;">);</span><span style="color: #008080;">34</span> <span style="color: #008000;">//</span><span style="color: #008000;">header("Content-type: text/html; charset=gbk"); </span><span style="color: #008080;">35</span> <span style="color: #008000;"> //获取用户信息</span><span style="color: #008080;">36</span> <span style="color: #0000ff;">if</span>(<span style="color: #008080;">count</span>(<span style="color: #800080;">$token</span>) != 2<span style="color: #000000;">) {</span><span style="color: #008080;">37</span> <span style="color: #800080;">$response</span> = <span style="color: #800080;">$re</span>->userinfo(<span style="color: #800080;">$token</span>['access_token'], <span style="color: #800080;">$token</span>['openid'<span style="color: #000000;">]);</span><span style="color: #008080;">38</span> <span style="color: #800080;">$user</span> = json_decode(<span style="color: #800080;">$response</span>,<span style="color: #0000ff;">true</span><span style="color: #000000;">);</span><span style="color: #008080;">39</span> <span style="color: #008000;">//</span><span style="color: #008000;">用户昵称转换</span><span style="color: #008080;">40</span> <span style="color: #008000;"> //$user['nickname'] = EmojiTool::emoji_trans($user['nickname']);</span><span style="color: #008080;">41</span> <span style="color: #008080;">42</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$model</span> = User::findOne(['openid' => <span style="color: #800080;">$user</span>['openid'] ])) { <span style="color: #008000;">//</span><span style="color: #008000;">用户已存在更新数据</span><span style="color: #008080;">43</span> <span style="color: #800080;">$model</span>->attributes = <span style="color: #800080;">$user</span><span style="color: #000000;">;</span><span style="color: #008080;">44</span> <span style="color: #800080;">$model</span>->modify_time = <span style="color: #008080;">time</span><span style="color: #000000;">();</span><span style="color: #008080;">45</span> <span style="color: #800080;">$model</span>->save(<span style="color: #0000ff;">false</span><span style="color: #000000;">);</span><span style="color: #008080;">46</span> }<span style="color: #0000ff;">else</span>{ <span style="color: #008000;">//</span><span style="color: #008000;">用户不存在写入</span><span style="color: #008080;">47</span> <span style="color: #800080;">$model</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> User;</span><span style="color: #008080;">48</span> <span style="color: #800080;">$model</span>->attributes = <span style="color: #800080;">$user</span><span style="color: #000000;">;</span><span style="color: #008080;">49</span> <span style="color: #800080;">$model</span>->create_time = <span style="color: #008080;">time</span><span style="color: #000000;">();</span><span style="color: #008080;">50</span> <span style="color: #800080;">$model</span>->save(<span style="color: #0000ff;">false</span><span style="color: #000000;">);</span><span style="color: #008080;">51</span> <span style="color: #000000;"> }</span><span style="color: #008080;">52</span> <span style="color: #000000;"> }</span><span style="color: #008080;">53</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$model</span>->id) ? <span style="color: #800080;">$model</span>->id : ''<span style="color: #000000;">;</span><span style="color: #008080;">54</span> <span style="color: #000000;"> }</span><span style="color: #008080;">55</span> <span style="color: #008080;">56</span> }
登录后复制e. 控制器调用(这里只贴其中一个方法)
1
<span style=
"color: #008080;"
> 1</span> <span style=
"color: #008000;"
>
/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 2</span> <span style="color: #008000;"> * 产品列表</span><span style="color: #008080;"> 3</span> <span style="color: #008000;"> * @return object 所有可用产品信息</span><span style="color: #008080;"> 4</span> <span style="color: #008000;">*/
</span><span style=
"color: #008080;"
> 5</span> <span style=
"color: #0000ff;"
>
public
</span> <span style=
"color: #0000ff;"
>
function
</span><span style=
"color: #000000;"
> actionIndex(){</span><span style=
"color: #008080;"
> 6</span> <span style=
"color: #008000;"
>
//</span><span style="color: #008000;">判断页面是否自动刷新</span><span style="color: #008080;"> 7</span> <span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$_GET</span>['state'<span style="color: #000000;">])) {</span><span style="color: #008080;"> 8</span> <span style="color: #800080;">$refresh</span> = 0<span style="color: #000000;">;</span><span style="color: #008080;"> 9</span> }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">10</span> <span style="color: #800080;">$refresh</span> = 1<span style="color: #000000;">;</span><span style="color: #008080;">11</span> <span style="color: #000000;"> }</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span> <span style="color: #008000;">//</span><span style="color: #008000;">获取用户code</span><span style="color: #008080;">14</span> <span style="color: #800080;">$user</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> UserinfoClass;</span><span style="color: #008080;">15</span> <span style="color: #800080;">$request</span> = <span style="color: #800080;">$user</span>->getCode('r=store/index', 1<span style="color: #000000;">);</span><span style="color: #008080;">16</span> <span style="color: #008080;">17</span> <span style="color: #008000;">//</span><span style="color: #008000;">该用户userid</span><span style="color: #008080;">18</span> <span style="color: #800080;">$userid</span> = <span style="color: #800080;">$user</span>->info(<span style="color: #800080;">$request</span>[1<span style="color: #000000;">]);</span><span style="color: #008080;">19</span> <span style="color: #008080;">20</span> <span style="color: #800080;">$model</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Product;</span><span style="color: #008080;">21</span> <span style="color: #800080;">$list</span> = <span style="color: #800080;">$model</span>->find()->where(['status' => 1])-><span style="color: #000000;">all();</span><span style="color: #008080;">22</span> <span style="color: #008080;">23</span> <span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->render('index',['list' => <span style="color: #800080;">$list</span>, 'refresh' => <span style="color: #800080;">$refresh</span>, 'userid' => <span style="color: #800080;">$userid</span>, 'request' => <span style="color: #800080;">$request</span><span style="color: #000000;">]);</span><span style="color: #008080;">24</span> }
登录后复制程序要求用户打开产品列表即获取用户信息并存入数据库,其中设计了几个变量作用如下:
$refresh:判断页面是否刷新,由于首次打开页面未进行oauth验证时才自动请求验证,避免反复刷新,这里用回调的state参数作为判断依据且设state=1(若有特定参数需要可将state赋值为所需值);
$request:即为验证请求地址
f. 视图自动刷新
只需要在视图中添加以下js代码即可
1
<span style=
"color: #008080;"
> 1</span> <script type=
"text/javascript"
><span style=
"color: #008080;"
> 2 <span style=
"color: #008080;"
> 3 <span style=
"color: #008000;"
>
//<span style="color: #008000;">自动请求获取code<span style="color: #008080;"> 4 $(<span style="color: #0000ff;">function<span style="color: #000000;">(){<span style="color: #008080;"> 5 <span style="color: #0000ff;">var refresh = <?= <span style="color: #800080;">$refresh; ?><span style="color: #000000;">;<span style="color: #008080;"> 6 <span style="color: #0000ff;">var request = '<?= $request[0]; ?>'<span style="color: #000000;">;<span style="color: #008080;"> 7 <span style="color: #0000ff;">if(refresh == 1<span style="color: #000000;">){<span style="color: #008080;"> 8 console.<span style="color: #008080;">log(1<span style="color: #000000;">);<span style="color: #008080;"> 9 location =<span style="color: #000000;"> request;<span style="color: #008080;">10 <span style="color: #000000;"> }<span style="color: #008080;">11 <span style="color: #000000;"> });<span style="color: #008080;">12 </script>
登录后复制特此声明:相关文章均为查阅资料、阅读大神博文后结合实际开发情况遇到的问题整理而成,能找到原博的必会署名,找不到原博而引用的内容还望原博主海涵

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

“你的组织要求你更改PIN消息”将显示在登录屏幕上。当在使用基于组织的帐户设置的电脑上达到PIN过期限制时,就会发生这种情况,在该电脑上,他们可以控制个人设备。但是,如果您使用个人帐户设置了Windows,则理想情况下不应显示错误消息。虽然情况并非总是如此。大多数遇到错误的用户使用个人帐户报告。为什么我的组织要求我在Windows11上更改我的PIN?可能是您的帐户与组织相关联,您的主要方法应该是验证这一点。联系域管理员会有所帮助!此外,配置错误的本地策略设置或不正确的注册表项也可能导致错误。即

Windows11将清新优雅的设计带到了最前沿;现代界面允许您个性化和更改最精细的细节,例如窗口边框。在本指南中,我们将讨论分步说明,以帮助您在Windows操作系统中创建反映您的风格的环境。如何更改窗口边框设置?按+打开“设置”应用。WindowsI转到个性化,然后单击颜色设置。颜色更改窗口边框设置窗口11“宽度=”643“高度=”500“>找到在标题栏和窗口边框上显示强调色选项,然后切换它旁边的开关。若要在“开始”菜单和任务栏上显示主题色,请打开“在开始”菜单和任务栏上显示主题

默认情况下,Windows11上的标题栏颜色取决于您选择的深色/浅色主题。但是,您可以将其更改为所需的任何颜色。在本指南中,我们将讨论三种方法的分步说明,以更改它并个性化您的桌面体验,使其具有视觉吸引力。是否可以更改活动和非活动窗口的标题栏颜色?是的,您可以使用“设置”应用更改活动窗口的标题栏颜色,也可以使用注册表编辑器更改非活动窗口的标题栏颜色。若要了解这些步骤,请转到下一部分。如何在Windows11中更改标题栏的颜色?1.使用“设置”应用按+打开设置窗口。WindowsI前往“个性化”,然

任务栏缩略图可能很有趣,但它们也可能分散注意力或烦人。考虑到您将鼠标悬停在该区域的频率,您可能无意中关闭了重要窗口几次。另一个缺点是它使用更多的系统资源,因此,如果您一直在寻找一种提高资源效率的方法,我们将向您展示如何禁用它。不过,如果您的硬件规格可以处理它并且您喜欢预览版,则可以启用它。如何在Windows11中启用任务栏缩略图预览?1.使用“设置”应用点击键并单击设置。Windows单击系统,然后选择关于。点击高级系统设置。导航到“高级”选项卡,然后选择“性能”下的“设置”。在“视觉效果”选

您是否在Windows安装程序页面上看到“出现问题”以及“OOBELANGUAGE”语句?Windows的安装有时会因此类错误而停止。OOBE表示开箱即用的体验。正如错误提示所表示的那样,这是与OOBE语言选择相关的问题。没有什么可担心的,你可以通过OOBE屏幕本身的漂亮注册表编辑来解决这个问题。快速修复–1.单击OOBE应用底部的“重试”按钮。这将继续进行该过程,而不会再打嗝。2.使用电源按钮强制关闭系统。系统重新启动后,OOBE应继续。3.断开系统与互联网的连接。在脱机模式下完成OOBE的所

在Windows11上的显示缩放方面,我们都有不同的偏好。有些人喜欢大图标,有些人喜欢小图标。但是,我们都同意拥有正确的缩放比例很重要。字体缩放不良或图像过度缩放可能是工作时真正的生产力杀手,因此您需要知道如何对其进行自定义以充分利用系统功能。自定义缩放的优点:对于难以阅读屏幕上的文本的人来说,这是一个有用的功能。它可以帮助您一次在屏幕上查看更多内容。您可以创建仅适用于某些监视器和应用程序的自定义扩展配置文件。可以帮助提高低端硬件的性能。它使您可以更好地控制屏幕上的内容。如何在Windows11

屏幕亮度是使用现代计算设备不可或缺的一部分,尤其是当您长时间注视屏幕时。它可以帮助您减轻眼睛疲劳,提高易读性,并轻松有效地查看内容。但是,根据您的设置,有时很难管理亮度,尤其是在具有新UI更改的Windows11上。如果您在调整亮度时遇到问题,以下是在Windows11上管理亮度的所有方法。如何在Windows11上更改亮度[10种方式解释]单显示器用户可以使用以下方法在Windows11上调整亮度。这包括使用单个显示器的台式机系统以及笔记本电脑。让我们开始吧。方法1:使用操作中心操作中心是访问

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安
