让SAE支持支付宝“确认发货”接口,完美解决"protocol error"
2012-05-11 01:25
267 查看
这两天一个基于SAE的项目,用到了支付宝的担保交易支付接口。支付接口在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,测试了一个确认发货,果然成功了。
最后,感谢SAE的文峰的热心帮忙。
后来才发现,支付宝接口的“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,测试了一个确认发货,果然成功了。
最后,感谢SAE的文峰的热心帮忙。
相关文章推荐
- 实现支付宝接口时url的构造,主要解决服务器不支持https的问题
- ecshop支付宝发货同步接口-支持多次付款同步发货(转)
- 让Fckeditor支持中文——解决“Error loading "/fckeditor/fckstyles.xml" ”
- 解决方法:访问接口 "SQLNCLI10" 的架构行集 "DBSCHEMA_TABLES_INFO"。该访问接口支持该接口
- 解决.net程序com操作实例化提示"不支持的接口"
- ECSHOP支付宝发货同步接口【支持多次付款同步发
- 让FCKeditor支持中文——解决“Error loading "/fckeditor/fckstyles.xml" ”
- ECSHOP 支付宝发货确认接口,记录支付宝返回的交易号
- 解决方法:访问接口 "SQLNCLI10" 的架构行集 "DBSCHEMA_TABLES_INFO"。该访问接口支持该接口
- 解决"利用Html5的FileRead接口和Formdata上传文件到appweb服务器"报500(internal server error)错误
- win10 当前操作环境不支持支付宝控件 完美解决办法
- QuickCHM2.6出现"不支持此接口" 的两种解决办法(补充)
- 实现支付宝接口时url的构造,主要解决服务器不支持https的问题
- 重启IIS提示"不支持此接口"这个错误,无法正常重启的解决方法
- An internal error occurred during: "Add Deployment"完美解决办法
- ecshop支付宝发货同步接口-支持多次付款同步发货
- ECSHOP使用支付宝担保接口必须的,支付宝发货确认接口
- IE6支持position:fixed完美解决方法
- ios在真机上调试时出现“Error launching remote program: failed to get the task for process xxx"解决办法(转)
- dede让channelartlist标签支持currentstyle属性 完美解决