3

微信公众号获取OpenId(未授权)(需要关注公众号)

 3 years ago
source link: http://abcdxyzk.github.io/blog/2021/04/18/lang-web-wx3/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

微信公众号获取OpenId(未授权)(需要关注公众号)

2021-04-18 16:32:00

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

https://blog.csdn.net/HanKin_/article/details/79010789

openId是微信对于用户的唯一辨识,只要有用户关注你的公众号,微信会通过公众号和用户微信号通过一种算法生成一种唯一标识码

1.在公众号后台设置回调的域名(大多情况下是你的项目)

开发-接口权限-网页账号-用户授权获取用户基础信息中修改

2.在页面上访问下面的网址

https://open.weixin.qq.com/connect/oauth2/authorize?appid=*******&redirect_uri=你回调的地址&response_type=code&scope=snsapi_base&state=1#wechat_redirect

上面的会返回到你回调的地址?code=xxxxxxxxx

也就是说它会返回到你回调的地址并且带上code参数,一般情况下,回调的地址设置为后端的action即可,然后就可以获取到code了,当你获取到code,已经成功了一大半。

3.然后在后端访问下面的网址

https://api.weixin.qq.com/sns/oauth2/access_token?appid=***&secret=***&code=***&grant_type=authorization_code

code的参数用刚刚返回的code值。

4.上面网页将会返回json,其中openId就在其中。

至此,openId就获取到了,但是要注意:此处只获取到了openId,也就是不需要用户授权的,要获取用户其它的信息请参考接口文档。还有就是每次获取openId请重新获取code,code值不要重复使用,防止出错。

在微信页面上我是把获取到的openId保存在cookie中的,这样就可以防止openId的重复获取,我只在用户第一次进入或者cookie中的openId失效的时候进行再次获取的。


<?php
class Wxmsg extends CI_Controller {
	function __construct()
	{
		parent::__construct();
		$this->load->model('Follow_model');
		$this->load->helper('url');
		$this->load->helper('xml');
	}

	function index($check = 1)
	{
		$echostr = $this->input->get('echostr');
		if (!empty($echostr)) {
			echo $echostr;
			return;
		}

		$token = "hello";

		# step 1: get args
		$slug = array('signature', 'timestamp', 'nonce', 'openid');
		foreach ($slug as $key) {
			$args[$key] = $this->input->get($key);
			if ($check && empty($args[$key]))
				die($key.' 不能为空');
		}

		# step 2: signature check
		$lists = array($args['timestamp'], $args['nonce'], $token);
		sort($lists, SORT_STRING);
		$hashcode = sha1(implode('', $lists));
		if ($check && $hashcode != $args['signature'])
			die('signature 校验错误');

		# step 3: webdata decode
		$webdata = $this->input->raw_input_stream;
		$xml = simplexml_load_string($webdata);
		foreach ($xml->children() as $child) {
			$arr[$child->getName()] = trim((string)$child);
		}

		if (empty($arr['FromUserName']) || empty($arr['ToUserName']))
			die('FromUserName、ToUserName 不能为空');

		if (empty($arr['MsgType']))
			die('MsgType 不能为空');

		if ($arr['MsgType'] == 'text') {
			if (empty($arr['CreateTime']) || empty($arr['Content']) || empty($arr['MsgId']))
				die('CreateTime、Content、MsgId 不能为空');

			# step 4.1 text msg
			$Content = self::msg_text($arr);

		} elseif ($arr['MsgType'] == 'event') {
			if (empty($arr['Event']))
				die('Event 不能为空');

			# step 4.2 event msg
			$Content = self::msg_event($arr);

		} else {
			die('不处理事件:'.$arr['MsgType']);
		}

		self::reply_msg($arr, $Content);
	}

	function reply_msg($arr, $Content)
	{
		$FromUserName = $arr['FromUserName'];
		$ToUserName = $arr['ToUserName'];
		$CreateTime = time();
		$reply =
<<<XML
	<xml>
		<ToUserName><![CDATA[$FromUserName]]></ToUserName>
		<FromUserName><![CDATA[$ToUserName]]></FromUserName>
		<CreateTime>$CreateTime</CreateTime>
		<MsgType><![CDATA[text]]></MsgType>
		<Content><![CDATA[$Content]]></Content>
	</xml>
XML;
		$reply_xml = new SimpleXMLElement($reply);
		echo $reply_xml->asXML();
	}

	function msg_text($arr)
	{
		$FromUserName = $arr['FromUserName'];
		$key = $arr['Content'];

		$Content = '萌萌嗒';
		return $Content;
	}

	function msg_event($arr)
	{
		$event = $arr['Event'];
		if ($event == 'subscribe') {
			$this->Follow_model->change($arr['FromUserName'], $arr['ToUserName'], 1);
			return "功能添加中\n敬请等待\n";
			#return '输入姓名或电话查询单号,输入单号查询物流信息';
		} elseif ($event == 'unsubscribe') {
			$this->Follow_model->change($arr['FromUserName'], $arr['ToUserName'], 0);
		}
		return '';
	}

	function test()
	{
		$openid = $this->input->ip_address();

		$openid = $this->input->cookie("openid");
		if (empty($openid)) {
			$appid = appId;
			$redirect_uri = "http://".HOST.ROOT."/wxmsg/openid";
			$URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
			redirect($URL);
		}

		echo "test";
	}

	function openid()
	{
		$code = $this->input->get('code');
		if (empty($code)) {
			die('无法获取code');
		}
		//echo $code;
		#$fp = fopen('/tmp/a.txt', 'w');
		#fwrite($fp, $code);

		$appid = appId;
		$secret = appSecret;
		$URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code";

		$furl = fopen($URL, 'r') or exit('Open url faild!');
		$res = fgets($furl);
		fclose($furl);

		$res = json_decode($res, True);

//        var_dump($res);
//        echo $res['openid'];

		if (empty($res['openid'])) {
			die('无法获取openid');
		}
		$this->input->set_cookie('openid', $res['openid'], 86400 * 7);

		$URL = ROOT."/wxmsg/test";
		redirect($URL);
	}
}

Posted by kk

2021-04-18 16:32:00language, web

« 微信公众平台获取网页授权(测试号)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK