uniapp 用微信进行第三方登录


{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest, hints: [ req_id: SiLDHzyFe-4YxG9a ]"}

这个错误提示很明显吧,提示说token 错误或失效

我研究了研究,没问题呀
得到openid 和 access_token这两个值,就判断用户是否真的登录了,这两个值也是立马得到立马拿去验证了,不会吧
地址:

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

处理:

$params = "access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
        $url = "https://api.weixin.qq.com/sns/auth?".$params;

应该也没有问题呀!
那问题是出在哪呢!这可急死人了,找了一大堆
改了地址:https://api.weixin.qq.com/sns/userinfo(获取用户详细信息)
其实都一样的,我都拿到了openid,只需要验证一下就好了

最后忙了一个下午,才发现,我是封装了一个办法,把$access_token,$openid这两个参数传反了

最后附上代码
api代码(PHP)

public static function weixinUserCheck($openid,$access_token){

    $params = "access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
    $url = "https://api.weixin.qq.com/sns/auth?".$params;

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ;
    curl_setopt($curl, CURLOPT_BINARYTRANSFER, true) ;
    curl_setopt($curl, CURLINFO_HEADER_OUT, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    // 执行
    $data = curl_exec($curl);
    curl_close($curl);

    return json_decode($data,true);
}

app端代码

getuserinfoh5appwx: function(){
    let thisApp = this;
    uni.showLoading({
        title: '数据加载中',
        mask: false
    });
    uni.login({
        success:function(loginRes){
            console.log(1,loginRes);
            
            uni.getUserInfo({
                success:function(res){
                     
                     let user = res.userInfo;
                     let data = {};
                     
                     data.avatar = user.avatarUrl;
                     data.name = user.nickName;
                     data.sex = user.gender;
                     data.access_token = loginRes.authResult.access_token;
                     data.openid = loginRes.authResult.openid;
                     data.appToken = "weixinApp";
                     
                     util.request('login',function(user){
                        thisApp.$Storage.setSelfUser(user,function(){
                            uni.hideLoading();
                            uni.switchTab({
                                url: '/pages/person/person'
                            });
                        });
                    },'post',data);
                }
            })
            
        },
    });
},

php 关于继承 异常出现问题


如果在父类写了一个方法,write(),里面写了如下异常处理

try {
     $this->validate($request,['id'=>'required'],['id.required'=>'请刷新页面再试']);
}catch (ValidationException $e) {
     return $this->error($this->format_exception_error($e));
}

子类继承了方法,使用parent::write();这样是可以正确异常处理的

如果把异常处理写成一个类方法,$this调用是不管用

同样,子类$this调用更不可以了,也不知道是这个laravel 这个异常处理有问题还是不能这样处理,以后还学研究


js 数组、对象push不了


你可能没有遇到这样奇葩的事,对应一个数组老是push不进去数据,typeof 打印为object,你就蒙了,为什么会出现这样的情况,这个题难了我好久,先看一下我写的代码。
var ab = [{a:1}];
var b = {b:2};
var c = ab.push(b);
console.log(c);

这个结果为多少!?

我就觉得c打印为[{a:1},{b:2}];

结果,老是不出现想要的结果,还以为是vue默认吧数组转化为对象造成的。

其实不然,是自己没有把js基本语法弄明白

其实push是有一个返回数组总长的结果,本案例中c的结果是2,哈哈,ab的结果才是:[{a:1},{b:2}]


友盟推送打开指定页面


前台处理方式我看了下,没有深入研究,到时后台我在写的时候仿佛看到过activity

去找,还真有setActivity(activity);
设置这个还是不行啦

我在看setActivity(activity);这个方法时,仿佛又看到afterAction

去找,还真有setAfterOpenAction()
然后你去看一下他的参数值AfterOpenAction action
go_app,//打开应用
go_url,//跳转到URL
go_activity,//打开特定的activity
go_custom//用户自定义内容。

应该就知道怎样设置了吧,这样设置之后,不用其他操作,是不是快、准、恨


友盟推送多条只展示一条消息的问题


其实友盟说明文档已经写得比较清楚了
来看一下
https://developer.umeng.com/docs/66632/detail/98583
设置通知栏显示数量
通知栏可以设置最多显示通知的条数,当通知栏显示数目大于设置值,此时再有新通知到达时,会把旧的一条通知隐藏。
public void setDisplayNotificationNumber(int number);

这样就可以了吗,其实不然,继续往下看

默认情况下,同一台设备在1分钟内收到同一个应用的多条通知时,不会重复提醒,同时在通知栏里新的通知会替换掉旧的通知。可以通过如下方法来设置冷却时间:
mPushAgent.setMuteDurationSeconds(int seconds);

这样就处理好了,是不是你想多了