您的位置:首页 > 编程语言 > PHP开发

PHP调用支付宝接口(源码)

2014-03-21 15:26 423 查看
//啥也不说,代码呈上  = =
servers.php
〈?php
/**
* 生成向支付宝发送付款请求的联接
*

*/
class Alipay_Service {
/**
* 生成的请求URL
*
* @var string
*/
public $url = ”;
/**
*接口的所有参数入口
*
* @var array
*/
private $_parameter = array();
/**
*构造函数,实例化一个支付宝付款请求服务
*
* @param array $parameter
*/
public function __construct(array $parameter) {
if (is_array($parameter)) {
$this-〉_parameter = $parameter;
$this-〉_createUrl();
} else {
throw new Exception(’Parameter Error’);
}
}
/**
* 构造一个请求的URL。
*
* @return string
*/
private function _createUrl() {
if ($this-〉_parameter["sign_type"] === ‘MD5′) {
$parameter = $this-〉_getVal();
$url_val = ”;
foreach ($parameter as $key =〉 $value) {
if (strlen($value) !== 0) {
$url_val .= $key .’=’.urlencode($this-〉_charDecode($value)).’&’;
}
}
$this-〉url = $this-〉_parameter["gateway"].’?’.$url_val.’sign=’.md5($this-〉_sortVal().$this-〉_parameter["security_code"]).’&sign_type=MD5′;
} else {
throw new Exception(’系统暂时不支持’.$this-〉_parameter["sign_type"].’加密方式’);
}
}
/**
*此函数生成参数数组,将需要的参数包含进一个数组里,固定请求URL的参数
*
* @return array
*/
private function _getVal() {
return array(’subject’        =〉 $this-〉_parameter["parameter"]["subject"],
’service’        =〉 $this-〉_parameter["parameter"]["service"],
‘partner’        =〉 $this-〉_parameter["partner"],
‘notify_url’     =〉 $this-〉_parameter["notify_url"],
‘return_url’     =〉 $this-〉_parameter["return_url"],
‘_input_charset’ =〉 $this-〉_parameter["_input_charset"],
‘out_trade_no’   =〉 $this-〉_parameter["parameter"]["out_trade_no"],
‘total_fee’      =〉 sprintf(’%0.2f’, $this-〉_parameter["parameter"]["total_fee"]),
‘quantity’       =〉 $this-〉_parameter["parameter"]["quantity"],
‘payment_type’   =〉 $this-〉_parameter["parameter"]["payment_type"],
‘logistics_type’ =〉 $this-〉_parameter["parameter"]["logistics_type"],
‘logistics_fee’  =〉 $this-〉_parameter["parameter"]["logistics_fee"],
’seller_email’   =〉 $this-〉_parameter["seller_email"]);
}
/**
* 返回一个URL的参数部分,例如:aaa=111&bbb=222&ccc=3333
*
* @return string
*/
private function _sortVal() {
$parameter = $this-〉_getVal();
//对参数数组排序,并且把数组指针调回数组开头
ksort($parameter);
reset($parameter);
$url_var = ”;
foreach ($parameter as $key =〉 $value) {
if (strlen($value) !== 0) {
$url_var .= ‘&’.$key .’=’.$this-〉_charDecode($value);
}
}
return $url_var = substr($url_var, 1);
}
/**
* 将字符串编码成UTF-8。
*
* @param string $var
* @param string $charset
* @return string
*/
private function _charDecode($var, $charset = ‘UTF-8′) {
if (strtoupper($this-〉_parameter["_input_charset"]) === $charset || strlen($var) == 0) {
return $var;
} else {
return mb_convert_encoding($value, $charset, $this-〉_parameter["_input_charset"]);
}
}
}?〉

