public static function encode($payload, $key, $alg = 'HS256', $keyId = null)
 {
     $header = array('typ' => 'JWT', 'alg' => $alg);
     if ($keyId !== null) {
         $header['kid'] = $keyId;
     }
     $segments = array();
     $segments[] = JWT::urlsafeB64Encode(json_encode($header));
     $segments[] = JWT::urlsafeB64Encode(json_encode($payload));
     $signing_input = implode('.', $segments);
     $signature = JWT::sign($signing_input, $key, $alg);
     $segments[] = JWT::urlsafeB64Encode($signature);
     return implode('.', $segments);
 }