微信获取 openid 静默及非静默
<?php /*
需要的微信公众号配置信息
APPID : 绑定支付的APPID
APPSECRET : 公众帐号secert
*/
class Index {
// 配置账号信息
private $wxPayConfig = array ();
protected function _initialize() {
// 如果有继承的父类,则需先访问父类构造方法
// parent::_initialize (); // APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
$this->wxPayConfig ['APPID'] = 'wx426b3015555a46be';
// APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置)
$this->wxPayConfig ['APPSECRET'] = '7813490da6f1265e4901ffb80afaa36f'; /**
* 这里设置代理机器,只有需要代理的时候才设置,不需要代理,则设置为0.0.0.0和0
* 本例程通过curl使用HTTP POST方法,此处可修改代理服务器,
* 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代理(如有需要才设置)
*/
$this->wxPayConfig ['CURL_PROXY_HOST'] = "0.0.0.0"; // "10.152.18.220";
$this->wxPayConfig ['CURL_PROXY_PORT'] = 0;
} // 通过code获得openid
public function getOpenid() { //snsapi_base (未关注,不弹出授权页面,直接跳转,只能获取用户openid)
//snsapi_userinfo (弹出授权页面,即使在未关注的情况下,只要用户授权,也能获取其信息,可通过openid拿到昵称、性别、所在地等)
$scope = "snsapi_base";//这里使用静默授权 // 判断如果没有传 code 则先获取 code
if (! isset ( $_GET ['code'] )) {
// 获取当前打开页面的完整访问路径
$baseUrl = 'http://' . $_SERVER ['HTTP_HOST'] . $_SERVER ['REQUEST_URI'] . $_SERVER ['QUERY_STRING'];
$baseUrl = urlencode ( $baseUrl );
//配置获取code 路径的相关参数
$paramsArr = array();
$paramsArr ["appid"] = $this->wxPayConfig ['APPID'];
$paramsArr ["redirect_uri"] = "$baseUrl";
$paramsArr ["response_type"] = "code"; //scope 应用授权作用域
$paramsArr ["scope"] = $scope; //state 非必须参数,重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
//结尾 #wechat_redirect 必须有,且该字符串前面不能带 & 所以连接到最后一个参数值后面,无论直接打开还是做页面302重定向时候,必须带此参数
$paramsArr ["state"] = "STATE" . "#wechat_redirect";
//将数组变成参数url
$paramsUrl = $this->arrToParams ( $paramsArr );
//构造获取code的访问路径,访问后,微信服务器会再跳回$baseUrl指定的页面(这里当前页),并返回 code 码
$codeUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?" . $paramsUrl;
Header ( "Location: $codeUrl" );
exit ();
} else {
// 获取code码,以获取openid
$code = $_GET ['code'];
//配置获取 openid 路径的相关参数
$paramsArr = array();
$paramsArr ["appid"] = $this->wxPayConfig ['APPID'];
$paramsArr ["secret"] = $this->wxPayConfig ['APPSECRET'];
$paramsArr ["code"] = $code;
$paramsArr ["grant_type"] = "authorization_code";
$paramsUrl = $this->arrToParams ( $paramsArr );
$openidUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?" . $paramsUrl; $data = $this->httpCurl ( $openidUrl );
$openid = $data ['openid'];
if($scope == 'snsapi_userinfo'){
//如果是显示授权,即需要用户点击授权,则还会返回 access_token 通过 access_token 及 openid 通过 echo file_get_contents("https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}&lang=zh_CN");即可获取打印用户信息,或者用这里的curl方法httpCurl(https://api.weixin.qq.com/sns/userinfo?access_token=...)获取亦可
$access_token = $data['access_token'];
}
return $openid;
}
} /**
*
* 通过code从工作平台获取openid机器access_token
*
* @param string $code
* 微信跳转回来带上的code
*
* @return openid
*/
public function httpCurl($url) {
// 初始化curl
$ch = curl_init ();
// 设置30秒超时
curl_setopt ( $ch, CURLOPT_TIMEOUT, 30 );
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt ( $ch, CURLOPT_HEADER, FALSE );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, TRUE );
if ($this->wxPayConfig ['CURL_PROXY_HOST'] != "0.0.0.0" && $this->wxPayConfig ['CURL_PROXY_PORT'] != 0) {
curl_setopt ( $ch, CURLOPT_PROXY, $this->wxPayConfig ['CURL_PROXY_HOST'] );
curl_setopt ( $ch, CURLOPT_PROXYPORT, $this->wxPayConfig ['CURL_PROXY_PORT'] );
}
// 运行curl,结果以jason形式返回
$res = curl_exec ( $ch );
curl_close ( $ch );
// 取出openid
$data = json_decode ( $res, true );
return data;
} /**
*
* 拼接签名字符串
*
* @param array $paramsArr
*
* @return 返回已经拼接好的字符串
*/
private function arrToParams($paramsArr) {
$buff = "";
foreach ( $paramsArr as $k => $v ) {
if ($k != "sign") {
$buff .= $k . "=" . $v . "&";
}
} $buff = trim ( $buff, "&" );
return $buff;
}
}
微信获取 openid 静默及非静默的更多相关文章
- 微信h5静默和非静默授权获取用户openId和用户信息的方法和步骤:
原文链接:https://blog.csdn.net/qq_35430000/article/details/79299529 一.openId是什么?openId是用户在当前公众号下的唯一标识('身 ...
- 微信-获取openid
第一步 首先把微信的支付流程与相关的文档熟悉一遍,具体的支付逻辑是怎么实现的,心里要有一定的路数,开发的时候一边看文档,一边写,再一边调试这是最好的选择,首先阅读微信开发文档,因为我们这次是做公众号支 ...
- 简单的实现微信获取openid
微信公众平台获取openid在公众号的开发中有很多用途,前段时间为实现用户使用公众号在登录一次以后可以免密登陆而使用了openid.开发过程中遇到了一些问题,在这里向需要且还没有获取到openid的米 ...
- 微信获取openId
router.beforeEach(function(to, from, next){ //中间页等待跳转 if(to.meta.requireCheck=="WaitLogin" ...
- 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)
一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...
- 微信H5中静默登录及非静默登录的正确使用姿势
在微信中打开网页且需要调用微信登录接口时,微信官方给我们提供了两种登录调用方式:静默登录和非静默登录:但是官方文档中却没有说明在何种情况下使用静默登录,何种情况下使用非静默登录,所以在这里,我想将之前 ...
- 微信公众号授权回调用户信息,获取openid
1.--------------------用户授权登录并获取code 授权登录方式有两个,一种为静默授权登录(scope=snsapi_base),一种为非静默授权登录(scope=snsapi_u ...
- Android项目实战(三十一):异步下载apk文件并安装(非静默安装)
前言: 实现异步下载apk文件 并 安装.(进度条对话框显示下载进度的展现方式) 涉及技术点: 1.ProgressDialog 进度条对话框 用于显示下载进度 2.AsyncTask ...
- node 微信授权 获取openid
node获取微信授权拿到openid 需要了解的网站 1.微信授权. 先说一下流程(一张图代替所有): 流程步骤: 1.用户同意,获取code. 2.通过code获取网页授权access_toke ...
随机推荐
- 003.2---asyncio模块(上)
asyncio(上) asyncio 的几个概念 event_loop(事件循环):程序开启一个无线的循环,程序员会把一些函数(协程)注册到事件循环上,当满足事件发生的时候,调用相应的协程函数. co ...
- MySQL数据库删除数据(有外键约束)
在MySQL中删除一张表或一条数据的时候,出现有外键约束的问题,于是就去查了下方法: SELECT @@FOREIGN_KEY_CHECKS; 查询当前外键约束是否打开 ; 设置为1的时候外键约束是打 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- 20155226 2016-2017-2 《Java程序设计》第2周学习总结
20155226 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 了解了基本类型以及初识类类型,熟悉了注释,变量及运算符的使用. 了解了几种运算方式但还不算熟 ...
- WPF ControllTemplate Triggers小记 - 简书
原文:WPF ControllTemplate Triggers小记 - 简书 WPF中,样式模板中如果定义EventTrigger事件方式实现动画.那么需要注意两点: 1.对于绑定的属性的Event ...
- Codeception (安装)
来源:http://codeception.com/install 注意:打开Codeception的官网需要FQ 1. 下载 下载地址:http://codeception.com/thanks 或 ...
- HBase第一章 安装 HMaster 主备
1.集群环境 Hadoop HA 集群规划 hadoop1 cluster1 nameNode HMaster hadoop2 cluster1 nameNodeStandby ZooKeeper ...
- 我们一起学习WCF 第一篇初识WCF(附源码供对照学习)
前言:去年由于工作需要我学习了wcf的相关知识,初期对wcf的作用以及为何用怎么样都是一知半解,也许现在也不是非常的清晰.但是通过项目对wcf的运用在脑海里面也算有了初步的模型.今天我就把我从开始wc ...
- activeX 打包
原文 http://www.docin.com/p-409284488.html CAB打包文档说明 文档目的 本文档的目的在于说明将ocx和dll以及相关的文件打包成一个CAB包,以便在网页下调用o ...
- Linux建立互信关系(ssh公钥登录)
Linux有多种登录方式,比如telnet.ssh.支持ssh登录方式:口令登录和公钥登录 ssh登录方式:ssh [-l login_name] [-p port] [user@]hostname ...