微信获取 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 ...
随机推荐
- mysql5.6升级为mysql5.7部署jboss/wildfly应用项目
一.部署mysql5.7二进制版 解压tar -xvf mv mysql-5.7 /usr/local/mysql5.7 或者其他文件夹 cd /usr/local/mysql.57 usera ...
- dtree加载慢的问题
前几天测试的时候,感觉dtree还行,也不是很慢.今天把树分支扩大以后就懵逼了,慢的一匹. 仔细看了下,才发现原来画分支的时候每次都会请求那些图,反复请求下加载时候无形拉长了很多.没有办法,就只能在h ...
- IDEA的基本配置
一.安装 常规下载安装,换路径即可. 亲测可用破解方法:进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.P ...
- spark读取mongodb数据写入hive表中
一 环境: spark-: hive-; scala-; hadoop--cdh-; jdk-1.8; mongodb-2.4.10; 二.数据情况: MongoDB数据格式{ "_i ...
- DSP28335做FFT傅里叶变换
1. 看了一下例程,居然没有FFT的例程,难道这个DSP28335不能做FFT吗?对了C2000系列是有C2000 ware这个库的.方便很多,不过目前不确定在C5000上运行的FFT能直接迁移到DS ...
- selenium自动化之处理浏览器警告弹窗
有的网站会弹出类似如下图的警告弹窗,你会发现这种弹窗在html源码中怎么也定位不到,接下来将介绍这种弹窗的处理方式. 其实这种弹窗是不属于html的元素的,他是属于浏览器自带的弹窗,所以用定位元素的方 ...
- sql server 批量备份数据库
很多时候,我们都需要将数据库进行备份,当服务器上数据库较多时,不可能一个数据库创建一个定时任务进行备份,这时,就需要进行批量的数据库备份操作,好了,废话不多说,具体实现语句如下: --开启文件夹权限 ...
- DataRow的RowState属性变化
DataRow的RowState属性(状态)取值有5种:Detached, Unchanged, Added, Deleted, Modified. 当我们用DataRow newRow = Data ...
- nodejs express 加载html模板
在nodejs中如使用express框架,她默认的是ejs和jade渲染模板.由于我在使用的时候觉得她的代码书写方式很不爽还是想用html的形式去书写,于是我找了使用了html模板. 直接上代码,主要 ...
- cinder的组件
跟nova相似,cinder也有很多组件,每个组件负责各自的业务,然后共同协作完成volume的管理.组件之间的通信方式与nova个组件之间的通信方式相同,都是通过消息队列进行通信. cinder-a ...