php接入支付宝sdk遇到的若干问题
近期有口碑营销活动的需求,需要接入支付宝sdk,感觉支付宝的sdk对php的支持不是太好,遇到了不少的问题,例如验签出错,图片上传接口无法上传图片等。
首先要确定你的php的环境,现在php要求版本5.5以上,还有php要开启curl和open_ssl扩展,这些网上有许多的教程,但是图片上传这个接口网上没有找到合适的解决方法,折腾了将近一个星期,最终在蚂蚁开放平台的工作人员的支持下把问题解决了。
先说说具体的问题,请求支付宝其他接口时都能请求成功,返回正常的数据,但是只有这个图片上传接口总是报验签出错,然后打印了生成签名的字符串和报错返回的字符串,发现生成签名的字符串和返回的字符串有所不同,如下图所示:
同样的代码在蚂蚁开放平台的工作人员哪里可以正常上传,然后我就检查我的环境是否有问题,还装了好几个环境,时间都浪费在这里了,检查了环境都一切正常,那就打开官方的sdk源码看看吧,找到了请求支付宝服务器的代码,运用的curl请求,没什么好办法,只能一步步打印数据看哪里出了问题,前面都没有什么问题,那看来问题是出在sdk这个向支付宝服务器请求的方法中了,方法如下:
protected function curl($url, $postFields = null) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$postBodyString = "";
$encodeArray = Array();
$postMultipart = false;
if (is_array($postFields) && 0 < count($postFields)) {
foreach ($postFields as $k => $v) {
if ("@" != substr($v, 0, 1)) //判断是不是文件上传
{
$postBodyString .= "$k=" . urlencode($this->characet($v, $this->postCharset)) . "&";
$encodeArray[$k] = $this->characet($v, $this->postCharset);
} else //文件上传用multipart/form-data,否则用www-form-urlencoded
{
$postMultipart = true;
$encodeArray[$k] = new \CURLFile(substr($v, 1));
}
}
var_dump($encodeArray);
unset ($k, $v);
curl_setopt($ch, CURLOPT_POST, true);
if ($postMultipart) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $encodeArray);
} else {
curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString, 0, -1));
}
}
if ($postMultipart) {
$headers = array('content-type: multipart/form-data;charset=' . $this->postCharset . ';boundary=' . $this->getMillisecond());
} else {
$headers = array('content-type: application/x-www-form-urlencoded;charset=' . $this->postCharset);
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$reponse = curl_exec($ch);
if (curl_errno($ch)) {
throw new Exception(curl_error($ch), 0);
} else {
$httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (200 !== $httpStatusCode) {
throw new Exception($reponse, $httpStatusCode);
}
}
curl_close($ch);
return $reponse;
}
看到这里设置了请求的url,图片信息是通过post方式传输,设置请求头等信息,这一部分只能通过php的官方文档看看会有什么问题,看到了CURLOPT_POSTFIELDS这个字段的描述
然后觉得在设置一次头信息会不会有什么问题,然后就把设置请求头信息的代码注释了去请求,发现居然可以正常上传了。
//注释掉了这一段
if ($postMultipart) {
$headers = array('content-type: multipart/form-data;charset=' . $this->postCharset . ';boundary=' . $this->getMillisecond());
} else {
$headers = array('content-type: application/x-www-form-urlencoded;charset=' . $this->postCharset);
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
请求成功的返回值:
虽然成功了,但是还是有一个问题不理解,为什么蚂蚁开放平台的工作人员用之前没有注释的代码也能正常上传,有没有大佬在来解答一下
上一篇: 使用ruby备份你的blog