為了給自己小應用加個捐贈。
用了支付寶的接口。
本篇是算是自己總結吧,一路坎坷。
一個demo圖(在伺服器簽的)
應用采用的是Kotlin開發的,為了測試支付寶的接口,就用了一個demo測試。本篇都是這個demo為基礎。(kt版demo)
完全相容支付寶的SDK,此處用得是新版的SDK,AAR格式
首先下載下傳好SDK的aar檔案,放入項目的libs檔案夾下。
在app級的建構中加上:
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
然後同步一下。
就是這個啦。然後我們就可以直接使用這裡面的東西了。
這裡說一下邏輯:
我用的是沙箱版賬号(測試用)
在支付寶開發者控制台有的,申請一個賬号。
一定注意:這裡的 APPID,RSA秘鑰,支付寶公鑰,和我們正式上線的不一樣!而且這裡注意支付寶公鑰和我們自己的公鑰是不一樣的!它會根據你的公鑰自動生成的。
我們的公鑰和私鑰要用他的工具生成,也有别的方法,就不介紹了,這樣,公鑰與私鑰要比對!
RSA和RSA2是可選的,預設是RSA,如果你設定了2個,就用RSA2,(後面會用!)
我們有了測試用的賬号,然後要下載下傳沙箱版支付寶,登入你的測試賬号。可以掃碼付錢了(隻能掃你的商戶賬号)
現在的情況理一下:
我們有了支付寶,有了商戶賬号,有了支付賬号,有了自己的公鑰和私鑰還有支付寶的公鑰,還有APPID。
再提醒一下:支付寶網關:我們用沙箱版賬号,注意是:https://openapi.alipaydev.xxx dev是沙箱用得
https://docs.open.alipay.com/200/105311/
然後我們回到app那邊:一個支付,一個輸出傳回的資料元件
在android的主活動裡:
onCreate方法裡啟動沙箱環境:
借得圖,as關了,,
上線後記得注釋掉。
好了,開始正題:邏輯理一下
我們在應用上點選支付->生成訂單資料->給伺服器端->接收訂單,簽名->傳回給android->android拿到這個簽名的資料->啟動支付寶支付->支付寶支付完成後,會有兩個通知,一個同步通知,返還給andoid本地用戶端。另一個是異步通知,給我們服務端的接口(這個接口一會介紹服務端再說)->我們的接口收到支付寶的請求(處理自己的業務邏輯,比如确定訂單,或者添加記錄),要應答支付寶:success,不然支付寶會一直請求。->支付寶接收success字元,此訂單号有效。->下一步,我們可以讓android端請求一看看有沒有這個記錄,有了同步和異步更安全點。
引入SDK,有幾個檔案,我們要處理。
先在說一下服務端邏輯(具體操作,下面會說,邏輯有了,就友善了)
我們根據自己情況,選擇服務端的SDK,我這裡用的是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:這個是異步通知接口,支付寶會發送支付後的資料到這個接口,我們自己的,外網可通路的,在這裡我們還要做個驗簽!
一定按照文檔流程走下去。