thinkphp3.2.3-支付寶接口即時到帳、批量付款_待整理

 

如下是即時到帳的接口整合thinkphp3.2.3 不過一樣適合批量付款接口php

這裏對如下長長的論文總結html

一、下載到支付寶接口源碼-複製 alipay_core.function.php、alipay_md5.function.php、alipay_notify.class.php、alipay_submit.class.php 這四個文件重命名並複製到ThinkPHP/Library/Vendor/Batchpay(本身建立的文件夾)mysql

二、新建控制器用vendor加載類文件web

三、去除對應的require_oncesql

四、notify_url.php alipayapi.php 這兩個文件封裝成兩個方法。thinkphp

 

===============無情的分割線================數據庫

thinkphp3.2.3 成功對接支付寶接口,thinkphp小巧開源的一款框架 博主仍是比較看好了 今天須要作個項目 看了下 官方的一些文檔 對3.2的支付寶的教程
首先登錄支付寶集成接口的地址 下載你須要的文檔 
https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1


ok下載下來文檔 壓縮包內 2個文件夾
分別是
MD5簽名版本和 RSA簽名版本 
本人愚見 web開發用 md5 app 選擇RSA簽名 因此咱們選擇 md5簽名版本
api

  1. 相對於之前 asp 已被成功的拋棄!哈哈哈哈哈 選擇本身的程序 和對應的編碼 
  2. 我是用的create_direct_pay_by_user-PHP-UTF-8 文件夾下的 
  3. ok 下一步 找到你的項目的 ThinkPHP\Library\Vendor\ 下 打開 
  4. 新建立文件夾 Alipay 注意大小寫 
  5. 而後 [code]alipay_core.function.php重命名爲:Corefunction.php;
  6. alipay_md5.function.php重命名爲:Md5function.php;
  7. alipay_notify.class.php重命名爲:Notify.php;
  8. alipay_submit.class.php重命名爲:Submit.php;
  9. //而後,打開Submit.php文件,把如下代碼去掉;
  10. require_once("alipay_core.function.php");
  11. require_once("alipay_md5.function.php");
  12. //一樣,打開Notify.php文件,把如下兩段代碼去掉
  13. require_once("alipay_core.function.php");
  14. require_once("alipay_md5.function.php");

複製代碼數組

一、在配置文件中Conf/Config.php文件中對支付寶相關參數進行配置:代碼以下服務器

  1.  //支付寶配置參數
  2.  'alipay_config'=>array(
  3.        'partner' =>'20********50',   //這裏是你在成功申請支付寶接口後獲取到的PID;
  4.     'key'=>'9t***********ie',//這裏是你在成功申請支付寶接口後獲取到的Key
  5.     'sign_type'=>strtoupper('MD5'),
  6.     'input_charset'=> strtolower('utf-8'),
  7.     'cacert'=> getcwd().'\\cacert.pem',
  8.     'transport'=> 'http',
  9.       ),
  10.      //以上配置項,是從接口包中alipay.config.php 文件中複製過來,進行配置;
  11.     
  12.  'alipay'   =>array(
  13.  //這裏是賣家的支付寶帳號,也就是你申請接口時註冊的支付寶帳號
  14.  'seller_email'=>'pay@xxx.com',
  15.  //這裏是異步通知頁面url,提交到項目的Pay控制器的notifyurl方法;
  16.  'notify_url'=>'http://www.liuyuyao.com/Pay/notifyurl', 
  17.  //這裏是頁面跳轉通知url,提交到項目的Pay控制器的returnurl方法;
  18.  'return_url'=>'http://www.liuyuyao.com/Pay/returnurl',
  19.  //支付成功跳轉到的頁面,我這裏跳轉到項目的User控制器,myorder方法,並傳參payed(已支付列表)
  20.  'successpage'=>'User/myorder?ordtype=payed',   
  21.  //支付失敗跳轉到的頁面,我這裏跳轉到項目的User控制器,myorder方法,並傳參unpay(未支付列表)
  22.  'errorpage'=>'User/myorder?ordtype=unpay', 
  23.  ),

複製代碼

