支付寶開發-條碼支付

支付寶開發-關於條碼支付

最近項目需要用到支付寶支付。大致流程就是收銀臺通過掃碼設備掃描用戶出示的付款碼。進行付款。快捷方便。用php編寫請求代碼。c++(也就是收銀臺)那邊調用我寫的接口。進行付款。

首先還是看看開發文檔吧 。傳送門:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.u3cxFZ&treeId=193&articleId=105072&docType=1

具體流程圖如下:

具體流程如下:

第一步:首先要去支付寶開發者平臺創建應用

1.點擊創建應用,下面兩個是我已經創建過了應用

這裏寫圖片描述

2.設置應用參數

這裏面應用網關和回調地址我都設置服務器地址了。

這裏寫圖片描述

這裏的rsa密鑰很關鍵,我是通過openssl工具生成,我建議大家也用這個生成。這個工具在官方文檔上可以下載。
這裏我給個配置rsa密鑰連接,裏面詳細介紹瞭如果獲得rsa密鑰,
傳送門:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.XZAA3d&treeId=200&articleId=105310&docType=1

如果還有其他問題,再聯繫我。

以上設置過了。就可以上線應用了,一般半天就好 了。

第二步,下載官方demo,閱讀代碼

下面拿我的php代碼解釋:
首先要在config.php文件中配置appid,商戶密鑰 支付寶密鑰什麼的。

<?php
$config = array(
    //支付寶公鑰
    'alipay_public_key' => "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB",

    //商戶私鑰
    'merchant_private_key' =>
        "MIICXAIBAAKBgQDvLN/xcR8Nu+3/3K8IHaYK/LrFS3JPwM38oN95RaqAwSMJ6XH9vR2JB5w9MM+Et3gdZ/iVWROALQV5TSZIsVRA56u4jhnucuTC8YqNejySpxSI/N8rqffGqmfvtO+wDU3pcLrGiJN9FcPuUNVwYvdLuli0N6DAh2S5Vtvna2ovoQIDAQABAoGAT7vODFeB2rpD5YBUeYgoypDmUs+MFDpacVXQKkWnSbUZUTyZ29Un+36l/2A+Tig7ytHWdTN05M4dfQrTMHitdTC874vrbFHaDUT5vF7uPeA+wLDthM5lI1yrMT+L9sNYwDDTQYoRyBDhQ7miYd/Up3TGyinMQ0whBQkRuX1HAWECQQD92rQfgvY4qV0uFyPJAULObw8xk9G3dKYKl8TXKdi0q1F0Obu1GO6XiXqxHmXI1RsZ7rxqIPcbEBwsESrq8W6nAkEA8TJoiOU9EEGYNMra67GluoCII830qe+P9unIUKKdhIKuXxOfJt38+sqRThdFEarefrBIyTSkfE8p2CEKIQpAdwJBAL4S9tGtbo0oiyOKofnMXuhREfBOPTX/OqAt2W494AwPRtMes2S7AVMn1l0uZIoGvt8g+aUBf+ScoGuCgz8dfXsCQDVagjcuBljvOZ0L9mtGq7NatUK+T027+WuUAUSdBB0Iz0umyoDNgCV147iTeyrSUk9R7XfcljoNRONTQ6tVWjcCQC7ZddZzf12IgFFgHMF+5TStuGhLBVBVttvCBFGj1Jk9QPi7IOuzBrxSdmG530eMTnjBaJAAolGfLb6XrHrhdlI=",

    //編碼格式
    'charset' => "UTF-8",

    //支付寶網關
    'gatewayUrl' => "https://openapi.alipay.com/gateway.do",

    //應用ID
    'app_id' => "2016120904050389",

    //異步通知地址,只有掃碼支付預下單可用
    'notify_url' => "http://www.baidu.com",

    //最大查詢重試次數
    'MaxQueryRetry' => "10",

    //查詢間隔
    'QueryDuration' => "3"
);

支付寶公鑰和商戶私鑰在你的應用信息裏面都有,appid也在你的應用中。

支付接口請求接口:https://openapi.alipay.com/gateway.do

請求參數

  1. out_trade_no //訂單編號
  2. auth_code //付款碼
  3. subject //訂單名稱

這3個參數必填。其他參數可以在官方文檔詳細介紹。

