讓SAE支援支付寶“確認發貨”介面,完美解決"protocol error"

發表於2019-05-11

支付介面在SAE除錯都正常,但是在使用確認發貨的時候,一直報錯“ERROR: 501 - protocol error ”
後來才發現,支付寶介面的“alipay_core.function.php”中的getHttpResponse使用了fsockopen+ssl來做遠端抓取 ,但是SAE沒有開放SSL。不過,支付寶介面的註釋也寫明:“該函式的功能可以用curl來實現和代替。curl需自行編寫。” 

支付寶介面的原始getHttpResponse方法如下:
/**
 * 遠端獲取資料
 * 注意:該函式的功能可以用curl來實現和代替。curl需自行編寫。
 * $url 指定URL完整路徑地址
 * @param $input_charset 編碼格式。預設值:空值
 * @param $time_out 超時時間。預設值:60
 * return 遠端輸出的資料
 */
function getHttpResponse($url, $input_charset = '', $time_out = "60") {
        $urlarr     = parse_url($url);
        $errno      = "";
        $errstr     = "";
        $transports = "";
        $responseText = "";
        if($urlarr["scheme"] == "https") {
                $transports = "ssl://";
                $urlarr["port"] = "443";
        } else {
                $transports = "tcp://";
                $urlarr["port"] = "80";
        }
        $fp=@fsockopen($transports . $urlarr['host'],$urlarr['port'],$errno,$errstr,$time_out);
        if(!$fp) {
                die("ERROR: $errno - $errstr<br />\n");
        } else {
                if (trim($input_charset) == '') {
                        fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1\r\n");
                }
                else {
                        fputs($fp, "POST ".$urlarr["path"].'?_input_charset='.$input_charset." HTTP/1.1\r\n");
                }
                fputs($fp, "Host: ".$urlarr["host"]."\r\n");
                fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
                fputs($fp, "Content-length: ".strlen($urlarr["query"])."\r\n");
                fputs($fp, "Connection: close\r\n\r\n");
                fputs($fp, $urlarr["query"] . "\r\n\r\n");
                while(!feof($fp)) {
                        $responseText .= @fgets($fp, 1024);
                }
                fclose($fp);
                $responseText = trim(stristr($responseText,"\r\n\r\n"),"\r\n");
                
                return $responseText;
        }
}
現在把這個方法修改為:

/**
 * 遠端獲取資料
 * 注意:該函式的功能可以用curl來實現和代替。curl需自行編寫。
 * $url 指定URL完整路徑地址
 * @param $input_charset 編碼格式。預設值:空值
 * @param $time_out 超時時間。預設值:60
 * return 遠端輸出的資料
 */
function getHttpResponse($url, $input_charset = '', $time_out = "60") {

    /* 因SAE 不支援fsockopen + ssl   使用CURL改寫 */
    $ch = curl_init();
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $time_out);
        $responseText = curl_exec($ch);
        curl_close($ch);                
        return $responseText;
}
這樣就可以完美解決“ERROR: 501 - protocol error”的問題了。使用支付寶介面提供的Demo,測試了一個確認發貨,果然成功了。
評論(1)

相關文章