二、新建一個PayController代碼以下:位置是你的項目的Controller 下 不懂的本身去看手冊 
代碼以下

  1. <?php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4.  
  5. class PayController extends Controller {
  6.       //在類初始化方法中,引入相關類庫    
  7.        public function _initialize() {
  8.         vendor('Alipay.Corefunction');
  9.         vendor('Alipay.Md5function');
  10.         vendor('Alipay.Notify');
  11.         vendor('Alipay.Submit');
  12.      
  13.     }
  14.     
  15.     //doalipay方法
  16.         /*該方法其實就是將接口文件包下alipayapi.php的內容複製過來
  17.           而後進行相關處理
  18.         */
  19.     public function doalipay(){
  20.         
  21.        /*********************************************************
  22.             把alipayapi.php中複製過來的以下兩段代碼去掉,
  23.             第一段是引入配置項,
  24.             第二段是引入submit.class.php這個類。
  25.            爲何要去掉??
  26.             第一,配置項的內容已經在項目的Config.php文件中進行了配置,咱們只需用C函數進行調用便可;
  27.             第二,這裏調用的submit.class.php類庫咱們已經在PayAction的_initialize()中已經引入;因此這裏再也不須要;
  28.             *****************************************************/
  29.        // require_once("alipay.config.php");
  30.        // require_once("lib/alipay_submit.class.php");
  31.        
  32.        //這裏咱們經過TP的C函數把配置項參數讀出,賦給$alipay_config;
  33.        $alipay_config=C('alipay_config');  
  34.  
  35.         /**************************請求參數**************************/
  36.         $payment_type = "1"; //支付類型 //必填,不能修改
  37.         $notify_url = C('alipay.notify_url'); //服務器異步通知頁面路徑
  38.         $return_url = C('alipay.return_url'); //頁面跳轉同步通知頁面路徑
  39.         $seller_email = C('alipay.seller_email');//賣家支付寶賬戶必填
  40.         $out_trade_no = $_POST['trade_no'];//商戶訂單號 經過支付頁面的表單進行傳遞,注意要惟一!
  41.         $subject = $_POST['ordsubject'];  //訂單名稱 //必填 經過支付頁面的表單進行傳遞
  42.         $total_fee = $_POST['ordtotal_fee'];   //付款金額  //必填 經過支付頁面的表單進行傳遞
  43.         $body = $_POST['ordbody'];  //訂單描述 經過支付頁面的表單進行傳遞
  44.         $show_url = $_POST['ordshow_url'];  //商品展現地址 經過支付頁面的表單進行傳遞
  45.         $anti_phishing_key = "";//防釣魚時間戳 //若要使用請調用類文件submit中的query_timestamp函數
  46.         $exter_invoke_ip = get_client_ip(); //客戶端的IP地址 
  47.         /************************************************************/
  48.     
  49.         //構造要請求的參數數組,無需改動
  50.     $parameter = array(
  51.         "service" => "create_direct_pay_by_user",
  52.         "partner" => trim($alipay_config['partner']),
  53.         "payment_type"    => $payment_type,
  54.         "notify_url"    => $notify_url,
  55.         "return_url"    => $return_url,
  56.         "seller_email"    => $seller_email,
  57.         "out_trade_no"    => $out_trade_no,
  58.         "subject"    => $subject,
  59.         "total_fee"    => $total_fee,
  60.         "body"            => $body,
  61.         "show_url"    => $show_url,
  62.         "anti_phishing_key"    => $anti_phishing_key,
  63.         "exter_invoke_ip"    => $exter_invoke_ip,
  64.         "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
  65.         );
  66.         //創建請求
  67.         $alipaySubmit = new \ AlipaySubmit($alipay_config);
  68.         $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "確認");
  69.         echo $html_text;
  70.     }
  71.     
  72.         /******************************
  73.         服務器異步通知頁面方法
  74.         其實這裏就是將notify_url.php文件中的代碼複製過來進行處理
  75.         
  76.         *******************************/
  77.     function notifyurl(){
  78.                 /*
  79.                 同理去掉如下兩句代碼;
  80.                 */ 
  81.                 //require_once("alipay.config.php");
  82.                 //require_once("lib/alipay_notify.class.php");
  83.                 
  84.                 //這裏仍是經過C函數來讀取配置項,賦值給$alipay_config
  85.         $alipay_config=C('alipay_config');
  86.         //計算得出通知驗證結果
  87.         $alipayNotify = new  \  AlipayNotify($alipay_config);
  88.         $verify_result = $alipayNotify->verifyNotify();
  89.         if($verify_result) {
  90.                //驗證成功
  91.                    //獲取支付寶的通知返回參數,可參考技術文檔中服務器異步通知參數列表
  92.            $out_trade_no   = $_POST['out_trade_no'];      //商戶訂單號
  93.            $trade_no       = $_POST['trade_no'];          //支付寶交易號
  94.            $trade_status   = $_POST['trade_status'];      //交易狀態
  95.            $total_fee      = $_POST['total_fee'];         //交易金額
  96.            $notify_id      = $_POST['notify_id'];         //通知校驗ID。
  97.            $notify_time    = $_POST['notify_time'];       //通知的發送時間。格式爲yyyy-MM-dd HH:mm:ss。
  98.            $buyer_email    = $_POST['buyer_email'];       //買家支付寶賬號;
  99.                    $parameter = array(
  100.              "out_trade_no"     => $out_trade_no, //商戶訂單編號;
  101.              "trade_no"     => $trade_no,     //支付寶交易號;
  102.              "total_fee"     => $total_fee,    //交易金額;
  103.              "trade_status"     => $trade_status, //交易狀態
  104.              "notify_id"     => $notify_id,    //通知校驗ID。
  105.              "notify_time"   => $notify_time,  //通知的發送時間。
  106.              "buyer_email"   => $buyer_email,  //買家支付寶賬號;
  107.            );
  108.            if($_POST['trade_status'] == 'TRADE_FINISHED') {
  109.                        //
  110.            }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {                           if(!checkorderstatus($out_trade_no)){
  111.                orderhandle($parameter); 
  112.                            //進行訂單處理,並傳送從支付寶返回的參數;
  113.                }
  114.             }
  115.                 echo "success";        //請不要修改或刪除
  116.          }else {
  117.                 //驗證失敗
  118.                 echo "fail";
  119.         }    
  120.     }
  121.     
  122.     /*
  123.         頁面跳轉處理方法;
  124.         這裏其實就是將return_url.php這個文件中的代碼複製過來,進行處理; 
  125.         */
  126.     function returnurl(){
  127.                 //頭部的處理跟上面兩個方法同樣,這裏不羅嗦了!
  128.         $alipay_config=C('alipay_config');
  129.         $alipayNotify = new  \ AlipayNotify($alipay_config);//計算得出通知驗證結果
  130.         $verify_result = $alipayNotify->verifyReturn();
  131.         if($verify_result) {
  132.             //驗證成功
  133.             //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表
  134.         $out_trade_no   = $_GET['out_trade_no'];      //商戶訂單號
  135.         $trade_no       = $_GET['trade_no'];          //支付寶交易號
  136.         $trade_status   = $_GET['trade_status'];      //交易狀態
  137.         $total_fee      = $_GET['total_fee'];         //交易金額
  138.         $notify_id      = $_GET['notify_id'];         //通知校驗ID。
  139.         $notify_time    = $_GET['notify_time'];       //通知的發送時間。
  140.         $buyer_email    = $_GET['buyer_email'];       //買家支付寶賬號;
  141.             
  142.         $parameter = array(
  143.             "out_trade_no"     => $out_trade_no,      //商戶訂單編號;
  144.             "trade_no"     => $trade_no,          //支付寶交易號;
  145.             "total_fee"      => $total_fee,         //交易金額;
  146.             "trade_status"     => $trade_status,      //交易狀態
  147.             "notify_id"      => $notify_id,         //通知校驗ID。
  148.             "notify_time"    => $notify_time,       //通知的發送時間。
  149.             "buyer_email"    => $buyer_email,       //買家支付寶賬號
  150.         );
  151.         
  152.  if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
  153.         if(!checkorderstatus($out_trade_no)){
  154.              orderhandle($parameter);  //進行訂單處理,並傳送從支付寶返回的參數;
  155.     }
  156.         $this->redirect(C('alipay.successpage'));//跳轉到配置項中配置的支付成功頁面;
  157.     }else {
  158.         echo "trade_status=".$_GET['trade_status'];
  159.         $this->redirect(C('alipay.errorpage'));//跳轉到配置項中配置的支付失敗頁面;
  160.     }
  161.  }else {
  162.     //驗證失敗
  163.     //如要調試,請看alipay_notify.php頁面的verifyReturn函數
  164.     echo "支付失敗!";
  165.     }
  166.  }
  167.  }
  168.  ?>
  169.      
  170.      
  171.      
  172.     }

