支付宝支付接口(即时到账交易接口)

create_direct_pay_by_user 官方参数API文档地址:

步骤:
  • 1. 按照官方文档,编写此接口所需要的各个参数;
  • 2. 对各参数进行签名处理,生成URL;
  • 3.调用此URL,跳转到支付宝官方扫码支付页面;
  • 4.支付成功后会进行回调通知,通知自己系统已经支付

一.访问参数:



二.回调参数

array(22) {
  ["body"]=>//商品描述
  string(18) "690525226950818654"
  ["buyer_email"]=>
  string(16) "11111@qq.com"
  ["buyer_id"]=>
  string(16) "2222902033926271"
  ["exterface"]=>
  string(25) "create_direct_pay_by_user" //调用的接口
  ["extra_common_param"]=>	
  string(10) "real_order"	//公用回传参数
  ["is_success"]=>
  string(1) "T"  //支付结果
  ["notify_id"]=>
  string(70) "RqPnCoPT3K9%2Fvwbh3InWf0XW8pWwcio6G0Hni8UM0LwgNbG56RwvWoCVp73ob902VflF"
  ["notify_time"]=>
  string(19) "2016-08-23 00:24:34"
  ["notify_type"]=>
  string(17) "trade_status_sync"
  ["out_trade_no"]=>  //自己生成的支付码,pay_SN
  string(18) "690525226950818654"
  ["payment_type"]=>
  string(1) "1"
  ["seller_email"]=>
  string(20) "zhifubao@qq.com"//卖家email
  ["seller_id"]=>
  string(16) "<span class="KSFIND_CLASS_SELECT" id="0KSFindDIV">2088</span>221624104006"//卖家alipay_partner
  ["subject"]=>商品名称
  string(31) "实物订单_690525226950818654"
  ["total_fee"]=>
  string(4) "0.01"//交易金额,单位是元
  ["trade_no"]=>
  string(28) "2016082321001004270244845496",//支付宝生成的
  ["trade_status"]=>
  string(13) "TRADE_SUCCESS"//交易结果
  ["sign"]=>
  string(32) "1e85b163affcaab205767ec8585d64cd"//签名
  ["sign_type"]=>
  string(3) "MD5"
}


记得在自己回调方法的逻辑里添加合法性验证


三. 注意:

1.需要特别提醒的两个参数:

return_url:同步页面回调地址,可以配置HOST在本地调试(扫码成功以后,会在扫码页面 带回调参数跳转回此URL,进行后续操作)
notify_url: 异步回调通知地址,只能在服务器调试 (扫码成功以后,支付宝系统带回调参数异步访问此URL,进行后续操作)

2.回调时记得进行合法性验证(详细代码见下方)


四.相关函数:

1.支付相关
	/**
	 * 取得支付宝签名
	 *
	 * @return string
	 */
	private function sign($parameter) {
		$mysign = "";
		
		$filtered_array	= $this->para_filter($parameter);
		$sort_array = $this->arg_sort($filtered_array);
		$arg = "";
        while (list ($key, $val) = each ($sort_array)) {
			$arg	.= $key."=".$this->charset_encode($val,(empty($parameter['_input_charset'])?"UTF-8":$parameter['_input_charset']),(empty($parameter['_input_charset'])?"UTF-8":$parameter['_input_charset']))."&";
		}
		$prestr = substr($arg,0,-1);  //去掉最后一个&号
		$prestr	.= $parameter['key'];
        if($parameter['sign_type'] == 'MD5') {
			$mysign = md5($prestr);
		}elseif($parameter['sign_type'] =='DSA') {
			//DSA 签名方法待后续开发
			die("DSA 签名方法待后续开发,请先使用MD5签名方式");
		}else {
			die("支付宝暂不支持".$parameter['sign_type']."类型的签名方式");
		}
		return $mysign;
	}

	/**
	 * 除去数组中的空值和签名模式
	 *
	 * @param array $parameter
	 * @return array
	 */
	private function para_filter($parameter) {
		$para = array();
		while (list ($key, $val) = each ($parameter)) {
			if($key == "sign" || $key == "sign_type" || $key == "key" || $val == "")continue;
			else	$para[$key] = $parameter[$key];
		}
		return $para;
	}

	/**
	 * 重新排序参数数组
	 *
	 * @param array $array
	 * @return array
	 */
	private function arg_sort($array) {
		ksort($array);
		reset($array);
		return $array;
	}


	/**
	 * 实现多种字符编码方式
	 */
	private function charset_encode($input,$_output_charset,$_input_charset="UTF-8") {
		$output = "";
		if(!isset($_output_charset))$_output_charset  = $this->parameter['_input_charset'];
		if($_input_charset == $_output_charset || $input == null) {
			$output = $input;
		} elseif (function_exists("mb_convert_encoding")){
			$output = mb_convert_encoding($input,$_output_charset,$_input_charset);
		} elseif(function_exists("iconv")) {
			$output = iconv($_input_charset,$_output_charset,$input);
		} else die("sorry, you have no libs support for charset change.");
		return $output;
	}

  	/**
     * 制作支付接口的请求地址
     *
     * @return string
     */
    private function create_url() {
		$url        = $this->alipay_gateway_new;
		$filtered_array	= $this->para_filter($this->parameter);
		$sort_array = $this->arg_sort($filtered_array);
		$arg        = "";
		while (list ($key, $val) = each ($sort_array)) {
			$arg.=$key."=".urlencode($val)."&";
		}
		$url.= $arg."sign=" .$this->parameter['sign'] ."&sign_type=".$this->parameter['sign_type'];
		return $url;
	}

2.回调相关:

/**
	 * 通知地址验证
	 *
	 * @return bool
	 */
	public function notify_verify() {
		$param	= $_POST;
		$param['key']	= $this->payment['payment_config']['alipay_key'];
		$veryfy_url = $this->alipay_verify_url. "partner=" .$this->payment['payment_config']['alipay_partner']. "¬ify_id=".$param["notify_id"];
		$veryfy_result  = $this->getHttpResponse($veryfy_url);
		$mysign = $this->sign($param);
		if (preg_match("/true$/i",$veryfy_result) && $mysign == $param["sign"])  {
			return true;
		} else {
			return false;
		}
	}


		/**
	 * 远程获取数据
	 * $url 指定URL完整路径地址
	 * @param $time_out 超时时间。默认值:60
	 * return 远程输出的数据
	 */
	private function getHttpResponse($url,$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(CHARSET) == '') {
				fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1\r\n");
			} else {
				fputs($fp, "POST ".$urlarr["path"].'?_input_charset='.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;
		}
	}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值