對接支付寶支付接口_tp5

 
參考文檔:
  1. TP5實現支付寶電腦網站支付學習筆記https://blog.csdn.net/weixin_34199335/article/details/88628841
  2. 支付寶手機網站支付passback_params傳遞數組https://www.jianshu.com/p/14c46838e567
  3. 支付寶接口:系統有點忙,一會再試試https://blog.csdn.net/qq2942713658/article/details/84965512
  4. 支付寶的異步回調裏面沒法獲取session裏面的值爲何(經過sessionid也不可)https://ask.csdn.net/questions/766442
  5. 使用urlencode(json_encode($arr));var_export能夠將一個數組轉爲一個字符串不一樣於var_dump,var_export並不會輸出數據的類型以及字符大小等,只會簡單把數組的key跟value拼接成一個字符串
 
遇到的問題:
  2019/09/14
  1. 沙箱測試 私鑰公鑰啥的(B站視頻講解
  2019/09/15
  1. 解決調不出收銀臺問題(金融傳值多了個元
  2. 不能帳號密碼登陸(當前頁面框架內打開因此不能
  2019/09/16
  1. passback_param參數使用出錯(urlencode(json_encode($arr)); 及異步接收時處理 json_decode(urldecode($arr));
  2. 只能付88的點別的付不了款(本身好了
  3. 產品切換快出現金額不改變,會形成少付(點擊確認支付後根據所選產品再次查詢其金額
  4. passback_param參數超過規定限制(傳點必須的
  2019/09/20
  1. 支付寶異步回調函數中操做session(異步回調屬於阿里請求,沒法獲取你存儲的session;只能你本地判斷若是回調處理了你的業務,而後本身調用更新session,能夠考慮用攔截器 緩存實現)
  2. 經過passback_param將sessionID傳回異步也是沒法獲取對應session(正常狀況好用
  2019/09/21
  1. 支付寶換爲正式應用出現支付異常(AppId未換成正式應用的
  2. 支付寶換爲正式應用出現支付異常(正式環境須要支付寶開放平臺的應用審覈經過狀態爲上線
  2019/09/22
  1. 異步通知存儲屢次存儲(存儲支付寶交易號判斷惟一性
  2019/09/24
  1. 同一用戶同時在不一樣瀏覽器購買商品出現重疊(passback_param僅傳遞owner_id,異步通知時再次進行查詢獲得用戶的到期時間,算出用戶所購買產品的起始日期
  1 <?php
  2 namespace app\index\controller;
  3 
  4 use think\Controller;
  5 use think\Request;
  6 use think\Db;
  7 
  8 
  9 class Alipay extends Controller
 10 {
 11     public function index(Request $request){
 12         header("Content-type:text/html;charset=utf-8");
 13         require_once VENDOR_PATH.'/alipay/config.php';
 14         require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php';
 15         require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
 16         $param = $request->param();
 17 //        var_dump($param);die;
 18         //必傳參數
 19         if (empty($param['WIDout_trade_no']) || !array_key_exists('WIDout_trade_no',$param)){
 20             $result = [
 21                 'status' => '201',
 22                 'msg' => '參數錯誤',
 23                 'param' => $param
 24             ];
 25             exit(json_encode($result));
 26         }
 27         if (empty($param['WIDsubject']) || !array_key_exists('WIDsubject',$param)){
 28             $result = [
 29                 'status' => '201',
 30                 'msg' => '參數錯誤',
 31                 'param' => $param
 32             ];
 33             exit(json_encode($result));
 34         }
 35         if (empty($param['WIDtotal_amount']) || !array_key_exists('WIDtotal_amount',$param)){
 36             $result = [
 37                 'status' => '201',
 38                 'msg' => '參數錯誤',
 39                 'param' => $param
 40             ];
 41             exit(json_encode($result));
 42         }
 43 
 44 
 45         //商戶訂單號,商戶網站訂單系統中惟一訂單號,必填
 46         $out_trade_no = trim($param['WIDout_trade_no']);
 47 
 48         //訂單名稱,必填
 49         $subject = trim($param['WIDsubject']);
 50 
 51         //付款金額,必填
 52         $total_amount = trim($param['WIDtotal_amount']);
 53 
 54         //商品描述,可空
 55         $body = trim($param['WIDbody']);
 56 
 57         //公用回傳參數
 58 //        $passback_params = http_build_query($param['purchaseInfo']);
 59         $passback_params = urlencode($param['buyer']);
 60 
 61 
 62         //構造參數
 63         $payRequestBuilder = new \AlipayTradePagePayContentBuilder();
 64         $payRequestBuilder->setBody($body);
 65         $payRequestBuilder->setSubject($subject);
 66         $payRequestBuilder->setTotalAmount($total_amount);
 67         $payRequestBuilder->setOutTradeNo($out_trade_no);
 68         $payRequestBuilder->setPassbackParams($passback_params);
 69 
 70 //        var_dump($payRequestBuilder);die;
 71         $aop = new \AlipayTradeService($config);
 72 
 73         /**
 74          * pagePay 電腦網站支付請求
 75          * @param $builder 業務參數,使用buildmodel中的對象生成。
 76          * @param $return_url 同步跳轉地址,公網能夠訪問
 77          * @param $notify_url 異步通知地址,公網能夠訪問
 78          * @return $response 支付寶返回的信息
 79          */
 80         $response = $aop->pagePay($payRequestBuilder, $config['return_url'], $config['notify_url']);
 81 
 82         //輸出表單
 83         echo $response;
 84     }
 85 
 86     /**
 87      * 異步
 88      * @param Request $request
 89      * @throws \Exception
 90      */
 91     public function notifyUrl(Request $request){
 92         $param = $request->param();
 93         require_once VENDOR_PATH.'/alipay/config.php';
 94         require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php';
 95         require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
 96         $alipaySevice = new \AlipayTradeService($config);
 97         $alipaySevice->writeLog(var_export($param,true));
 98         $result = $alipaySevice->check($param);
 99 
100         if($result) {
101             //驗證成功
102             $buyer = urldecode($param['passback_params']);
103             if ($param['trade_status'] == 'TRADE_SUCCESS') {
104                 //判斷該筆訂單是否在商戶網站中已經作過處理
105                 //若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
106                 //請務必判斷請求時的total_amount與通知時獲取的total_fee爲一致的
107                 //若是有作過處理,不執行商戶的業務程序
108                 //注意:
109                 //付款完成後,支付寶系統發送該交易狀態通知
110                 $db2 = Db::connect('pfpartner2');
111                 $db = Db::connect('pfpartner');
112 
113                 ///經過ownerid獲取用戶信息S////////////////////////////////////////////////
114                 $userInfo = $db->name('open_user')->where('owner_id','=',$buyer)->find();
115                 ///經過ownerid獲取用戶信息E////////////////////////////////////////////////
116 
117 //                file_put_contents("alipaytext4.txt",$userInfo);die;
118 
119                 ///獲取所購產品的起始時間S//////////////////////////////////////////////////////
120                 $goodWhere['project'] = $param['subject'];
121                 $goodWhere['type'] = $param['body'];
122                 $projectArr = $db2->name('goods')->where($goodWhere)->find();
123                 if ($userInfo['role'] == 0){
124                     $projectArr['startDatetime'] = date("Y-m-d H:i:s");
125                     $projectArr['expirationDatetime'] = date("Y-m-d H:i:s",time()+$projectArr['day']*24*3600);
126                 }else{
127                     $projectArr['startDatetime'] = $userInfo['lock_time'];
128                     $projectArr['expirationDatetime'] = date("Y-m-d H:i:s",
129                         strtotime($userInfo['lock_time']) + $projectArr['day']*24*3600);
130                 }
131                 ///獲取所購產品的起始時間E//////////////////////////////////////////////////////
132 
133 //                file_put_contents("alipaytext2.txt",$puchaseInfo);
134 
135                 ///建立購買記錄信息S//////////////////////////////////////////////////////
136                 $puchaseInfo['owner_id'] = $userInfo['owner_id'];
137                 $puchaseInfo['mall_name'] = $userInfo['mall_name'];
138                 $puchaseInfo['data_date'] = date("Y-m-d");
139                 $puchaseInfo['product_name'] = $projectArr['project'];
140                 $puchaseInfo['product_type'] = $projectArr['type'];
141                 $puchaseInfo['payment_method'] = '0';
142                 $puchaseInfo['product_details'] = $projectArr['detailed'];
143                 $puchaseInfo['start_time'] = $projectArr['startDatetime'];
144                 $puchaseInfo['end_time'] = $projectArr['expirationDatetime'];
145                 $puchaseInfo['day'] = $projectArr['day'];
146                 $puchaseInfo['original_price'] = $projectArr['original_price'];
147                 $puchaseInfo['discount_price'] = $projectArr['discount'];
148                 $puchaseInfo['actual_price'] = $projectArr['price'];
149                 $puchaseInfo['trade_no'] = $param['trade_no'];
150                 ///建立購買記錄信息E//////////////////////////////////////////////////////
151 
152 //                file_put_contents("alipaytext3.txt",$puchaseInfo);
153 
154                 //判斷是否存儲過該條記錄
155                 $res = $db2->name('purchase_record')->where('trade_no',$param['trade_no'])->find();
156                 if (!$res){
157                     //未購買過,新增購買記錄並修改用戶表中的到期時間等字段
158                     $db2->name('purchase_record')->insert($puchaseInfo);
159                     $user['lock_time'] = $projectArr['expirationDatetime'];
160                     $user['role'] = '1';
161                     $user['is_lock'] = '0';
162                     $db->name('open_user')->where('owner_id','=',$buyer)->update($user);
163                 }
164                 echo "success";
165             }
166         }else {
167             //驗證失敗
168             echo "fail";
169 
170         }
171 
172     }
173 
174     /**
175      * 同步
176      * @param Request $request
177      * @throws \Exception
178      */
179     public function returnUrl(Request $request){
180         $param = $request->param();
181         require_once VENDOR_PATH.'/alipay/config.php';
182         require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php';
183         require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
184         $alipaySevice = new \AlipayTradeService($config);
185         $result = $alipaySevice->check($param);
186 
187         /* 實際驗證過程建議商戶添加如下校驗。
188         一、商戶須要驗證該通知數據中的out_trade_no是否爲商戶系統中建立的訂單號,
189         二、判斷total_amount是否確實爲該訂單的實際金額(即商戶訂單建立時的金額),
190         三、校驗通知中的seller_id(或者seller_email) 是否爲out_trade_no這筆單據的對應的操做方(有的時候,一個商戶可能有多個seller_id/seller_email)
191         四、驗證app_id是否爲該商戶自己。
192         */
193         if($result) {
194             //驗證成功
195             return $this->redirect('index/Home/index',['code' => 1]);
196         }
197         else {
198             //驗證失敗
199             echo "驗證失敗";
200         }
201     }
202 
203 }
204 
205 ?>
相關文章
相關標籤/搜索