複製代碼

這兒說下 有不少朋友Class 'Home\Controller\AlipaySubmit' not found 發生過如下的錯誤
執行new方法實例化的時候就報錯
Class 'Home\Controller\Alipay' not found
其實這樣的 須要在你的 $alipaySubmit = new AlipaySubmit($alipay_config); 等等 new 後面加一個 / 
三、這裏有幾個支付處理過程當中須要用到的函數,我把這些函數寫到了項目的Common/common.php中沒有的本身建立 固然你也開業寫到其餘位置

  1. <? 
  2.  
  3. //在線交易訂單支付處理函數
  4.  //函數功能:根據支付接口傳回的數據判斷該訂單是否已經支付成功;
  5.  //返回值:若是訂單已經成功支付,返回true,不然返回false;
  6.  function checkorderstatus($ordid){
  7.     $Ord=M('Orderlist');
  8.     $ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus');
  9.     if($ordstatus==1){
  10.         return true;
  11.     }else{
  12.         return false;    
  13.     }
  14.  }
  15.  //處理訂單函數
  16.  //更新訂單狀態,寫入訂單支付後返回的數據
  17.  function orderhandle($parameter){
  18.     $ordid=$parameter['out_trade_no'];
  19.     $data['payment_trade_no']      =$parameter['trade_no'];
  20.     $data['payment_trade_status']  =$parameter['trade_status'];
  21.     $data['payment_notify_id']     =$parameter['notify_id'];
  22.     $data['payment_notify_time']   =$parameter['notify_time'];
  23.     $data['payment_buyer_email']   =$parameter['buyer_email'];
  24.     $data['ordstatus']             =1;
  25.     $Ord=M('Orderlist');
  26.     $Ord->where('ordid='.$ordid)->save($data);
  27.  } 
  28.  /*-----------------------------------
  29. 2013.8.13更正
  30. 下面這個函數,其實不須要,你們能夠把他刪掉,
  31. 具體看我下面的修正補充部分的說明
  32. ------------------------------------*/
  33.  //獲取一個隨機且惟一的訂單號;
  34.  function getordcode(){
  35.     $Ord=M('Orderlist');
  36.     $numbers = range (10,99);
  37.     shuffle ($numbers); 
  38.     $code=array_slice($numbers,0,4); 
  39.     $ordcode=$code[0].$code[1].$code[2].$code[3];
  40.     $oldcode=$Ord->where("ordcode='".$ordcode."'")->getField('ordcode');
  41.     if($oldcode){
  42.         getordcode();
  43.     }else{
  44.         return $ordcode;
  45.     }
  46.  }