notify.php
〈?php
class Alipay_Notify {
/**
* 确认通知的url
*
* @var string
*/
private $_url = ”;
/**
* 接收支付宝外部通知参数
*
* @var array
*/
private $_postvar = array();
/**
* 接收支付宝返回通知的参数
*
* @var array
*/
private $_getvar = array();
/**
* 接收到的字符编码
*
* @var string
*/
private $_charset;
/**
* 参数设置
*
* @var array
*/
private $_parameter = array();
/**
*初始设置
*
* @param array $var
*/
public function __construct(array $var) {
if (is_array($var)) {
$this-〉_parameter = $var;
if ($_SERVER["REQUEST_METHOD"] == ‘POST’) {
$this-〉_postvar = $_POST;
if (isset($_POST["_input_charset"])) {
$this-〉_charset = $_POST["_input_charset"];
} else {
$this-〉_charset = ‘UTF-8′;
}
} else {
$this-〉_getvar = $_GET;
if (isset($_GET["_input_charset"])) {
$this-〉_charset = $_GET["_input_charset"];
} else {
$this-〉_charset = ‘UTF-8′;
}
}
} else {
throw new Exception(’Parameter Error’);
}
}
/**
*发回支付宝确认信息是支付宝发的。
*本文转载
* @return string
*/
private function getVerify() {
$urlarr = parse_url($this-〉_url);
$time_out = ‘60′;
$errno = ”;
$errstr = ”;
$transports = ‘tcp://’;
$urlarr["port"] = ‘80′;
$fp = fsockopen($transports . $urlarr["host"], $urlarr["port"], $errno, $errstr, $time_out);
if ($fp) {
fputs($fp, “POST “.$urlarr["path"].” 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)) {
$info[] = fgets($fp, 1024);
}
fclose($fp);
$info = implode(’,", $info);
//$this-〉_writeLog(’return_url_log:’.$this-〉_url);
//$this-〉_writeLog(’return_word_log:’.$info);
return $info;
} else {
$this-〉_writeLog(’return_word_log:’.$errno.’-’.$errstr);
}
}
/**
* 向支付宝验证外部通知的合法性。
*本文转载
* @return bool
*/
public function notifyVerify() {
$this-〉_url = $this-〉_parameter["notifyway"].’?service=notify_verify¬ify_id=’.$this-〉_postvar["notify_id"].’&partner=’.$this-〉_parameter["partner"];
$vail_result = $this-〉getVerify();
$urlvar = $this-〉sortArr($this-〉_postvar);
return  (eregi(”true$”, $vail_result) && strtoupper($this-〉_postvar["sign"]) == strtoupper(md5($urlvar.$this-〉_parameter["security_code"])));
}
/**
* 向支付宝验证跳转参数的合法性。
*本文转载
* @return bool
*/
public function returnVerify() {
$this-〉_url = $this-〉_parameter["notifyway"].’?service=notify_verify¬ify_id=’.$this-〉_getvar["notify_id"].’&partner=’.$this-〉_parameter["partner"];
$vail_result= $this-〉getVerify();
$urlvar = $this-〉sortArr($this-〉_getvar);
return  (eregi(”true$”, $vail_result) && strtoupper($this-〉_getvar["sign"]) == strtoupper(md5($urlvar.$this-〉_parameter["security_code"])));
}
/**
* 由数组生成加密字符串。
*
* @param array $var
* @return string
*/
private function sortArr(array $var) {
$urlvar = ”;
ksort($var);
reset($var);
foreach ($var as $key =〉 $value) {
if (strlen($value) != 0 && $key != ’sign’ && $key != ’sign_type’ && $key != ‘action’ && $key != ‘controller’) {
$urlvar .= ‘&’.$key.’=’.$value;
}
}
return $urlvar = substr($urlvar, 1);
}
/**
*写系统支付操作日志
*
* @param string $var
*/
private function _writeLog($var, $logpath = ROOT_DIR) {
$fp = fopen($logpath.’\log\alipay_log.txt’,"a’);
flock($fp, LOCK_EX) ;
fwrite($fp,$var.’:执行日期:’.strftime(’%Y%m%d%H%I%S’,time()).”\t\n”);
flock($fp, LOCK_UN);
fclose($fp);
}
/**
* 将字符串解码码成指定格式。
*
* @param string $var
* @return string
*/
private function _charDecode($var) {
if (strtoupper($this-〉_parameter["_input_charset"]) == strtoupper($this-〉_charset) || strlen($var) == 0) {
return $var;
} else {
return mb_convert_encoding($value, $this-〉_parameter["_input_charset"], $this-〉_charset);
}
}
}
?〉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 支付