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

//啥也不说,代码呈上  = =
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);
       }
   }
}
?〉

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值