<?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 静默及非静默的更多相关文章

  1. 微信h5静默和非静默授权获取用户openId和用户信息的方法和步骤:

    原文链接:https://blog.csdn.net/qq_35430000/article/details/79299529 一.openId是什么?openId是用户在当前公众号下的唯一标识('身 ...

  2. 微信-获取openid

    第一步 首先把微信的支付流程与相关的文档熟悉一遍,具体的支付逻辑是怎么实现的,心里要有一定的路数,开发的时候一边看文档,一边写,再一边调试这是最好的选择,首先阅读微信开发文档,因为我们这次是做公众号支 ...

  3. 简单的实现微信获取openid

    微信公众平台获取openid在公众号的开发中有很多用途,前段时间为实现用户使用公众号在登录一次以后可以免密登陆而使用了openid.开发过程中遇到了一些问题,在这里向需要且还没有获取到openid的米 ...

  4. 微信获取openId

    router.beforeEach(function(to, from, next){ //中间页等待跳转 if(to.meta.requireCheck=="WaitLogin" ...

  5. 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)

    一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...

  6. 微信H5中静默登录及非静默登录的正确使用姿势

    在微信中打开网页且需要调用微信登录接口时,微信官方给我们提供了两种登录调用方式:静默登录和非静默登录:但是官方文档中却没有说明在何种情况下使用静默登录,何种情况下使用非静默登录,所以在这里,我想将之前 ...

  7. 微信公众号授权回调用户信息,获取openid

    1.--------------------用户授权登录并获取code 授权登录方式有两个,一种为静默授权登录(scope=snsapi_base),一种为非静默授权登录(scope=snsapi_u ...

  8. Android项目实战(三十一):异步下载apk文件并安装(非静默安装)

    前言: 实现异步下载apk文件 并 安装.(进度条对话框显示下载进度的展现方式) 涉及技术点: 1.ProgressDialog   进度条对话框  用于显示下载进度 2.AsyncTask     ...

  9. node 微信授权 获取openid

    node获取微信授权拿到openid 需要了解的网站   1.微信授权. 先说一下流程(一张图代替所有): 流程步骤: 1.用户同意,获取code. 2.通过code获取网页授权access_toke ...

随机推荐

  1. R语言学习笔记(二十四):plyr包的用法

    plyr 这个包,提供了一组规范的数据结构转换形式. Input/Output list data frame array list llply() ldply() laply() data fram ...

  2. 20155209 实验三 敏捷开发与XP实践

    20155209 实验三 敏捷开发与XP实践 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 提交点一: 在IDEA中使用工具(Code->Reformate Code)把下面代码 ...

  3. 20155320 2016-2017-2《Java程序设计》第十周学习总结

    20155320 2016-2017-2<Java程序设计>第十周学习总结 教材学习内容总结 本周学习目标 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Jav ...

  4. DIV+CSS实现竖排按钮样式

    <div class="btn_left btn_left1">每日单元成功率</div><br/> <div class="b ...

  5. Drupal views 中合并显示字段

    如图, 需要显示如下数据表格 表格的第三列是由两个字段组成的.分别是title 标题字段和body 内容字段. 默认情况下,一列只显示一个字段.如何同时显示两个呢? 这个问题难不到强大的views,要 ...

  6. python 内置模块(hash lib)

    用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 MD5 import hashlib hash=h ...

  7. The filename 未命名.ipa in the package contains an invalid character(s). The valid characters are: A-Z, a-z, 0-9, dash, period, underscore, but the name cannot start with a dash, period, or underscore

    The filename 未命名.ipa in the package contains an invalid character(s).  The valid characters are: A-Z ...

  8. TeamViewer卡在正在初始化显示参数

    在windows的mstsc远程桌面中打开teamviewer,远程桌面开着的时候可以连接teamviewer,但是当我断开mstsc之后,再用teamviewer连就连接不上了,一直都是正在初始化显 ...

  9. 面试之HTTP基础(不断完善中)

    目录 1. HTTP状态码 2.Cookie和Session Cookie Session 3.短连接与长连接 4.HTTPs 加密 5.Http和https的区别 6.HTTP/1.0 与 HTTP ...

  10. Java泛型理解

    Java泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型.当需要使用某一种算法时,又无法具体算法的数据类型,或者想指定类型值的上限或下限,那么这时就需要Java泛型来大显身手 ...