白羽
2018-06-12
来源 :网络
阅读 1632
评论 0
摘要:本文将带你了解进阶学习微信开发之微信网页授权的5个步骤,希望本文对大家学微信有所帮助。
所有微信开发的相关内容,都需要参考官方文档。
[微信公众平台|开发文档] //mp.weixin.qq.com/wiki/home/。
一、通过网页授权,可以获取用户微信的基本信息。
二、总共有5个步骤:
1 :用户同意授权,获取code
2 :通过code换取网页授权access_token
3 :刷新access_token(如果需要)
4 :拉取用户信息(需scope为 snsapi_userinfo)
5 附:检验授权凭证(access_token)是否有效
·
三、每一个步骤的实现。
1 :用户同意授权,获取code
[php] view plain copy
1. /**
2. * @explain
3. * 获取code,用于获取openid和access_token
4. * @remark
5. * code只能使用一次,当获取到之后code失效,再次获取需要重新进入
6. * 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid
7. **/
8. public function getCode()
9. {
10. if (isset($_GET["code"])) {
11. return $_GET["code"];
12. } else {
13. $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
14. header($str);
15. exit;
16. }
17. }
2 :通过code换取网页授权access_token
[php] view plain copy
1. /**
2. * @explain
3. * 用于获取access_token,返回的<span style="font-family: Arial, Helvetica, sans-serif;">$access_token_array中也包含有用户的openid信息。</span>
4.
5. **/
6. public function getOpenId()
7. {
8. $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";
9. $access_token_json = $this->https_request($access_token_url);
10. $access_token_array = json_decode($access_token_json, TRUE);
11. return $access_token_array;
12. }
3 :刷新access_token(如果需要)
这一步直接略过。
4 :拉取用户信息(需scope为 snsapi_userinfo)
[php] view plain copy
1. /**
2. * @explain
3. * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token
4. **/
5. public function getUserInfo()
6. {
7.
8. $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";
9. $userinfo_json = $this->https_request($userinfo_url);
10. $userinfo_array = json_decode($userinfo_json, TRUE);
11. return $userinfo_array;
12. }
至此四个步骤全部完成。
四、完整代码。实际项目使用TP3.2.3。
[php] view plain copy
1. <?php
2.
3. namespace Wechat\Controller;
4.
5. use Think\Controller;
6.
7. //微信接口基础类,其他微信类都继承这个基础类。可以自动判断用户状态,获取用户信息。
8. class WxbaseController extends Controller
9. {
10.
11. public $appid = 'wxba09d9f0fed4b84b'; //微信APPID,公众平台获取
12. public $appsecret = '332c2b1fc1eb282c0136b73723db4237'; //微信APPSECREC,公众平台获取
13. public $index_url = "//www.你的域名.cn/项目目录/index.php?m=分组&c=控制器&a=方法"; //微信回调地址,要跟公众平台的配置域名相同
14. public $code;
15. public $openid;
16.
17. /**
18. *检测有无$_SESSION。<span style="font-family: Arial, Helvetica, sans-serif;">如果有,直接忽略。</span>
19. *如果没有$<span style="font-family:Arial, Helvetica, sans-serif;">_SESSION</span>,就依次执行getCode、getOpenId、getUserInfo来获取用户信息。目的是解决CODE只能获取一次,刷新页面openid会丢失的问题。
20. *再判断是否在数据库中,没有则写入数据库。最后将open_id写入session。
[php] view plain copy
1. <span style="white-space:pre"> </span>*/
2. public function _initialize()
3. {
4. if (!$_SESSION['openid']) { //如果$_SESSION中没有openid,说明用户刚刚登陆,就执行getCode、getOpenId、getUserInfo获取他的信息
5. $this->code = $this->getCode();
6. $this->access_token = $this->getOpenId();
7. $userInfo = $this->getUserInfo();
8. if ($userInfo) {
9. $ins = M('Wechat_user_info');<span style="white-space:pre"> </span> //其他框架请自行调整方法。
10. $map['openid'] = $userInfo['openid'];
11. $result = $ins->where($map)->find(); //根据OPENID查找数据库中是否有这个用户,如果没有就写数据库。继承该类的其他类,用户都写入了数据库中。
12. if (!$result) {
13. $ins->add($userInfo);
14. }
15. session('openid', $userInfo['openid']); //写到$_SESSION中。微信缓存很坑爹,调试时请及时清除缓存再试。
16. }
17. }
18.
19. }
20.
21. /**
22. * @explain
23. * 获取code,用于获取openid和access_token
24. * @remark
25. * code只能使用一次,当获取到之后code失效,再次获取需要重新进入
26. * 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid
27. **/
28. public function getCode()
29. {
30. if (isset($_GET["code"])) {
31. return $_GET["code"];
32. } else {
33. $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
34. header($str);
35. exit;
36. }
37. }
38.
39. /**
40. * @explain
41. * 用于获取用户openid
42. **/
43. public function getOpenId()
44. {
45. $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";
46. $access_token_json = $this->https_request($access_token_url);
47. $access_token_array = json_decode($access_token_json, TRUE);
48. return $access_token_array;
49. }
50.
51. /**
52. * @explain
53. * 通过code获取用户openid以及用户的微信号信息
54. * @return
55. * @remark
56. * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token
57. * access_token每日获取次数是有限制的,access_token有时间限制,可以存储到数据库7200s. 7200s后access_token失效
58. **/
59. public function getUserInfo()
60. {
61.
62. $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";
63. $userinfo_json = $this->https_request($userinfo_url);
64. $userinfo_array = json_decode($userinfo_json, TRUE);
65. return $userinfo_array;
66. }
67.
68.
69. /**
70. * @explain
71. * 发送http请求,并返回数据
72. **/
73. public function https_request($url, $data = null)
74. {
75. $curl = curl_init();
76. curl_setopt($curl, CURLOPT_URL, $url);
77. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
78. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
79. if (!empty($data)) {
80. curl_setopt($curl, CURLOPT_POST, 1);
81. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
82. }
83. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
84. $output = curl_exec($curl);
85. curl_close($curl);
86. return $output;
87. }
88. }
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之微信频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号