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第三發類庫生成 下面只附上簡單實現代碼

   下載地址 http://phpqrcode.sourceforge.net/
<?php
include_once 'qrcode/phpqrcode.php';
$message = [
    'user_id'=>'1',
    'price'=>'20.00',
    'goods_number'=>'12345678XXXX'
];
QRcode::png('mywebsite.com/message='.json_encode($message));

       這樣一張包含用戶信息的二維碼鏈接就生成了

第三步 前端輪詢

前端加載二維碼後開始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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章