複製代碼

訪問 Pay下的doalipay 彈出支付錯誤 這樣基本沒有問題了 
由於你的 config裏面的簽約的一些信息沒有正確配置 須要本身申請配置之後 

還差一個訂單記錄的數據庫 
打開你的mysql 運行 sql 記得修改數據庫前綴

  1. CREATE TABLE `liuyuao_orderlist` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `userid` int(11) DEFAULT NULL,
  4.   `username` varchar(255) DEFAULT NULL,
  5.   `ordid` varchar(255) DEFAULT NULL,
  6.   `ordtime` int(11) DEFAULT NULL,
  7.   `productid` int(11) DEFAULT NULL,
  8.   `ordtitle` varchar(255) DEFAULT NULL,
  9.   `ordbuynum` int(11) DEFAULT '0',
  10.   `ordprice` float(10,2) DEFAULT '0.00',
  11.   `ordfee` float(10,2) DEFAULT '0.00',
  12.   `ordstatus` int(11) DEFAULT '0',
  13.   `payment_type` varchar(255) DEFAULT NULL,
  14.   `payment_trade_no` varchar(255) DEFAULT NULL,
  15.   `payment_trade_status` varchar(255) DEFAULT NULL,
  16.   `payment_notify_id` varchar(255) DEFAULT NULL,
  17.   `payment_notify_time` varchar(255) DEFAULT NULL,
  18.   `payment_buyer_email` varchar(255) DEFAULT NULL,
  19.   `ordcode` varchar(255) DEFAULT NULL,        
  20.   `isused` int(11) DEFAULT '0',
  21.   `usetime` int(11) DEFAULT NULL,
  22.   `checkuser` int(11) DEFAULT NULL,
  23.   PRIMARY KEY (`id`)

文章來源於: http://www.thinkphp.cn/topic/39616.html 

相關文章
相關標籤/搜索