這篇文章帶給大家的內容是關於TP5實現支付寶電腦網站支付的範例介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
這兩天在公司做一個小型WEB專案,需要有支付功能。第一次做支付寶的支付,踩了點小坑,還算順利。激動的我趕緊記下實現的流程。
第一步當然是在支付寶開放平台申請公鑰私鑰APPID等,支付寶關官方文件都有詳細介紹,這裡就省略。
申請完了下面開始開發者的實作流程。首先是下載支付寶的官方DEMO,網址是https://docs.open.alipay.com/... 這裡建議下載官方的DEMO而不是SDK,因為對新手來說DEMO裡有封裝好的函數可以直接拿來改改就用,比較友善。以後技術提升了,再拿SDK玩玩。
因為我是PHPer,當然選擇PHP版。下載好之後預設名字是alipay.trade.page.pay-PHP-UTF-8,建議改名字為alipay即可。
因為我是用TP5開發,所以放到專案根目錄下的外部資源包vendor目錄。
放進去之後,找到alipay目錄下pagepay目錄下的pagepay.php文件,這便是阿里官方提供的付款方法範例,
我學著網路上一位學長的寫法改了一下放到TP5的方法中,見下圖:
走到這裡如果順利,便會出現支付寶的二維碼頁面。我這裡因為客戶重新申請權限所以沒辦法截圖了。就是那個支付寶二維碼的頁面。掃碼支付,便會跳到付款成功頁面,最後會跳到你自訂的同步跳轉位址。
價格由前台表單傳值即可,這裡強調有三個必填項:訂單號碼、訂單名稱、付款金額,這三個缺哪一個都會報錯。我剛開始腦袋發暈,把訂單名稱去掉了,結果報錯了...
這裡寫完之後,便去config.php配置各項參數,config.php在alipay的根目錄下,配置這一項至關重要。如果錯了,商家可是收不到款的噢...
這裡是傻瓜填法,應用ID、私鑰、非同步地址、同步地址、公鑰。這6項必須填正確。因為我是用的TP5,所以通知地址那裡我改成了TP5的寫法,模組/控制器/方法.
支付寶網關那裡不要更改,如果是沙箱環境,需要改成"https://openapi .alipaydev.com/gateway.do" 多了個"dev",因為我是真實環境,所以就不用更改。
這裡再說一下非同步和同步位址,新人一定不知道有什麼用,大佬略過即可。支付寶支付成功後會執行這兩個方法,系統會把你支付的資訊用POST方式異步傳給你的方法。因為是異步,所以頁面是沒有變化的,所謂"打槍的不要,悄悄地進村..."在異步這個方法裡可以寫你自己的業務邏輯。例如接收值,存入資料庫之類。 這裡有個大坑,坑了我兩天,即在非同步方法裡是沒法用session取值的,我原本想用session取用戶登入id存入資料庫中,後來問了師傅才知道,異步是伺服器和伺服器之間的交互,所以沒有cookieId,沒有cookieId當然沒有session值。對這裡不懂的童鞋可以複習下session基礎知識,慚愧,我居然把這麼基礎的東西忘了...由此可知,同步方法是可以取session的,因為是服務器和客戶端的交互。如果對此沒概念,可以在非同步方法接收參數後轉成JSON格式,然後用file_put_contents()函數寫到記事本裡看一下。
例:
{ "gmt_create":"xxxxxxxx",//订单创建时间 "charset":"UTF-8", "gmt_payment":"xxxxxxxx", //付款时间 "notify_time":"xxxxx", //异步回调时间 "subject":"XXXXX", //订单名称 "sign":"xxxxxxxxxxxxxxxxxxx", "buyer_id":"xxxxxxxx", "invoice_amount":"xxxxx", "version":"1.0", "notify_id":"xxxxxxxxx", "fund_bill_list":"[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]", "notify_type":"trade_status_sync", "out_trade_no":"xxxxxxxx", //订单号 "total_amount":"0.01", "trade_status":"TRADE_SUCCESS", //success代表支付成功,商家会收到钱 "trade_no":"xxxxxx", //支付宝流水号 "auth_app_id":"xxxxxxxx", "receipt_amount":"0.01", "point_amount":"0.00", "app_id":"xxxxxxxxx", "buyer_pay_amount":"0.01", "sign_type":"RSA2", "seller_id":"xxxxxxxxxxxxx" }
重要的我都加了註解了,其他不懂的參數可以去官方文件查詢。
同步方法,顧名思義,就是頁面同步跳躍的位址,也就是能讓客戶看見的頁面。這裡自訂即可,例如提示用戶支付成功之類文字。
下面是異步和同步方法的範例寫法:
/** 异步同步示例 */ class alipay extends Controller { /** * 异步方法 * @return [void] */ public function notify(){ $post = input(); if($post['trade_status'] == "TRADE_SUCCESS"){ //操作数据库 修改状态 echo "SUCCESS";//返回给支付宝成功 ,不返回这个 字符 ,支付宝定时 回调这个方法 时间 5 10 30/m 1小时 成功为止 } //写在文本里看一下参数 $data = json_encode($post); file_put_contents("alipaytext.txt",$data); } /** * 同步方法 * @return [type] [description] */ public function returnfy(){ //同步跳转地址 return $this->fetch(); } }
这里面重要的是需要在异步方法里判断trade_status字段,如果等于"TRADE_SUCCESS"即支付成功,后面必须echo返回一个"SUCCESS",否则支付宝会认为你没有付款成功,而在24小时内定时回调这个方法。实际业务逻辑根据你的需求来比如存入订单表等等,当然不会这么简单,最好加一些验证。为了安全。下面是前台代码示例:
{include file="public/header"} <!-- HEADER END --> <!-- CONTENT BEGIN --> <div> <div> <div> <div> <form> 商户订单号:<input><br> 订单名称:<input><br> 付款金额:<input><br> 商品描述:<input><br> <button>付 款</button> </form> </div> {include file="public/right"} <div></div> <div></div> </div> </div> </div> <!-- CONTENT END --> <!-- FOOTER BEGIN --> {include file="public/tail"}
最后补上一句:日志文件一定要开启写权限,否则无法自动写入。即在alipay文件夹下右键log.txt属性设置。出了问题可以在日志里查看。
走到这里,流程就基本介绍完了。欢迎各位大佬拍砖指导。做完支付,会感觉自己又上了一个台阶!
以上是TP5實現支付寶電腦網站支付的範例介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!