php版微信登录提示Oops! Something went wrong:(错误

 更新时间:2016年11月25日 16:16  点击:2370
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版微信登录也是一样的。

本文章来为各位介绍一篇关于php版本微信js-sdk支付接口类例子,希望这篇文章能够对各位同学带来帮助。

这个支付类是根据官方的文档修改而来!主要实现生成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&notify_url=http%3A%2F%2Fwww.demo.com%2Fnotify&out_trade_no=Vf5qsSwtu0hc2loH&partner=wx9998ff5f4dede5b7&spbill_create_ip=127.0.0.1&timestamp=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&notify_url=http%3A%2F%2Fwww.demo.com%2Fnotify&out_trade_no=GDl3what4sALDEAd&partner=wx9998ff5f4dede5b7&spbill_create_ip=127.0.0.1&timestamp=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&timestamp=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;
    }
}

php版微信JS-SDK前面介绍过许多的相关教程了这里介绍一篇关于php版微信JS-SDK图片接口的一个使用例子了,具体的操作细节如下介绍。

微信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();
    }
选择图片接口效果图:

 

选择图片接口效果图:
chooseimage
上传和下载接口的效果图:(注 这里是先上传接口取到media_id再调下载图片接口显示出来,请看layout的js代码)
uploadimage
预览图片接口效果图:
previewimage

 

其中上传图片接口返回的是media_id 就是以前上传接口一样的ID,我们可以用个异步提交实现服务器储存!下载图片接口把media_id转化来本地localId,然后也是用JQ方法加入img元素显示出来!
本文章小编来为各位介绍一篇关于php版微信JS-SDK地理位置取街景实例,希望这篇教程能够给各位微信开发者带来帮助。

根据《微信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);
        }
    }

[!--infotagslink--]

相关文章

  • 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 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
  • 414错误是什么 414错误怎么解决

    414错误是HTTP协议状态码中的一种,很多都还不知道414错误是什么,以及不知道怎么解决414错误,那么就来看看小编带来的介绍吧。 414错误是什么: HTTP 414错误,(Requ...2017-01-22
  • http 405错误是什么 http 405错误怎么解决

    http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • http 402错误是什么 http 402简介

    http 402错误是什么?402错误较为少见,一般不轻易出现,下面小编就来告诉大家402错误是什么吧。 HTTP 402错误是HTTP状态码的一种,表示“要求付费”; 所求的...2017-01-22
  • 411错误是什么 411错误怎么解决

    411错误是HTTP协议状态码的一种,很多人都还不知道411错误是什么,本次一聚教程网将为大家进行解答,并且告诉大家411错误怎么解决。 411错误是什么: HTTP 411错误,(Lengt...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • 404错误是什么 404错误怎么解决

    403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限...2017-01-22
  • 403错误是什么 403错误怎么解决

    403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
  • 412错误是什么 412错误怎么解决

    412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • php中登录后跳转回原来要访问的页面实例

    在很多网站用户先访问一个要登录的页面,但当时没有登录后来登录了,等待用户登录成功之后肯定希望返回到上次访问的页面,下面我就来给大家介绍登录后跳转回原来要访问的页...2016-11-25
  • 407错误是什么 407错误怎么解决

    407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
  • 406错误是什么 406错误怎么解决

    HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
  • 410错误是什么 http 410错误怎么解决

    410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
  • HTTP 400错误是什么 HTTP 400错误怎么解决

    每当遇到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的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。 代码如下 复制代码 <?php $discuz_url = &lsquo;ht...2016-11-25
  • PHP Curl出现403错误的解决办法

    自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31