2018-04-19 16:54:03 ws932734384 阅读数 24657

        本人最近要做微信公众号网页开发的项目,其中有个需求是判断用户是否关注公众号,由于之前没有接触过微信授权的东西,所以提前开始做调研。在度娘上看了好多博客、百度知道、百度经验、知乎问答等,还仔细阅读了微信公众平台开发文档,大致了解到:

        微信网页授权分两种,第一种是snsapi_base(静默授权,用户无感知),第二种是snsapi_userinfo(第一次授权需要用户点击登录确认)。静默授权只需要两步就能拿到开发者需要的openID,而第二种授权方式,一共需要四步,可以拉取到用户信息(昵称、头像等)。具体过程这里不在赘述,参阅微信开发者文档。


        但是,本人发现一个不好的事情,获取到的用户信息里,并没有度娘告诉我的用于判断用户是否关注公众号的字段 subscribe 。然后,继续查阅博客、百度知道、百度经验、知乎问答,其中,有一篇博客让我如获至宝,下面是博客的截图:


        然后我就天真的相信,只有在unionID机制下,获取到的用户信息里才会有 subscribe 字段。后来,查看微信公众平台开发文档,其中有一段:


        那么,只有把公众号绑定到微信开放平台上才能使用unionID机制。所以自己就注册了一个微信开放平台,要绑定公众号的时候发现,只有完成开发者资质认证才能绑定。但是认证需要:



        以上只是一部分。这哪儿是我一个开发能做的事儿啊,所以向项目经理说明了情况,又向技术中心老大申请……,经过了一系列繁杂又不太顺利的流程。最后,让我来注册,需要什么材料找行政要。

        当然,在协调的过程中,我也没闲着,咨询了做过微信网页授权的同事,自己也继续翻阅微信开发文档(相当烂)、在本地尝试授权,获取用户信息,最终发现:不需要unionID机制,也能获取用户基本信息,拿到 subscribe 字段。那么正题来了!


微信网页授权并获取用户基本信息(是否关注公众号、头像、昵称等)步骤:  

          1、用户同意授权,获取code(使用静默授权即可)

               参阅 微信网页授权 第一步

            2、通过code换取  网页授权access_token  和 openID(此处的access_token为网页授权过程专用)

                参阅 微信网页授权 第二步

            3、使用AppId和AppSecret:获取access_token

                参阅  获取access_token

            4、使用openID和access_token获取用户基本信息

                参阅 获取用户基本信息(包括UnionID机制)

最终获取到的用户基本信息如下图:

        


        好了,到这里终于拿到了我需要的判断用户是否关注公众号的字段: subscribe 。


        饶了这么大圈子,有些感触:微信公众平台开发文档不容易看懂,unionID机制到底是啥,绑定了开放平台才叫unionID机制吗,那我现在这种调接口的方法(并没有绑定微信开放平台)属于unionID机制吗。

        再多说一句,其实这些逻辑,绝大部分是在后端完成的(access_token、appsecret安全等级都比较高)。所以,作为前端,只要调接口==》回调地址,再调接口==》得到用户基本信息。

2017-10-16 11:20:14 qq_31617637 阅读数 9438

前几天做的一个项目,微信助力活动,需要获取微信用户的头像,然后存表,在获取微信头像的时候,遇到了两个问题,可能很普通的问题,解决起来也很好解决!



  • 问题一Accesstoken 问题(获取信息接口的问题)

网页授权的 AccessToken 和获取用户信息的 AccessToken 不是一个东西。

也就是获取用户信息接口地址应是

https://api.weixin.qq.com/sns/userinfo

而不是

https://api.weixin.qq.com/cgi-bin/user/info

  • 问题二 48001错误问题

微信错误: 微信登录提示48001,{“errcode”:48001,”errmsg”:”api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]”}
原因:
①:你的服务号必须是通过腾讯认证,每年是300元,如果没有认证而导致的错误提示,那就去认证,别往下看了!如果你已认证,本条原因排除,那么请继续往下看
②:你是否是第三方网页,第三方网页的话,那么你的url地址里面的scope这个参数要填写”snsapi_userinfo”,否则会报这个错!原因如下!
URL地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=ok#wechat_redirect

scope参数对应值的解释:
snsapi_base 不需要用户点同意,直接跳转到授权后的页面,只能用于获取openid,不能获取用户基本信息
snsapi_userinfo 会征求用户同意,授权后,可以获取用户基本信息

需要snsapi_userinfo 的授权域,不然就会拿不到头像啦



  • 问题三 机械返回的问题

当微信回调地址拼上code参数之后,就会用code拿到头像,但是如果我们点进下一个链接,然后在通过手机返回之前拼接的code页面之时,那个连接的code 则会失效,则我们需要重新获取认证

           if(isset($wx_arr['errcode'])){  //当手机机械按钮返回的时候code已经使用过会出现报错  需要重新拿code <br>
            $return_url = '/wap/activityhelp-1.html?uid='.$_GET['uid'].'&amp;model='.$_GET['model']; <br>
            $return_url = 'http://'.$_SERVER['HTTP_HOST'].$return_url; <br>
            if($_GET['time']) { <br>
                $return_url = $return_url.'&amp;time='.$_GET['time']; <br>
            } <br>
            $appId_to_get_code = trim($wxpayjsapi_conf['setting']['appId']); <br>
            $wechat_object->get_code($appId_to_get_code, $return_url); <br>
        }</li>
