php版微信登录提示Oops! Something went wrong:(错误
测试地址为:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的appid&redirect_uri=http://www.111cn.net /wx_agentAdd.php?response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
我们直接在浏览器中打开此地址你会看到
Oops! Something went wrong:(
这个问题包括所有浏览器打开都会这样只能从微信中打开才会正常,包括我们pc版微信登录也是一样的。
这个支付类是根据官方的文档修改而来!主要实现生成JS API 、Native的package签名包和Native响应的XML格式数据。注释都标上了各方法的用意。由于package包签名,略复杂,这个要自己多花时间去对应去看和log出文件来一一对比!当然只要你用上教程的类,设置好对应的参数就可以正确的生成package参数等
<?php
if (isset($argc) && $argc >= 1 && $argv[0] == __FILE__) {
//初始化pay的必要信息
$pay = new WechatPay(array(
WechatPay::APPID => 'wx99dabzpiuq83985b8',
WechatPay::APPSERCER => 'ac12e7e4abaer63hkoa0cc36a9663fa',
WechatPay::PARTNERKEY => 'bae4sfa3562rsfaq23s2045',
WechatPay::PARTNERID => '1268969802',
WechatPay::PAYSIGNKEY => '9Fqsxb3PK4IVOCEc4yCquy5zecS9LeeMjF2Nn4B4YKoOxPwaQdFwMezKT8oNlBYaWcuT',
WechatPay::SIGNTYPE => 'sha1',
));
//设置package 必要的参数 jsapi native都通用
$pay->setParams(WechatPay::BANK_TYPE, "WX");
$pay->setParams(WechatPay::BODY, "test");
$pay->setParams(WechatPay::PARTNER, $pay->partnerid);
$pay->setParams(WechatPay::OUT_TRADE_NO, commonUtil::createNoncestr());
$pay->setParams(WechatPay::TOTAL_FEE, "1");
$pay->setParams(WechatPay::FEE_TYPE, "1");
$pay->setParams(WechatPay::TIMESTAMP, time());
$pay->setParams(WechatPay::NOTIFY_URL, "http://www.demo.com/notify");
$pay->setParams(WechatPay::SPBILL_CREATE_IP, "127.0.0.1");
$pay->setParams(WechatPay::INPUT_CHARSET, "UTF-8");
//JSAPI的签名json
print_r($pay->createJsApiPackage());
//生成native XML
print_r($pay->createNativePackage());
//生成native URL
print_r($pay->createNativeUrl("9701"));
}
JS API生成的package签名包参数:
{
"appId":"wx9998ff5f4dede5b7",
"package":"bank_type=WX&body=test&fee_type=1&input_charset=UTF-8¬ify_url=http%3A%2F%2Fwww.demo.com%2Fnotify&out_trade_no=Vf5qsSwtu0hc2loH&partner=wx9998ff5f4dede5b7&spbill_create_ip=127.0.0.1×tamp=1409295711&total_fee=1&sign=FEE0167BD0D89A88BF6850590EA889B6",
"timeStamp":1409295711,
"nonceStr":"Vf5qsSwtu0hc2loH",
"paySign":"f816264c750923863c370a1739640244b0c2d39c",
"signType":"sha1"
}
Native 响应的XML格式:
<xml>
<AppId><![CDATA[wx9998ff5f4dede5b7]]></AppId>
<Package>
<![CDATA[bank_type=WX&body=test&fee_type=1&input_charset=UTF-8¬ify_url=http%3A%2F%2Fwww.demo.com%2Fnotify&out_trade_no=GDl3what4sALDEAd&partner=wx9998ff5f4dede5b7&spbill_create_ip=127.0.0.1×tamp=1409296124&total_fee=1&sign=BF949B85570644B939B369FD44B0C4A9]]>
</Package>
<TimeStamp>1409296124</TimeStamp>
<NonceStr><![CDATA[GDl3what4sALDEAd]]></NonceStr>
<RetCode>0</RetCode>
<RetErrMsg><![CDATA[ok]]></RetErrMsg>
<AppSignature><![CDATA[ca4a2467b817a62c38a9801fcf451f51692027bf]]></AppSignature>
<SignMethod><![CDATA[sha1]]></SignMethod>
</xml>
Native的URL链接:
weixin://wxpay/bizpayurl?appid=wx9998ff5f4dede5b7&noncestr=VY7cVA6mtVrc1BVq&productid=9701&sign=43508b65b50e1d7e1089be66d55a709469155d73×tamp=1409296323
无论哪一种方式,我们都要通过setParams来设置必要初始化参数和商品价格和状态等!
WechatPay class:
<?php
class WechatPay {
const
BANK_TYPE = 'bank_type',
BODY = 'body',
PARTNER = 'partner',
OUT_TRADE_NO = 'out_trade_no',
TIMESTAMP = 'timestamp',
TOTAL_FEE = 'total_fee',
FEE_TYPE = 'fee_type',
NOTIFY_URL = 'notify_url',
SPBILL_CREATE_IP = 'spbill_create_ip',
INPUT_CHARSET = 'input_charset',
APPID = 'appid',
APPSERCER = 'appsercer',
PAYSIGNKEY = 'appkey',
PARTNERID = 'partnerid',
PARTNERKEY = 'partnerkey',
SIGNTYPE = 'signtype';
public
$params = array(), $partnerid = '';
static protected
$_instance;
protected
$_appid, $_appkey, $_signtype, $_partnerkey, $_appsercer;
static public function getInstance(array $options = array()) {
if (empty(self::$_instance)) {
self::$_instance = new self ($options);
}
return self::$_instance;
}
public function __construct(array $options = array()){
$this->_appid = $options[self::APPID];
$this->_appkey = $options[self::PAYSIGNKEY];
$this->_signtype = $options[self::SIGNTYPE];
$this->_partnerkey = $options[self::PARTNERKEY];
$this->_appsercer = $options[self::APPSERCER];
$this->partnerid = $options[self::APPID];
}
public function setParams($param, $paramValue) {
$this->params[CommonUtil::trimString($param)] = CommonUtil::trimString($paramValue);
}
public function getParams($param) {
return $this->params[$param];
}
protected function createNoncestr( $length = 16 ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
public function checkParams(){
//必要的9个参与签名的参数
if($this->params[self::BANK_TYPE] == null || $this->params[self::BODY] == null || $this->params[self::PARTNER] == null ||
$this->params[self::OUT_TRADE_NO] == null || $this->params[self::TOTAL_FEE] == null || $this->params[self::FEE_TYPE] == null ||
$this->params[self::NOTIFY_URL] == null || $this->params[self::SPBILL_CREATE_IP] == null || $this->params[self::INPUT_CHARSET] == null
) {
return false;
}
return true;
}
/*
* 生成package包
* @params 初始化类时用setParams方法定义必要的9个参数
* 排序后格式化url query形式 再md5SignUtil类签名,再给合URL
*/
protected function getPackageSign(){
try {
if (null == $this->_partnerkey || "" == $this->_partnerkey ) {
throw new Exception("密钥不能为空!" . "<br>");
}
$commonUtil = new CommonUtil();
ksort($this->params);
$unSignParaString = $commonUtil->formatUrlQuery($this->params, false);
$paraString = $commonUtil->formatUrlQuery($this->params, true);
$md5SignUtil = new MD5SignUtil();
return $paraString . "&sign=" . $md5SignUtil->sign($unSignParaString,commonUtil::trimString($this->_partnerkey));
} catch (Exception $e) {
echo ($e->getMessage());
}
}
/*
* 生成签名方法
* @params appid appkey package timestamp noncestr 等参数而native事例代码中加上retcode reterrmsg两个参数
*/
public function getPaySign($signObj){
foreach ($signObj as $k => $v){
$signParams[strtolower($k)] = $v;
}
try {
if ($this->_appkey == "") {
throw new Exception("APPKEY为空!" . "<br>");
}
$signParams["appkey"] = $this->_appkey;
ksort($signParams, SORT_STRING);
$commonUtil = new CommonUtil();
$signString = $commonUtil->formatPayUrlQuery($signParams, false);
return sha1($signString);
} catch (Exception $e) {
echo ($e->getMessage());
}
}
//JS API 签名 其中nonceStr是作为订单号 灌穿整个支付流程
public function createJsApiPackage(){
try {
if($this->checkParams() == false) {
throw new Exception("生成package参数缺失!" . "<br>");
}
$payObj["appId"] = $this->_appid;
$payObj["package"] = $this->getPackageSign();
$payObj["timeStamp"] = $this->getParams(self::TIMESTAMP);
$payObj["nonceStr"] = $this->getParams(self::OUT_TRADE_NO);
$payObj["paySign"] = $this->getPaySign($payObj);
$payObj["signType"] = $this->_signtype;
return json_encode($payObj);
} catch (Exception $e) {
die($e->getMessage());
}
}
/*
* 构建发货状态数组 主要三个参数openid transid orderid
*/
public function createDeliverPost(Array $params) {
$deliver = array();
$deliver['appid'] = $this->_appid;
$deliver['openid'] = $params['openid'];
$deliver['transid'] = $params['transid'];
$deliver['out_trade_no'] = $params['out_trade_no'];
$deliver['deliver_timestamp'] = current_time('timestamp');
$deliver['deliver_status'] = 1;
$deliver['deliver_msg'] = 'OK';
$deliver['app_signature'] = $this->getPaySign($deliver);
$deliver['sign_method'] = 'sha1';
return $deliver;
}
/*
* 生成扫描或者点击原生URL后,响应的XML格式
* @params $retcode $reterrmsg 定义该商品的状态
*/
public function createNativePackage($retcode = 0, $reterrmsg = "ok") {
try {
if ($this->checkParams() == false && $retcode == 0) { //如果是正常的返回, 检查财付通的参数
throw new Exception("生成package参数缺失!" . "<br>");
}
$nativeObj["AppId"] = $this->_appid;
$nativeObj["Package"] = $this->getPackageSign();
$nativeObj["TimeStamp"] = $this->getParams(self::TIMESTAMP);
$nativeObj["NonceStr"] = $this->getParams(self::OUT_TRADE_NO);
$nativeObj["RetCode"] = $retcode;
$nativeObj["RetErrMsg"] = $reterrmsg;
$nativeObj["AppSignature"] = $this->getPaySign($nativeObj);
$nativeObj["SignMethod"] = $this->_signtype;
$commonUtil = new CommonUtil();
$xml = $commonUtil->arrayToXml($nativeObj);
exit($xml);
}catch (Exception $e) {
echo ($e->getMessage());
}
}
/*
* 生成原生URL 以订单号为参数 这是灌穿整个支付流程
*/
public function createNativeUrl($productid) {
$commonUtil = new CommonUtil();
$nativeObj["appid"] = $this->_appid;
$nativeObj["productid"] = urlencode($productid);
$nativeObj["timestamp"] = time();
$nativeObj["nonceStr"] = commonUtil::createNoncestr();
$nativeObj["sign"] = $this->getPaySign($nativeObj);
$nativeString = $commonUtil->formatPayUrlQuery($nativeObj, false);
return "weixin://wxpay/bizpayurl?".$nativeString;
}
/*
* 取IP地址
*/
public function getIp(){
switch(true) {
case !empty($_SERVER["HTTP_CLIENT_IP"]):
$ip = $_SERVER["HTTP_CLIENT_IP"];
break;
case !empty($_SERVER["HTTP_X_FORWARDED_FOR"]):
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
break;
case !empty($_SERVER["REMOTE_ADDR"]):
$ip = $_SERVER["REMOTE_ADDR"];
break;
default:
$ip = "127.0.0.1";
}
return $ip;
}
}
class MD5SignUtil {
public function sign($content, $key) {
try {
if (null == $key) {
throw new Exception("财付通签名key不能为空!" . "<br>");
}
if (null == $content) {
throw new Exception("财付通签名内容不能为空" . "<br>");
}
$signStr = $content . "&key=" . $key;
return strtoupper(md5($signStr));
} catch (Exception $e) {
echo ($e->getMessage());
}
}
public static function verifySignature($content, $sign, $md5Key) {
$signStr = $content . "&key=" . $md5Key;
$calculateSign = strtolower(md5($signStr));
$tenpaySign = strtolower($sign);
return $calculateSign == $tenpaySign;
}
}
class CommonUtil {
public function genAllUrl($toURL, $paras) {
$allUrl = null;
if (null == $toURL) {
die("toURL is null");
}
if (strripos($toURL,"?") =="") {
$allUrl = $toURL . "?" . $paras;
} else {
$allUrl = $toURL . "&" . $paras;
}
return $allUrl;
}
//订单号,可根据实际自定义
static public function createOrderNo() {
$nonce = CommonUtil::createNoncestr(4);
return strtoupper(date('ymds').substr(microtime(),2,4).$nonce);
}
//随机字符串
static public function createNoncestr( $length = 16 ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
public function splitParaStr($src, $token) {
$resMap = array();
$items = explode($token,$src);
foreach ($items as $item){
$paraAndValue = explode("=",$item);
if ($paraAndValue != "") {
$resMap[$paraAndValue[0]] = $paraAndValue[1];
}
}
return $resMap;
}
static function trimString($value) {
$ret = null;
if (null != $value) {
$ret = $value;
if (strlen($ret) == 0) {
$ret = null;
}
}
return $ret;
}
public function formatUrlQuery($paraMap, $urlencode) {
$buff = "";
ksort($paraMap, SORT_STRING);
foreach ($paraMap as $k => $v) {
if (null != $v && "null" != $v && "sign" != $k) {
if($urlencode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff)-1);
}
return $reqPar;
}
public function formatPayUrlQuery($paraMap, $urlencode) {
$buff = "";
ksort($paraMap, SORT_STRING);
foreach ($paraMap as $k => $v) {
if($urlencode){
$v = urlencode($v);
}
$buff .= strtolower($k) . "=" . $v . "&";
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff)-1);
}
return $reqPar;
}
/*
* 输出一级数组的xml格式
*/
public function arrayToXml($arr) {
$xml = "<xml>";
foreach ($arr as $key=>$val) {
if ($key == 'TimeStamp' || $key == 'RetCode') {
$xml.="<".$key.">".$val."</".$key.">";
} else
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
$xml .= "</xml>";
return $xml;
}
}
微信JSSDK的图片接口,能让我们轻松实现上传功能。继续做例子,我们先更新下wx.config的jsApiList数组加入四个’chooseImage’, ‘uploadImage’, ‘downloadImage’, ‘previewImage’。
继续用thinkphp做框架,首先们们新建Layout/image.phtml:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<link href="__PUBLIC__/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
{__CONTENT__}
</body>
<script type="text/javascript">
window.jQuery || document.write("<script src='__PUBLIC__/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
</script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
wx.config({
debug: false,
appId: '{$signPackage["appId"]}',
timestamp: {$signPackage["timestamp"]},
nonceStr: '{$signPackage["nonceStr"]}',
signature: '{$signPackage["signature"]}',
jsApiList: [
'checkJsApi',
'chooseImage',
'uploadImage',
'downloadImage',
'previewImage'
]
});
wx.ready(function () {
var images = {
localId: [],
serverId: [],
downloadId: []
};
document.querySelector('#selectImage').onclick = function () {
wx.chooseImage({
success: function (res) {
images.localId = res.localIds;
jQuery(function(){
$.each( res.localIds, function(i, n){
$("#img").append('<img src="'+n+'" /> <br />');
});
});
}
});
};
document.querySelector('#uploadImage').onclick = function () {
if (images.localId.length == 0) {
alert('请先使用选择图片按钮');
return;
}
images.serverId = [];
jQuery(function(){
$.each(images.localId, function(i,n) {
wx.uploadImage({
localId: n,
success: function (res) {
images.serverId.push(res.serverId);
},
fail: function (res) {
alert(JSON.stringify(res));
}
});
});
});
};
document.querySelector('#downloadImage').onclick = function () {
if (images.serverId.length == 0) {
alert('请先按上传图片按钮');
return;
}
jQuery(function() {
$.each(images.serverId, function (i, n) {
wx.downloadImage({
serverId: n,
success: function (res) {
images.downloadId.push(res.localId);
}
});
});
$.each( images.downloadId, function(i, n){
$("#img2").append('<img src="'+n+'" /> <br />');
});
});
};
document.querySelector('#previewImage').onclick = function () {
var imgList = [
'__PUBLIC__/images/gallery/image-1.jpg',
'__PUBLIC__/images/gallery/image-2.jpg'
];
wx.previewImage({
current: imgList[0],
urls: imgList
});
};
});
wx.error(function(res){
var str = res.errMsg;
var reg = /invalid signature$/;
var r = str.match(reg);
if(r !== null) {
jQuery(function(){
$.getJSON('http://www.demo.com/tp/home/index/ticket', function(data) {
if(data) {
alert('ticket update');
location = location;
window.navigate(location);
}
});
});
}
});
</script>
</html>
新建视图views/Index/image.phtml:
<style>
.text-center {text-align: center;}
.btn-hight {height:100px;width:230px;}
#img img{width:200px;}
</style>
<div class="col-lg-12 col-sm-12" style="margin: 12px auto 10px;">
<div class="form-group text-center">
<button id="selectImage" type="button" class="btn btn-primary btn-hight"><h2>选择图片</h2></button>
</div>
<div class="form-group text-center">
<div id="img"></div>
</div>
<div class="form-group text-center">
<button id="uploadImage" type="button" class="btn btn-primary btn-hight"><h2>上传图片</h2></button>
</div>
<div class="form-group text-center">
<button id="downloadImage" type="button" class="btn btn-primary btn-hight"><h2>下载图片</h2></button>
</div>
<div class="form-group text-center">
<div id="img2"></div>
</div>
<div class="form-group text-center">
<button id="previewImage" type="button" class="btn btn-primary btn-hight"><h2>预览图片</h2></button>
</div>
</div>
Controller就加入一个imageAction:
public function imageAction() {
layout('Layout/image');
$this->display();
}
选择图片接口效果图:
上传和下载接口的效果图:(注 这里是先上传接口取到media_id再调下载图片接口显示出来,请看layout的js代码)
预览图片接口效果图:
根据《微信JS-SDK地理位置接口例子》中的QQMapModel和ImageCacheModel类进行扩展。看了下腾讯地图有个静态图的V2版,我顺便也加上去,继续围绕腾讯地图把取街景的接口写上。由于是Demo,像取街景有几个参数可以自行定义,我只用默认!不多说看码吧
QQMapModel.class.php: (注:API_KEY 用QQ在官方申请,目前免费)
<?php
namespace Home\Model;
class QQMapModel {
const
PANO_API = 'http://apis.map.qq.com/ws/streetview/v1/getpano',
API_KEY = 'CZQBZ-RC53V-2RQPX-UFNBE-FCH2J-DF00';
static public function call($url, array $params = null) {
$url = $url.'?'.http_build_query($params);
$ch = curl_init($url);
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_AUTOREFERER => 1,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_VERBOSE => 1,
));
$result = curl_exec($ch);
if (curl_errno($ch)) {
return false;
}
curl_close($ch);
return $result;
}
//新静态图v2接口
static function staticMap($point, $otherParam = array()) {
$pos = explode(',', $point);
$posStr = $pos[1].','.$pos[0];
$param = array(
'size' => '620*380',
'center' => $posStr,
'zoom' => 13,
'format' => 'png',
'maptype' => 'roadmap',
'markers' => $posStr,
'key' => self::API_KEY,
);
if(count($otherParam))
$param = array_merge($param, $otherParam);
return 'http://apis.map.qq.com/ws/staticmap/v2/?' . http_build_query($param);
}
//取街景图接口
static function streetView($pano, $otherParam = array()) { //max 960x640
$param = array(
'size' => '620x380',
'pano' => $pano,
'heading' => 0,
'pitch' => 0,
'key' => self::API_KEY,
);
if(count($otherParam))
$param = array_merge($param, $otherParam);
return 'http://apis.map.qq.com/ws/streetview/v1/image?' . http_build_query($param);
}
//街景图的ID接口
static function getPano($location, $otherParam = array()) {
$param = array(
'location' => $location,
'radius' => 200,
'output' => 'json',
'key' => self::API_KEY,
);
if(count($otherParam))
$param = array_merge($param, $otherParam);
$result = self::call(self::PANO_API, $param);
if ($result) {
return json_decode($result, 1);
}
return false;
}
//静态图v1版接口
static function mapImage($point, $otherParam = array()) {
$param = array(
'size' => '620*380',
'center' => $point,
'zoom' => 13,
'format' => 'png',
'markers' => $point,
);
if(count($otherParam))
$param = array_merge($param, $otherParam);
return 'http://st.map.qq.com/api?' . http_build_query($param);
}
}
ImageCacheModel类:(只是在上篇教程上加多个静态方法处理街景的缓存)
public static function getStreetCacheImg($points) {
$fileName = md5($points);
self::$FULL_CACHE_DIR = C('PUBLIC_FULL_DIR').self::CACHE_DIR;
$cacheImg = self::$FULL_CACHE_DIR.'/'.$fileName.self::$TYPE;
if(file_exists($cacheImg)) {
return self::CACHE_DIR.$fileName.self::$TYPE;
} else {
$res = QQMapModel::getPano($points);
if($res['status'] === 0) {
$pano = $res['detail']['id'];
$imageUrl = QQMapModel::streetView($pano);
self::saveCacheImg($imageUrl, $fileName);
return self::CACHE_DIR.$fileName.self::$TYPE;
}
return self::CACHE_DIR.'default'.self::$TYPE;
}
}
然后Controller里的处理:(至于Layout模版里的AJAX调用与上篇地理接口差不多,这里就不写了)
public function streetpicAction() {
layout(false);
if(I('pos','')) {
$target = ImageCacheModel::getStreetCacheImg(I('pos'));
$url = __ROOT__.$target;
redirect($url);
}
}
相关文章
Ecshop提示Only variables should be passed by reference in错误
在安装好ecshop软件之后我们打开首页时提示Only variables should be passed by reference in错误了,碰到这个问题是什么原因呢?下面我们就一起来看看解决办法吧。...2016-11-25- 409错误是什么?http 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
- 414错误是HTTP协议状态码中的一种,很多都还不知道414错误是什么,以及不知道怎么解决414错误,那么就来看看小编带来的介绍吧。 414错误是什么: HTTP 414错误,(Requ...2017-01-22
- http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
- 401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
- http 402错误是什么?402错误较为少见,一般不轻易出现,下面小编就来告诉大家402错误是什么吧。 HTTP 402错误是HTTP状态码的一种,表示“要求付费”; 所求的...2017-01-22
- 411错误是HTTP协议状态码的一种,很多人都还不知道411错误是什么,本次一聚教程网将为大家进行解答,并且告诉大家411错误怎么解决。 411错误是什么: HTTP 411错误,(Lengt...2017-01-22
- Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
- 403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限...2017-01-22
- 403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
- 412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
- 相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
- 在很多网站用户先访问一个要登录的页面,但当时没有登录后来登录了,等待用户登录成功之后肯定希望返回到上次访问的页面,下面我就来给大家介绍登录后跳转回原来要访问的页...2016-11-25
- 407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
- HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
- 410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
- 每当遇到http错误代码为400,代表客户端发起的请求不符合服务器对请求的某些限制,或者请求本身存在一定的错误,那么HTTP 400错误怎么解决呢?请看下文介绍。 目前400错...2017-01-22
PHP Fatal error: Cannot use object of type stdClass as array in错误
下面一起来看看在php开发中碰到PHP Fatal error: Cannot use object of type stdClass as array in错误问题的解决办法吧。 普通的数组出现如下错误 代码...2016-11-25- 本文章完美的利用了php的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。 代码如下 复制代码 <?php $discuz_url = ‘ht...2016-11-25
- 自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31