利用wx.login接口获取小程序code作为接口签名防恶意调用

前言

小程序接口经常被人抓包调用!烦死了!这样极大的影响服务器资源,那么这个就可以解决你的烦恼!

小程序代码

const wxLogin = () => {
  return new Promise((reslove) => {
    wx.login({
      success(res) {
        reslove(res.code);
      } 
    })
  })
}
//调用代码
var code = await wxLogin();
//接口使用的时候可以直接"&sign="+code
wx.request({
            url: "https://域名/getYzm?sign=" +code,
            success: function (res) { //后端返回的数据
              var data = res.data;
                console.info(data);
               
        }
 })

后端代码

<?php
 public function index(){
    isset($_GET['sign']) ? $sign = $_GET['sign'] : exit('sign获取失败!');
     if ($this->verifyCodeSign($sign) == false) {
        exit('签名校验失败!');
     }
//下面是实现功能代码
}
private function  verifyCodeSign($code){
        if (empty($code)){
            return false;
        }
//小程序的配置
        $appidStr=APPID;
        $secretStr=APPSECRET;
        $grant_type = "authorization_code"; //授权(必填)
        $params = "appid=".$appidStr."&secret=".$secretStr."&js_code=".$code."&grant_type=".$grant_type;
        $url = "https://api.weixin.qq.com/sns/jscode2session?".$params;
        $res = json_decode(Index::httpGet($url),true);
        if (empty($res['session_key'])){
            return false;
        }else{
            return true;
        }
    }
function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);
        $res = curl_exec($curl);
        curl_close($curl);
        return $res;
    }

本文作者

Soujer 晓杰