星期
php封装获取用户openid
首页 > 我的学习历程    作者:月丶   2020年5月23日 10:44 星期六   热度:1947°   百度已收录  
时间:2020-5-23 10:44   热度:1947° 

前端获取用户openid一般来说需要先请求后端拿到获取code的url,跳转获取code,然后用code请求后端获取openid,本接口做了一些改动,可直接使用需要跳到下个页面的url及其他参数来直接获取用户openid。

<?php

$retrunUrl = $_GET['returnUrl'];
$parkId = $_GET['parkId'];

//此处请求java接口获取appid,secret,或直接取值
$appid = 'appid';
$appsecret = 'appsecret';

//通过code获得openid
if (!isset($_GET['code'])){
    //触发微信返回code码
    //此处若使用了https负载均衡,则可以直接固定值:https
    $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://""http://";
    $baseUrl =  urlencode($protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    
    $urlObj["appid"] = $appid;
    $urlObj["redirect_uri"] = $baseUrl;
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base"//snsapi_base、snsapi_userinfo
    $urlObj["state"] = "STATE" . "#wechat_redirect";
    $bizString = ToUrlParams($urlObj);
    $codeUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?" . $bizString;
    
//  echo $codeUrl;
    echo json_encode(
        array(
            "status"=>"200",
            "massage"=>"OK",
            "data"=>$codeUrl
        )
    );
    exit();
else {
    //获取code码,以获取openid
    $code = $_GET['code'];
    $openid = getUserOpenid($appid$appsecret$code);
    if(!strstr(urldecode($retrunUrl), '?')){
        $newUrl = urldecode($retrunUrl)."?openid=".$openid;
    }else{
        $newUrl = urldecode($retrunUrl)."&openid=".$openid;
    }
    
//  echo $newUrl;
    Header("Location: $newUrl");
    exit();
}

 /**
 *
 *
 * @param string $code 微信跳转回来带上的code
 *
 * @return openid
 */
function getUserOpenid($appid, $appsecret, $code)
{
    $urlObj["appid"] = $appid;
    $urlObj["secret"] = $appsecret;
    $urlObj["code"] = $code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = ToUrlParams($urlObj);
    $url = "https://api.weixin.qq.com/sns/oauth2/access_token?" . $bizString;

    $res = httpRequest($url);
    //取出openid
    $data = json_decode($res);
    $openid = $data->openid;
    return $openid;
}
    
    
/**
 *
 * 拼接签名字符串
 * @param array $urlObj
 *
 * @return 返回已经拼接好的字符串
 */
function ToUrlParams($urlObj)
{
    $buff = "";
    foreach ($urlObj as $k => $v) {
        if ($k != "sign") {
            $buff .= $k . "=" . $v . "&";
        }
    }

    $buff = trim($buff"&");
    return $buff;
}

    /**
 * 构造获取http请求
 * @param string $url 请求接口的url,需要url编码
 * @param string $data 请求时传递的数据,GET时为null
 * @param string $cookies 是否需要缓存状态
 * @return 返回请求接口返回的数据
 */
function httpRequest($url, $data = null)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    if (!empty($data)) {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}

?>

使用:

const returnUrl = encodeURIComponent(window.location.origin+"/scanpay/orderpay"+urlencode(param));
      const requestParam={
        returnUrl: returnUrl,
        parkId: param.parkingLotId
      }
      apiOpenidByparkId(requestParam)
      .then(res=>{
        if (res.status == "200" && res.data) {
          window.location.href = res.data;
        } else {
          Notify({
            type: "danger",
            message:
              "获取用户下单Openid失败:" + res.status + "," + res.message
          });
        }
      })
最终会跳到传递的returnUrl上,并携带openid


二维码加载中...
本文作者:月丶      文章标题: php封装获取用户openid
本文地址:http://silver.eleuu.com/?post=33
版权声明:若无注明,本文皆为“月丶”原创,转载请保留文章出处。

返回顶部    手机版本    会员注册   
版权所有:月丶    博主: 月丶    团队首页电子乌托邦  博客框架:emlog   蜀ICP备18008322号   
  
//音乐播放器