根据code获取openidcode后,请求以下链接,即可返回openid等数据 是怎么请求的的header

友情提示:垃圾评论一律封号...
琵琶果酒醉人心
PHP获得微信用户的OpenID,然后再通过OpenID和access_token查询用户信息
所需积分:0
亲,积分不够,多去发布资源、评论、签到、
或联系QQ人工充值
亲,vip会员下载原创作品 积分5 折。
PS:尊重原创作者劳动成果,感谢分享!
充值方式: 或联系QQ人工充值
用户名/邮箱
两周内免登录
绑定送30积分如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
关于OAuth2.0的说明:
官方网站:http://oauth.net/ &&http://oauth.net/2/
权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.&
OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密的资源(如用户个人信息、照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth 2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。
OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。
新浪微博API目前也使用OAuth 2.0。
微信公众平台OAuth2.0授权
大体流程如下图:
1. 用户首先请求第三方网页
2. 第三方服务器获取用户请求后会进行判断,是否需要获取code(正常请求肯定是需要code的,这里我们可以参考一下官方JsApiPay的mode,来看获取openid的大体流程)
2 require_once "../lib/WxPay.Api.php";
* JSAPI支付实现类
* 该类实现了从微信公众平台获取code、通过code获取openid和access_token、
* 生成jsapi支付js接口所需的参数、生成获取共享收货地址所需的参数
* 该类是微信支付提供的样例程序,商户可根据自己的需求修改,或者使用lib中的api自行开发
* @author widy
14 class JsApiPay
* 网页授权接口微信服务器返回的数据,返回样例如下
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
* 其中access_token可用于获取共享收货地址
* openid是微信支付jsapi支付接口必须的参数
* @var array
public $data = null;
* 通过跳转获取用户的openid,跳转流程如下:
* 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open./connect/oauth2/authorize
* 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
* @return 用户的openid
public function GetOpenid()
//通过code获得openid
if (!isset($_GET['code'])){
//触发微信返回code码
$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
$url = $this-&__CreateOauthUrlForCode($baseUrl);
Header("Location: $url");
//获取code码,以获取openid
$code = $_GET['code'];
$openid = $this-&getOpenidFromMp($code);
return $openid;
* 获取jsapi支付的参数
* @param array $UnifiedOrderResult 统一支付接口返回的数据
* @throws WxPayException
* @return json数据,可直接填入js函数作为参数
public function GetJsApiParameters($UnifiedOrderResult)
if(!array_key_exists("appid", $UnifiedOrderResult)
|| !array_key_exists("prepay_id", $UnifiedOrderResult)
|| $UnifiedOrderResult['prepay_id'] == "")
throw new WxPayException("参数错误");
$jsapi = new WxPayJsApiPay();
$jsapi-&SetAppid($UnifiedOrderResult["appid"]);
$timeStamp = time();
$jsapi-&SetTimeStamp("$timeStamp");
$jsapi-&SetNonceStr(WxPayApi::getNonceStr());
$jsapi-&SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']);
$jsapi-&SetSignType("MD5");
$jsapi-&SetPaySign($jsapi-&MakeSign());
$parameters = json_encode($jsapi-&GetValues());
return $parameters;
* 通过code从工作平台获取openid机器access_token
* @param string $code 微信跳转回来带上的code
* @return openid
public function GetOpenidFromMp($code)
$url = $this-&__CreateOauthUrlForOpenid($code);
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $this-&curl_timeout);
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(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0"
&& WxPayConfig::CURL_PROXY_PORT != 0){
curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST);
curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT);
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
$this-&data = $data;
$openid = $data['openid'];
return $openid;
* 拼接签名字符串
* @param array $urlObj
* @return 返回已经拼接好的字符串
private function ToUrlParams($urlObj)
$buff = "";
foreach ($urlObj as $k =& $v)
if($k != "sign"){
$buff .= $k . "=" . $v . "&";
$buff = trim($buff, "&");
return $buff;
* 获取地址js参数
* @return 获取共享收货地址js函数需要的参数,json格式可以直接做参数使用
public function GetEditAddressParameters()
$getData = $this-&
$data = array();
$data["appid"] = WxPayConfig::APPID;
$data["url"] = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$time = time();
$data["timestamp"] = "$time";
$data["noncestr"] = "1234568";
$data["accesstoken"] = $getData["access_token"];
ksort($data);
$params = $this-&ToUrlParams($data);
$addrSign = sha1($params);
$afterData = array(
"addrSign" =& $addrSign,
"signType" =& "sha1",
"scope" =& "jsapi_address",
"appId" =& WxPayConfig::APPID,
"timeStamp" =& $data["timestamp"],
"nonceStr" =& $data["noncestr"]
$parameters = json_encode($afterData);
return $parameters;
* 构造获取code的url连接
* @param string $redirectUrl 微信服务器回跳的url,需要url编码
* @return 返回构造好的url
private function __CreateOauthUrlForCode($redirectUrl)
$urlObj["appid"] = WxPayConfig::APPID;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this-&ToUrlParams($urlObj);
return "https://open./connect/oauth2/authorize?".$bizString;
* 构造获取open和access_toke的url地址
* @param string $code,微信跳转带回的code
* @return 请求的url
private function __CreateOauthUrlForOpenid($code)
$urlObj["appid"] = WxPayConfig::APPID;
$urlObj["secret"] = WxPayConfig::APPSECRET;
$urlObj["code"] = $code;
$urlObj["grant_type"] = "authorization_code";
$bizString = $this-&ToUrlParams($urlObj);
return "https://api./sns/oauth2/access_token?".$bizString;
点击展开代码
3. 如果需要获取code,第三方服务器会跳转到授权页面
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面
请求方法如下:
&https://open./connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示&该链接无法访问&,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。 &
参数说明:
参数 必须说明
公众号的唯一标识
redirect_uri
授权后重定向的回调链接地址
response_type
返回类型,请填写code
应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
重定向后会带上state参数,开发者可以填写任意参数值
#wechat_redirect
直接在微信打开链接,可以不填此参数。做页面302重定向时候,必须带此参数
下图为scope等于snsapi_userinfo时的授权页面:
4. 用户同意授权将信息发送到微信公众平台,微信公众平台会内部进行授权验证
用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
5. 验证通过返回给第三方服务器code
6. 通过code换取网页授权access_token
首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
请求方法如下:
&access_token: https://api./sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code &
参数说明:
参数 是否必须说明
公众号的唯一标识
公众号的appsecret
填写第一步获取的code参数
grant_type
填写为authorization_code
返回说明:
正确时返回的JSON数据包如下:
参数说明:
access_token
网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in
access_token接口调用凭证超时时间,单位(秒)
refresh_token
用户刷新access_token
用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
用户授权的作用域,使用逗号(,)分隔
错误时微信会返回JSON数据包如下(示例为Code无效错误):
7. 如果access_token过期了需要重新刷取access_token(初次使用可以先忽略)
请求方法如下:
&https://api./sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN &
参数说明:
&参数是否必须说明
公众号的唯一标识
grant_type
填写为refresh_token
refresh_token
填写通过access_token获取到的refresh_token参数
8. 拉取用户信息
官方文档有说明,需要scope为snsapi_userinfo
请求方法如下:
&http:GET(请使用https协议) https://api./sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN &
参数说明:
access_token
网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
用户的唯一标识
正确时返回的JSON数据包如下:
参数说明:
用户的唯一标识
用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
用户个人资料填写的省份
普通用户个人资料填写的城市
国家,如中国为CN
headimgurl
用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
错误时微信会返回JSON数据包如下(示例为openid无效):
{"errcode":40003,"errmsg":" invalid openid "}
其他一些细节性的问题请参考官方文档:
阅读(...) 评论()android 微信第三方登录怎么通过code获取openid?_问答_ThinkSAAS
android 微信第三方登录怎么通过code获取openid?
android 微信第三方登录怎么通过code获取openid?
我已经获取到微信客户端返回的code,但是通过网址没有获取到openid,网址无效果
1.登录公众账号设置OAuth2.0
2.设置菜单按钮URL为OAuth链接
3.页面后台获取:
public String getopenId() {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html");
String code = request.getParameter("code");
String urlstr ="https://api./sns/oauth2/access_token?appid=&appId&&secret=&secret&&code="+ code +"&grant_type=authorization_code";
json = JSONObject.fromObject(HTTPTools.postToGetJson(urlstr));
openId = json.getString("openid");
} catch (Exception e) {
// e.printStackTrace();
return openId;
楼主,跪求你是怎么获取code的?求具体的代码啊。我这个根本无法获取code,反编译之后代码里也没有code这个属性
注意“[3] 接收微信的请求及返回值” 这部分内容,包名和类名要跟文档里的命名的一样才可以
//重写onresume()方法
protected void onResume() {
if (type != null && type.equals("mwx")) {
SharedPreferences settings = getSharedPreferences("setting", 0);
String code = settings.getString("code", null);
if (code != null && !code.equals("")) {
showProgress(true);
getOpenid(code);
settings.edit().clear();
settings.edit().commit();
super.onResume();
// 获取微信用户的openid和access token
public void getOpenid(String code) {
final AsyncHttpClient httpClient = Gl.sharedAsyncClient();
RequestParams params = new RequestParams();
params.put("appid", Constants.wxAPP_ID);
params.put("secret", Constants.wxAppSecret);
params.put("code", code);
params.put("grant_type","authorization_code");
String httpurl ="";
httpClient.get(httpurl, params, new JsonHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers,
JSONObject response) {
String opendid = response.getString("openid");
if (opendid != null && !opendid.equals("")) {
openid = response.getString("openid");
otherLogin("mwx", opendid);
} catch (JSONException e) {
e.printStackTrace();
super.onSuccess(statusCode, headers, response);
public void onFailure(int statusCode, Header[] headers,
String responseString, Throwable throwable) {
super.onFailure(statusCode, headers, responseString, throwable);
添加你想要问的问题
PHP开发框架
开发工具/编程工具
服务器环境}

我要回帖

更多关于 微信获取code和openid 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信