if (!empty($_POST['out_trade_no'])&& trim($_POST['out_trade_no'])!="") {
    // (必填) 商戶網站訂單系統中唯一訂單號,64個字符以內,只能包含字母、數字、下劃線,
    // 需保證商戶系統端不能重複,建議通過數據庫sequence生成,
    $outTradeNo = "2016120904050389" . date('Ymdhis') . mt_rand(100, 1000);
//    $outTradeNo = $_POST['out_trade_no'];

    // (必填) 訂單標題,粗略描述用戶的支付目的。如“XX品牌XXX門店消費”
    $subject = $_POST['subject'];

    // (必填) 訂單總金額,單位爲元,不能超過1億元
    // 如果同時傳入了【打折金額】,【不可打折金額】,【訂單總金額】三者,則必須滿足如下條件:【訂單總金額】=【打折金額】+【不可打折金額】
    $totalAmount = $_POST['total_amount'];

    // (必填) 付款條碼,用戶支付寶錢包手機app點擊“付款”產生的付款條碼
    $authCode = $_POST['auth_code']; //28開頭18位數字



    // 繼續創建並添加第一條商品信息,用戶購買的產品爲“xx牙刷”,單價爲5.05元,購買了兩件
    $goods2 = new GoodsDetail();
    $goods2->setGoodsId("good_id002");
    $goods2->setGoodsName("XXX商品2");// 當面付2.0條碼支付(帶輪詢邏輯)
    public function barPay($req) {

        $outTradeNo = $req->getOutTradeNo();
        $bizContent = $req->getBizContent();

        $appAuthToken = $req->getAppAuthToken();

        $this->writeLog($bizContent);

        echo $bizContent;

        $request = new AlipayTradePayRequest();
        $request->setBizContent ( $bizContent );


        $response = $this->aopclientRequestExecute ( $request , NULL , $appAuthToken);

        //獲取alipay_trade_pay_response對象數據,方便後續處理
        $response = $response->alipay_trade_pay_response;

        $result = new AlipayF2FPayResult($response);

        if (!empty($response)&&("10000" == $response->code)) {
            // 支付交易明確成功
            $result->setTradeStatus("SUCCESS");

        } elseif (!empty($response)&&("10003" == $response->code)) {
            // 返回用戶處理中,則輪詢查詢交易是否成功,如果查詢超時,則調用撤銷
            $queryContentBuilder = new AlipayTradeQueryContentBuilder();
            $queryContentBuilder->setOutTradeNo($outTradeNo);
            $queryContentBuilder->setAppAuthToken($appAuthToken);

            $loopQueryResponse = $this->loopQueryResult($queryContentBuilder);
            return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $loopQueryResponse);

        } elseif ($this->tradeError($response)) {
            // 系統錯誤或者網絡異常未響應,則查詢一次交易,如果交易沒有支付成功,則調用撤銷
            $queryContentBuilder = new AlipayTradeQueryContentBuilder();
            $queryContentBuilder->setOutTradeNo($outTradeNo);
            $queryContentBuilder->setAppAuthToken($appAuthToken);

            $queryResponse = $this->query($queryContentBuilder);

            return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $queryResponse);

        } else {
            // 其他情況表明該訂單支付明確失敗
            $result->setTradeStatus("FAILED");
        }

        return $result;

    }
// 當面付2.0條碼支付(帶輪詢邏輯)
    public function barPay($req) {

        $outTradeNo = $req->getOutTradeNo();
        $bizContent = $req->getBizContent();

        $appAuthToken = $req->getAppAuthToken();

        $this->writeLog($bizContent);

        echo $bizContent;

        $request = new AlipayTradePayRequest();
        $request->setBizContent ( $bizContent );


        $response = $this->aopclientRequestExecute ( $request , NULL , $appAuthToken);

        //獲取alipay_trade_pay_response對象數據,方便後續處理
        $response = $response->alipay_trade_pay_response;

        $result = new AlipayF2FPayResult($response);

        if (!empty($response)&&("10000" == $response->code)) {
            // 支付交易明確成功
            $result->setTradeStatus("SUCCESS");

        } elseif (!empty($response)&&("10003" == $response->code)) {
            // 返回用戶處理中,則輪詢查詢交易是否成功,如果查詢超時,則調用撤銷
            $queryContentBuilder = new AlipayTradeQueryContentBuilder();
            $queryContentBuilder->setOutTradeNo($outTradeNo);
            $queryContentBuilder->setAppAuthToken($appAuthToken);

            $loopQueryResponse = $this->loopQueryResult($queryContentBuilder);
            return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $loopQueryResponse);

        } elseif ($this->tradeError($response)) {
            // 系統錯誤或者網絡異常未響應,則查詢一次交易,如果交易沒有支付成功,則調用撤銷
            $queryContentBuilder = new AlipayTradeQueryContentBuilder();
            $queryContentBuilder->setOutTradeNo($outTradeNo);
            $queryContentBuilder->setAppAuthToken($appAuthToken);

            $queryResponse = $this->query($queryContentBuilder);

            return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $queryResponse);

        } else {
            // 其他情況表明該訂單支付明確失敗
            $result->setTradeStatus("FAILED");
        }

        return $result;

    }

barpay方法中調用aopclientRequestExecute方法請求支付接口,根據返回的參數來判斷支付成功

這裏寫圖片描述

如果返回10003的情況下,證明用戶正在付款,它會查詢10次訂單狀態,每次睡眠5秒。如果10次之後用戶依舊沒有付款的情況下,那它就調用撤銷訂單接口。避免用戶繼續支付。

我這邊只介紹一些重點。如果想進行開發的話,建議一定要通讀源碼。理解其意。

以上!

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