</ul>
2018-11-29 02:01:23 weixin_34080571 阅读数 152

1


<view class='my_head'>      <!-- <image class='my_head_img' src='/image/head.png'></image> -->      <image class='my_head_img' src='{{user_img}}'></image>    </view>    <view class='my_head_name'>      {{user_name}}    </view>复制代码

2


Page({
  /**   * 页面的初始数据   */  data: {    canIUse: wx.canIUse('button.open-type.getUserInfo'),    'user_name': "",    'user_img': "",  },
  /**   * 生命周期函数--监听页面加载   */  onLoad: function(options) {    var that = this;    // 查看是否授权    wx.getSetting({      success: function(res) {        if (res.authSetting['scope.userInfo']) {          // 已经授权,可以直接调用 getUserInfo 获取头像昵称          wx.getUserInfo({            success: function(res) {              // console.log(res.userInfo)              that.info(res.userInfo)            }          })        }      }    })  },
  // 处理获取的头像信息  info: function (res) {    console.log(res)    this.setData({      user_name: res.nickName,      user_img: res.avatarUrl,    })  },})复制代码


2017-01-16 15:56:07 qq_25032257 阅读数 104

        在开发微信时,都有这么一个问题,如何获取当前用户的信息,比如头像、昵称、性别等等。当获取到这些时,我们可以就可以将用户信息存储到数据库,完成用户的注册。那么在微信客户端如何获取用户信息呢?在微信开发者文档中https://mp.weixin.qq.com/wiki/1/8a5ce6257f1d3b2afb20f83e72b72ce9.html可以看到,获取用户信息需要两个条件,1是access_token,2是openid,'access_token'如何获取在文档中有详细介绍,主要是openid如何获取。

      openid获取有两种方式:一是在微信公众号收到消息的xml数据中的FromUserName,另一种是通过网页授权方式获取。

获取用户信息只有在认证的订阅号和认证的服务号上被授权,才能获取到用户信息,如果不是这两种方式。对不起,不能获取用户信息。

2018-07-13 15:17:58 weixin_42085115 阅读数 13374

在公众号开发中避免不了获取微信用户头像,昵称等登录信息。这里我总结了一下微信开发中从网页授权到获取到用户openid,nickname,headimgurl等信息。

微信开发手册

首先要在微信公众平台中配置好网页授权域名,建议设置为项目域名即可。

这里写图片描述

thinkPHP5的话建议在入口文档定义AppID和APPSecret,因为这两个参数会多次用到,如果以后有变更方便修改,也可在配置文件中定义。

define('APPID', 'wx8fc535aaa112dfb3');
define('SECRET', '97f96488de4911994dfc86f0e287a969');

接下来获取code

public function index()
    {
        //获取code
        $redirect_uri = urlencode('http://www.XXX.com/index/index/getAccesstoken');
        header('Location:https://open.weixin.qq.com/connect/oauth2/authorize?appid='.APPID.'&redirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect');
        exit;

    }

使用**urlencode()**函数来对回调地址进行加密,回调地址的域名和网页授权域名一致就好,回调地址控制器方法应为接下来获取access_token和openID的控制器和方法。

public function getAccesstoken(){
        //得到openID
        $code = $_GET['code'];
        //获取access_token值
        $get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.APPID.'&secret='.SECRET.'&code='.$code.'&grant_type=authorization_code'; 
        $data = json_decode(httpRequest($get_token_url),true); 
        // 得到用户信息
        $get_user_info = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$data["access_token"].'&openid='.$data["openid"].'&lang=zh_CN';
        $userinfo = json_decode(httpRequest($get_user_info),true); 
        var_dump($userinfo);
        // var_dump($data);
    }

通过回调链接,会将携带code的返回值返回到该方法中,发送获取access_token的请求,得到access_token,这里的access_token仅限于获取用户信息,具体建议查看手册。

拿到access_token和openID后发送获取用户信息的请求,得到的$userinfo就是包含用户昵称,性别,头像等信息的数组(通过json_decode将json格式转为数组,微信返回为json格式)。

这里的httpRequest()方法为发送curl请求的一个方法,如下:

function httpRequest($url, $postData=array()){
        // (1)初始化
        $ch = curl_init();
        // (2)设置选项
        // 设置请求的url
        curl_setopt($ch, CURLOPT_URL, $url);
        // 将curl_exec()获取的数据以字符串返回,而不是直接输出。
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        if(!empty($postData)){
            // 设置请求方式为post
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        }
        //curl注意事项,如果发送的请求是https,必须要禁止服务器端校检SSL证书
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        // (3)执行
        $result = curl_exec($ch); 
        // (4)关闭
        curl_close($ch);
        return $result;
}
没有更多推荐了,返回首页