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

create_direct_pay_by_user 官方参数API文档地址:

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.dsNjYY&treeId=108&articleId=104743&docType=1

 

步骤:

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

 

一.访问参数:

 

二.回调参数

 

[php] view plain copy

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

 

 

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


三. 注意:

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

 

return_url:同步页面回调地址,可以配置HOST在本地调试(扫码成功以后,会在扫码页面带回调参数跳转回此URL,进行后续操作)

notify_url: 异步回调通知地址,只能在服务器调试(扫码成功以后,支付宝系统带回调参数异步访问此URL,进行后续操作)

 

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

 

 

四.相关函数:

 

1.支付相关

[php] view plain copy

  1. /** 
  2.  * 取得支付宝签名 
  3.  * 
  4.  * @return string 
  5.  */  
  6. private function sign($parameter) {  
  7.     $mysign = "";  
  8.       
  9.     $filtered_array = $this->para_filter($parameter);  
  10.     $sort_array = $this->arg_sort($filtered_array);  
  11.     $arg = "";  
  12.        while (list ($key$val) = each ($sort_array)) {  
  13.         $arg    .= $key."=".$this->charset_encode($val,(empty($parameter['_input_charset'])?"UTF-8":$parameter['_input_charset']),(empty($parameter['_input_charset'])?"UTF-8":$parameter['_input_charset']))."&";  
  14.     }  
  15.     $prestr = substr($arg,0,-1);  //去掉最后一个&号  
  16.     $prestr .= $parameter['key'];  
  17.        if($parameter['sign_type'] == 'MD5') {  
  18.         $mysign = md5($prestr);  
  19.     }elseif($parameter['sign_type'] =='DSA') {  
  20.         //DSA 签名方法待后续开发  
  21.         die("DSA 签名方法待后续开发,请先使用MD5签名方式");  
  22.     }else {  
  23.         die("支付宝暂不支持".$parameter['sign_type']."类型的签名方式");  
  24.     }  
  25.     return $mysign;  
  26. }  
  27.   
  28. /** 
  29.  * 除去数组中的空值和签名模式 
  30.  * 
  31.  * @param array $parameter 
  32.  * @return array 
  33.  */  
  34. private function para_filter($parameter) {  
  35.     $para = array();  
  36.     while (list ($key$val) = each ($parameter)) {  
  37.         if($key == "sign" || $key == "sign_type" || $key == "key" || $val == "")continue;  
  38.         else    $para[$key] = $parameter[$key];  
  39.     }  
  40.     return $para;  
  41. }  
  42.   
  43. /** 
  44.  * 重新排序参数数组 
  45.  * 
  46.  * @param array $array 
  47.  * @return array 
  48.  */  
  49. private function arg_sort($array) {  
  50.     ksort($array);  
  51.     reset($array);  
  52.     return $array;  
  53. }  
  54.   
  55.   
  56. /** 
  57.  * 实现多种字符编码方式 
  58.  */  
  59. private function charset_encode($input,$_output_charset,$_input_charset="UTF-8") {  
  60.     $output = "";  
  61.     if(!isset($_output_charset))$_output_charset  = $this->parameter['_input_charset'];  
  62.     if($_input_charset == $_output_charset || $input == null) {  
  63.         $output = $input;  
  64.     } elseif (function_exists("mb_convert_encoding")){  
  65.         $output = mb_convert_encoding($input,$_output_charset,$_input_charset);  
  66.     } elseif(function_exists("iconv")) {  
  67.         $output = iconv($_input_charset,$_output_charset,$input);  
  68.     } else die("sorry, you have no libs support for charset change.");  
  69.     return $output;  
  70. }  
  71.   
  72.     /** 
  73.     * 制作支付接口的请求地址 
  74.     * 
  75.     * @return string 
  76.     */  
  77.    private function create_url() {  
  78.     $url        = $this->alipay_gateway_new;  
  79.     $filtered_array = $this->para_filter($this->parameter);  
  80.     $sort_array = $this->arg_sort($filtered_array);  
  81.     $arg        = "";  
  82.     while (list ($key$val) = each ($sort_array)) {  
  83.         $arg.=$key."=".urlencode($val)."&";  
  84.     }  
  85.     $url.= $arg."sign=" .$this->parameter['sign'] ."&sign_type=".$this->parameter['sign_type'];  
  86.     return $url;  
  87. }  

2.回调相关:

 

[php] view plain copy

  1. /** 
  2.      * 通知地址验证 
  3.      * 
  4.      * @return bool 
  5.      */  
  6.     public function notify_verify() {  
  7.         $param  = $_POST;  
  8.         $param['key']   = $this->payment['payment_config']['alipay_key'];  
  9.         $veryfy_url = $this->alipay_verify_url. "partner=" .$this->payment['payment_config']['alipay_partner']. "¬ify_id=".$param["notify_id"];  
  10.         $veryfy_result  = $this->getHttpResponse($veryfy_url);  
  11.         $mysign = $this->sign($param);  
  12.         if (preg_match("/true$/i",$veryfy_result) && $mysign == $param["sign"])  {  
  13.             return true;  
  14.         } else {  
  15.             return false;  
  16.         }  
  17.     }  
  18.   
  19.   
  20.         /** 
  21.      * 远程获取数据 
  22.      * $url 指定URL完整路径地址 
  23.      * @param $time_out 超时时间。默认值:60 
  24.      * return 远程输出的数据 
  25.      */  
  26.     private function getHttpResponse($url,$time_out = "60") {  
  27.         $urlarr     = parse_url($url);  
  28.         $errno      = "";  
  29.         $errstr     = "";  
  30.         $transports = "";  
  31.         $responseText = "";  
  32.         if($urlarr["scheme"] == "https") {  
  33.             $transports = "ssl://";  
  34.             $urlarr["port"] = "443";  
  35.         } else {  
  36.             $transports = "tcp://";  
  37.             $urlarr["port"] = "80";  
  38.         }  
  39.         $fp=@fsockopen($transports . $urlarr['host'],$urlarr['port'],$errno,$errstr,$time_out);  
  40.         if(!$fp) {  
  41.             die("ERROR: $errno - $errstr<br />\n");  
  42.         } else {  
  43.             if (trim(CHARSET) == '') {  
  44.                 fputs($fp"POST ".$urlarr["path"]." HTTP/1.1\r\n");  
  45.             } else {  
  46.                 fputs($fp"POST ".$urlarr["path"].'?_input_charset='.CHARSET." HTTP/1.1\r\n");  
  47.             }  
  48.             fputs($fp"Host: ".$urlarr["host"]."\r\n");  
  49.             fputs($fp"Content-type: application/x-www-form-urlencoded\r\n");  
  50.             fputs($fp"Content-length: ".strlen($urlarr["query"])."\r\n");  
  51.             fputs($fp"Connection: close\r\n\r\n");  
  52.             fputs($fp$urlarr["query"] . "\r\n\r\n");  
  53.             while(!feof($fp)) {  
  54.                 $responseText .= @fgets($fp, 1024);  
  55.             }  
  56.             fclose($fp);  
  57.             $responseText = trim(stristr($responseText,"\r\n\r\n"),"\r\n");  
  58.             return $responseText;  
  59.         }  
  60.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值