天天看點

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

為了給自己小應用加個捐贈。

用了支付寶的接口。

本篇是算是自己總結吧,一路坎坷。

一個demo圖(在伺服器簽的)

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

應用采用的是Kotlin開發的,為了測試支付寶的接口,就用了一個demo測試。本篇都是這個demo為基礎。(kt版demo)

完全相容支付寶的SDK,此處用得是新版的SDK,AAR格式

首先下載下傳好SDK的aar檔案,放入項目的libs檔案夾下。

在app級的建構中加上:

implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
           

然後同步一下。

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

就是這個啦。然後我們就可以直接使用這裡面的東西了。

這裡說一下邏輯:

我用的是沙箱版賬号(測試用)

在支付寶開發者控制台有的,申請一個賬号。

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

一定注意:這裡的 APPID,RSA秘鑰,支付寶公鑰,和我們正式上線的不一樣!而且這裡注意支付寶公鑰和我們自己的公鑰是不一樣的!它會根據你的公鑰自動生成的。

我們的公鑰和私鑰要用他的工具生成,也有别的方法,就不介紹了,這樣,公鑰與私鑰要比對!

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

RSA和RSA2是可選的,預設是RSA,如果你設定了2個,就用RSA2,(後面會用!)

我們有了測試用的賬号,然後要下載下傳沙箱版支付寶,登入你的測試賬号。可以掃碼付錢了(隻能掃你的商戶賬号)

現在的情況理一下:

我們有了支付寶,有了商戶賬号,有了支付賬号,有了自己的公鑰和私鑰還有支付寶的公鑰,還有APPID。

再提醒一下:支付寶網關:我們用沙箱版賬号,注意是:https://openapi.alipaydev.xxx   dev是沙箱用得

https://docs.open.alipay.com/200/105311/

然後我們回到app那邊:一個支付,一個輸出傳回的資料元件

在android的主活動裡:

onCreate方法裡啟動沙箱環境:

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

借得圖,as關了,,

上線後記得注釋掉。

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

好了,開始正題:邏輯理一下

我們在應用上點選支付->生成訂單資料->給伺服器端->接收訂單,簽名->傳回給android->android拿到這個簽名的資料->啟動支付寶支付->支付寶支付完成後,會有兩個通知,一個同步通知,返還給andoid本地用戶端。另一個是異步通知,給我們服務端的接口(這個接口一會介紹服務端再說)->我們的接口收到支付寶的請求(處理自己的業務邏輯,比如确定訂單,或者添加記錄),要應答支付寶:success,不然支付寶會一直請求。->支付寶接收success字元,此訂單号有效。->下一步,我們可以讓android端請求一看看有沒有這個記錄,有了同步和異步更安全點。

引入SDK,有幾個檔案,我們要處理。

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

先在說一下服務端邏輯(具體操作,下面會說,邏輯有了,就友善了)

我們根據自己情況,選擇服務端的SDK,我這裡用的是PHP

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

我們要在自己的接口裡,引入AopSDk.php這是SDK的入口檔案,我用的是原生PHP

下面是發起支付請求了,我沒有做訂單處理,需要的可以在這裡處理。

請求這裡注意:RSA2和之前的對應,預設是RSA,$orderId 是不可以重複的!不然會支付失敗,不如ali系列的錯誤!

這裡用到了支付寶公鑰和私鑰。

PHP的sdk幫我們處理封裝好了很多東西。

biz_content裡面有很多參數,具體看文檔哦.

<?php





require './AopSdk.php';



/*發起APP阿裡支付訂單*/

function SubmitAlipaysend($OrderId,$body="jz",$subject="ms",$UserId="123",$PayMoney=5,$PayType="",$NotifyPage = "https://www.xxxxxks.top/MAS/msAlipay/ok.php")

    {

        try

        {

            $aop = new AopClient();

            $aop->gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

            $aop->appId = '2016092xxxx1'; //支付寶配置設定給開發者的應用ID

            $aop->alipayrsaPublicKey = 'xxxxx'; //支付寶公鑰

            $aop->rsaPrivateKey='xxxxx='; // 請填寫開發者私鑰去頭去尾去回車,一行字元串

            $aop->format = "json";//僅支援JSON

            $aop->charset = "UTF-8";//請求使用的編碼格式,如utf-8,gbk,gb2312

            $aop->signType = "RSA2";//目前支援RSA2和RSA,推薦使用RSA2

           

            //執行個體化具體API對應的request類,類名稱和接口名稱對應,目前調用接口名稱:alipay.trade.app.pay

            $request = new AlipayTradeAppPayRequest();

            //SDK已經封裝掉了公共參數,這裡隻需要傳入業務參數

            $bizcontent = "{\"body\":\"".$body."\","

                . "\"subject\": \"".$subject."\","

                    . "\"out_trade_no\": \"".$OrderId."\","

                        . "\"timeout_express\": \"30m\","

                            . "\"total_amount\": \"".$PayMoney."\","

                                . "\"product_code\":\"QUICK_MSECURITY_PAY\""

                                    . "}";

            $request->setNotifyUrl($NotifyPage);

            $request->setBizContent($bizcontent);

            //這裡和普通的接口調用不同,使用的是sdkExecute

            $response = $aop->sdkExecute($request);

            //htmlspecialchars是為了輸出到頁面時防止被浏覽器将關鍵參數html轉義,實際列印到日志以及http傳輸不會有這個問題

            // echo htmlspecialchars($response);

            // 可以直接給用戶端請求,無需再做處理。

            echo $response ;

            die();

        }

        catch (Exception $ex)

        {

           echo $ex->getMessage();

        }

    }



    SubmitAlipaysend(time());





?>
           

我們在android端拿到這個簽名的資料:ResData,result是支付寶支付後傳回的同步通知資料,就是我們單擊支付,跳轉支付界面,支付後會傳回資料到android,然後支付寶會再向我們服務端留的位址,發送一個異步通知!到$NotifyPage

這裡我們解析一點資料如上!資料是一個Map格式的。其中有json字元串。

Thread{

    val alipay = PayTask([email protected])

    val result = alipay.payV2(ResData, true)

    if( result["resultStatus"] == "9000"){



        val sign = JSONObject(result["result"]).getJSONObject("alipay_trade_app_pay_response").getString("trade_no")

        checkUser(this,sign)

        payId = sign



    }

}.start()

           

android端支付完了,我們看看服務端怎麼處理的,$NotifyPage

下圖是部分邏輯:

最重要的驗證函數,PHP的sdk幫我們把參數過濾了,并且編碼了,不用和java或者别的sdk一樣,手動處理。

直接可以把$_POST資料放進去,調用驗證方法。

如果流程正常:$flag應該是true

如果是:false

注意:這裡是支付寶公鑰(字元串或者證書格式,取決于中間的null,null應該傳證書路徑!否則我們就設定字元串的公鑰)

$NotifyPage:這個是異步通知接口,支付寶會發送支付後的資料到這個接口,我們自己的,外網可通路的,在這裡我們還要做個驗簽!

Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名
Kotlin:支付寶app支付接入,沙箱demo,PHP服務端簽名

一定按照文檔流程走下去。

繼續閱讀