php实现扫码支付
原理
講之前,首先請先看一下下面這幅圖,這是一個最簡單的掃碼支付功能,圖畫的不好請見諒,下面我簡述一下過程
A1:這一步可以理解成我在京東上下了一個單子,然后請求掃碼支付,服務器收到此請求后,首先在數據庫中生成一條記錄,單子狀態未支付,隨后根據單子生成一個支付二維碼
??? 然后進入A2階段
A2:web端通過移步請求服務器,查詢單子是否支付,如果返回結果未支付,則等待1秒后再次請求,如果返回已支付,則提示用戶支付成功
B1:微信掃描這個二維碼,解析后獲取信息,該信息中至少包含剛剛生成的單子的唯一標識符(比如數據庫表id)
B2:手機端發出請求 攜帶用戶信息和單子的標識符去服務器進行比對,比對結果返回給用戶,如果正確,提示用戶是否確認支付,如果錯誤,如二維碼過期等,提示用戶重新生成二維碼
B3:當提交信息正確,且用戶同意支付,則請求服務器,將該單子的狀態改為已支付 然后提示用戶支付成功 然后參照A2 整個流程完畢
舉例:京東的微信支付,淘寶的支付寶支付
客戶端定時向服務器發送Ajax請求,服務器接到請求后馬上返回響應信息并關閉連接。
優點:后端程序編寫比較容易。
缺點:請求中有大半是無用,浪費帶寬和服務器資源。
輪詢方式的實現
那么現在用代碼段來模擬一下這個過程 假設后端腳本如下
a.php ------ 用來表單提交的數據,生成訂單記錄進數據庫
b.php ------ 用來處理移動端的支付,然后修改數據庫該訂單支付狀態
c.php ------ 用來查詢訂單是否已支付
第一步 記錄該訂單信息?
前端表單訪問a.php 提交信息? 插入數據庫生產訂單 并返回這條訂單編號
insert into XXX('user_id','price','goods_numbers','status')values(...)
第二步? 生成二維碼
????? 利用php QR Code第三發類庫生成 下面只附上簡單實現代碼
?????? 這樣一張包含用戶信息的二維碼鏈接就生成了
第三步 前端輪詢
前端加載二維碼后開始ajax輪詢 c.php查看該訂單是否已支付 當后端返回已支付信息后 前端頁面跳轉
var checkRequest = setInterval(getData, 3000);function getData(){var goods_number = '12345678XXXX';$.ajax({type: "post",dataType: "json",url: 'c.php',data: {"goods_number":goods_number},success: function (data) {if(data.code == 1){//成功 結束計時器 頁面跳轉clearInterval(checkRequest);}}});}
當收到支付完成的狀態時,支付完成
第三步 移動端確認支付
手機端掃描二維碼 拿到其中的信息 確認其中的信息 然后請求b.php這個腳本去完成支付
第四步? 后端修改訂單狀態
后端服務器接到message參數,確認信息無誤,將訂單狀態修改為已支付
由于web頁面在一直請求c.php 當訂單被改成已支付后? web端將收到改信息 然后跳轉頁面即可
輪詢的好處是代碼易于編寫跟維護
在另一篇文章中使用長鏈接來完成掃碼登錄,掃碼登錄和支付的原理一致,僅式后端處理業務的不同,
地址 http://blog.csdn.net/zhangsheng_1992/article/details/51340637
總結
- 上一篇: springboot 连接sftp服务器
- 下一篇: php工商亮照添加代码,市场监管总局电子