閱讀156 返回首頁    go 阿裏雲 go 技術社區[雲棲]


支付寶安全支付服務Android應用開發指南(摘取官方文檔)

一,安全支付服務簡介:
1.1,安全支付服務介紹。
安全支付服務是安裝在本地Android操作係統上的一個組件,主要用來向其它的應用程序提供便捷、安全以及可靠的支付服務。正如平常係統上所提供的其它服務,如電子郵件和電話服務一樣。本文主要描述安全支付服務應用開發接口的使用方法,供合作夥伴以及其它第三方應用開發者參考。
1.2,安全支付服務業務流程。

1.3,調用安全支付數據流程圖

二,安全支付接入流程
2.1,接入前期準備
接入前期準備工作包括商戶簽約和密鑰配置,已完成商戶可略過。
2.1.1,商戶簽約
首先,商戶需要在https://ms.alipay.com進行注冊,並簽約安全支付服務。簽約成功後可獲取支付寶分配的合作商戶ID(PartnerID),賬戶ID(SellerID),如圖:

簽約過程中需要任何幫助請致電:0571-88158090(支付寶商戶服務專線)
2.1.2,密鑰配置
簽約成功後,商戶可登陸https://ms.alipay.com獲取商戶賬號對應的支付寶公鑰,具體獲取步驟請見3.2 RSA密鑰詳解
接著,商戶生成商戶公鑰和商戶私鑰(具體生成步驟請見3.2 RSA密鑰詳解),並登陸https://ms.alipay.com,上傳商戶公鑰(具體上傳步驟請見3.2 RSA密鑰詳解)。
至此,接入前期準備工作完成,下一節將使用demo測試準備工作是否正確。
2.2,Demo
為了便於商戶的接入,我們提供了安全支付demo。通過本demo,商戶可測試2.1節的前期準備工作是否正確完成,同時還可參考demo的代碼完成接入。(注意:請勿在模擬器下測試demo,否則可能導致付款賬戶被鎖定!)
2.2.1,Demo 配置運行
步驟 1:
解壓下載的安全支付開發資料壓縮包WS_SECURE_PAY,進入目錄“WS_SECURE_PAY\Android”,其中“AppDemo4_0413”即demo的項目文件,將其導入eclipse,步驟如圖:







項目結構如圖:



步驟 2:
打開“PartnerConfig.java”文件,按照注釋添加商戶賬號信息,具體包括:合作商戶ID、賬戶ID、支付寶公鑰(即服務器公鑰)、商戶公鑰、商戶私鑰。如下圖:


步驟 3
在真機或者模擬器上運行項目(下圖以模擬器為例),首次啟動時,由於係統未安裝安全支付服務,將出現以下提示:


此時,可以選擇“確定”進行安裝,安裝後該提示不會再出現。此時點擊任意商品進行購買,即啟動安全支付:


首次運行安全支付服務,會進行安全認證,此時選擇“支付寶賬戶”付款(注意:付款用的賬戶應為某一真實賬戶,交易金額也是真實的!),輸入賬戶信息,按照提示一步步進行:


完成安全認證後,若出現如下提示,說明密鑰配置有誤,請仔細閱讀3.2 RSA密鑰詳解


若出現“確認支付”頁麵,說明密鑰配置無誤,接入前期準備工作全部正確完成。接下來將正式進行安全支付的接入集成。

2.2.2,Demo結構說明


2.3 安全支付集成
本章指導在商戶項目中集成安全支付,關鍵代碼以Demo為例。
步驟 1:添加jar文件
添加demo中的alipay_msp.jar包添加工程中。
步驟 2:初始化安全支付服務
在調用安全支付進行支付前,需要先初始化安全支付服務,主要代碼如下:
private ServiceConnection mAlixPayConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// Wake up the binder to continue.
synchronized (lock) {
mAlixPay = IAlixPay.Stub.asInterface(service);
lock.notify();
}
}
public void onServiceDisconnected(ComponentName className) {
mAlixPay = null;
}
};
...
// Bind the service, then can call the service.
mActivity.bindService(new Intent(IAlixPay.class.getName()),
mAlixPayConnection, Context.BIND_AUTO_CREATE);

步驟 3:訂單數據生成
在調用安全支付時,需要提交訂單信息orderInfo其中參數以“key=value”形式呈現,參數之間以“&”分割,所有參數不可缺。示例如下:(紅色參數表示該參數值需與示例一致,不可自定義;藍色參數表示值可自定義。具體參數說明請見訂單信息描述)
partner="2088002007260245"&seller="2088002007260245"&out_trade_no="500000000006548"&subject="商品名稱"&body="這是商品描述"&total_fee="30"¬ify_url="https://notify.java.jpxx.org/index.jsp"&sign="kU2Fa3x6V985g8ayTozI1eJ5fHtm8%2FJGeJQf9in%2BcVmRJjHaExbirnGGKJ%2F7B63drqc4Kjlk%2FSg6vtSIkOtdvVBrRDpYaKxXVqkJTzRYgUwrrpMudbIj9aMS2O3dHG0GPyL4Zb6jKDYXHabGG0aBJY3QA7JuTJ23t6SqV%2B5f1xg%3D"&sign_type="RSA"

            其中sign值的生成,請見商品信息簽名。需要特別注意的是:對數據簽名後得到的sign值必須進行URLEncode,之後才可作為參數。
步驟 4:調用安全支付
           準備好參數後,即可調用安全支付進入支付流程並獲得調用結果,代碼如下:
           result = mAlixPay.Pay(orderInfo);
           AliXPay函數具體說明請見AlixPay方法描述。
步驟 5:支付結果獲取和處理
           調用安全支付後,將通過兩種途徑獲得支付結果:
           1、 AliXpay.pay()方法的返回
           該方法將返回表示支付結果的字符串,詳細信息詳見
           2、支付寶服務器通知
           商戶需要提供一個http協議的接口,包含在參數裏傳遞給安全支付,即notify_url。支付寶服務器在支付完成後,會用POST方法調用notufy_url,以xml為數據格式傳輸支付結果,詳見
          接下來以Demo代碼為例,介紹整個流程:
/*
* Initialize serviceConnection to get the stub
* Referrence class: MobileSecurePayer
*/
private ServiceConnection mAlixPayConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// wake up the binder to continue.
synchronized (lock) {
mAlixPay = IAlixPay.Stub.asInterface(service);
lock.notify();
}
}
/*
* Prepare the Info which will be used to call SecurePayment service
* Referrence class: AlixDemo
* Referrence method: onItemClick
*/
String orderInfo = getOrderInfo(arg2);
String signType = getSignType();
String strsign = sign(signType, orderInfo); //
strsign = URLEncoder.encode(strsign);
String info = orderInfo + "&sign=" + "\"" + strsign + "\"" + "&"
+ getSignType();
class: MobileSecurePayer
*/
public boolean pay(final String orderInfo, final Handler callback,
final int myWhat, final Activity activity) {
// Return false if it’s paying.
if (mIsPaying)
return false;
// Return true if it’s not paying.
mIsPaying = true;
mActivity = activity;
// bind the service.
if (mAlixPay == null) {
mActivity.bindService(new Intent(IAlixPay.class.getName()),
mAlixPayConnection, Context.BIND_AUTO_CREATE);
}
new Thread(new Runnable() {
public void run() {
try {
/**
* wait for the service bind operation to completely
* finished. Note: this is important, otherwise the next
* mAlixPay.Pay() will fail.
*/
synchronized (lock) {
if (mAlixPay == null)
lock.wait();
}
// register a Callback for the service.
mAlixPay.registerCallback(mCallback);
// call the MobileSecurePay service.
result = mAlixPay.Pay(orderinfo);
/**
* set the flag to indicate that we have finished.
* unregister the Callback, and unbind the service.
*/
mIsPaying = false;
mAlixPay.unregisterCallback(mCallback);
mActivity.unbindService(mAlixPayConnection);
// send the result back to caller.
Message msg = new Message();
msg.what = myWhat;
msg.obj = result;
callback.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
// send the result back to caller.
Message msg = new Message();
msg.what = myWhat;
msg.obj = e.toString();
// msg.obj = strRet;
callback.sendMessage(msg);
}
}
}).start();
return true;
}
}

2.4 應用發布
目前,我們為第三方應用客戶端提供了兩種集成安全支付服務的方式。第一種是運行時安裝,即將安全支付服務安裝包apk與第三方應用客戶端整合在一起,在恰當的時機,由第三方應用客戶端釋放並安裝安全支付服務安裝包apk。另一種則稱為動態下載安裝,在此種情況下,安全支付服務安裝包apk是預先存放在約定的遠程服務器中,第三方應用客戶端可以從此處下載apk並進行安裝。
為了提升用戶體驗,避免捆綁安裝舊版本的安全支付服務之後,接著又需要重新升級並安裝成最新版本,我們目前推薦結合使用以上兩種集成方式。在最新的demo中,會首先連接支付寶服務器,檢測並判斷捆綁在第三方客戶端中的alipay_plugin.apk是否為最新版本,如果是,則直接安裝。如果捆綁在第三方客戶端中的alipay_plugin.apk不是最新版本,則從服務器中下載最新版本的安裝包,然後進行安裝。
2.4.1運行時安裝
運行時安裝的具體步驟如下所示:
1) 將alipay_plugin.apk作為資源複製到第三方應用工程中的assets目錄。
2) 第三方應用在需要付款時(或者其它恰當時機),先檢測安全支付服務是否已經安裝。如果尚未安裝,則從assets目錄中提取alipay_plugin.apk到手機存儲。
3) 安裝手機存儲中的安全支付服務apk
以下是一個代碼片段,演示上述過程。
// Install the APK of SecurePayment which is included in the merchant’s App.
public boolean retrieveApkFromAssets(Context context, String fileName,
String path) {
boolean isRetrieve = false;
InputStream input = null;
FileOutputStream output = null;
try {
input = context.getAssets().open(fileName);
File file = new File(path);
file.createNewFile();
output = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = input.read(temp)) > 0) {
output.write(temp, 0, i);
}
isRetrieve = true
!= null){
try {
output.close();
} catch (IOException e) {
}
}
if(input != null){
try {
input.close();
} catch (IOException e) {
}
}
}
return isRetrieve;
}

2.4.2 動態下載安裝
動態下載安裝的具體步驟如下所示:
1) 由支付寶預先將安全支付服務apk放置到約定的遠程下載服務器。
2) 第三方應用在需要付款時(或者其它恰當時機),先檢測安全支付服務是否已經安裝。如果尚未安裝,則從約定的遠程下載服務器提取alipay_plugin.apk到手機存儲。
3) 安裝手機存儲中的安全支付服務apk
以下是一個代碼片段,演示上述過程。
// Download the APK of SecurePayment
public boolean retrieveApkFromNet(Context context, String strurl,
String filename) {
boolean isRetrieve = false;
try {
NetworkManager networkManager = new NetworkManager(this.mContext);
isRetrieve = networkManager.downloadToFile(context, strurl,
filename);
} catch (Exception e) {
e.printStackTrace();
}
return isRetrieve;
}
} catch (IOException e) {
e.printStackTrace ();
}finally{
if(output != null){
try {
output.close();
} catch (IOException e) {
}
}
if(input != null){
try {
input.close();
} catch (IOException e) {
}
}
}
return isRetrieve;
}

第三章 RSA詳解
以下內容加*號為重點
3.1 RSAOpenSSL介紹
3.1.1什麼是RSA
RSA是一種非對稱的簽名算法,即簽名密鑰(私鑰)與驗簽密鑰(公鑰)是不一樣的,私鑰用於簽名,公鑰用於驗簽。
在與支付寶交易中,會有2對公私鑰,即商戶公私鑰,支付寶公鑰。
商戶公私鑰:由商戶生成,商戶私鑰用於對商戶發往支付寶的數據簽名;商戶公鑰需要上傳至支付寶,當支付寶收到商戶發來的數據時用該公鑰驗證簽名。
支付寶公鑰:支付寶提供給商戶,當商戶收到支付寶發來的數據時,用該公鑰驗簽。
3.1.2為什麼要用RSA
使用這種算法可以起到防止數據被篡改的功能,保證支付訂單和支付結果不可抵賴(商戶私鑰隻有商戶知道)
3.1.3什麼是OpenSSL
一句話概括:OpenSSL是基於眾多的密碼算法、公鑰基礎設施標準以及SSL協議安全開發包。
3.1.4為什麼要用OpenSSL
通過OpenSSL生成的簽名和內置的算法可以做到跨平台,這樣在不同的開發語言中均可以簽名和驗簽。

3.2 RSA密鑰詳解*
3.2.1找到生成RSA密鑰工具
(1)下載開發指南和集成資料,如下圖,您能看到此文檔說明指南和集成包已經下載了。

(2)解壓下載的壓縮包(WS_SECURE_PAY),找到並解壓openssl-0.9.8k_WIN32(RSA密鑰生成工具).zip工具包


3.2.2生成商戶密鑰並獲取支付寶公鑰
(1) 生成原始RSA商戶私鑰文件
假設解壓後的目錄為c:\alipay,命令行進入目錄C:\alipay\bin,執行opensslgenrsa-out rsa_private_key.pem 1024在C:\alipay\bin下會生成文件rsa_private_key.pem,
其內容為原始的商戶私鑰(請妥善保存該文件),以下為命令正確執行截圖:


(2) 將原始RSA商戶私鑰轉換為pkcs8格式
命令行執行 openssl pkcs8 -topk8 -inform PEM -inrsa_private_key.pem -outform PEM-nocrypt”得到轉換為pkcs8格式的私鑰。複製下圖紅框內的內容至新建txt文檔,去掉換行,最後另存為“private_key.txt”(請妥善保存,簽名時使用)。


(3)生成RSA商戶公鑰
命令行執行“ openssl rsa -in rsa_private_key.pem -pubout -outrsa_public_key.pem”,在C:\alipay\bin文件夾下生成文件rsa_public_key.pem。接著用記事本打開rsa_public_key.pem,複製全部內容至新建的txt文檔,刪除文件頭“-----BEGIN PUBLICKEY-----”與文件尾“-----ENDPUBLIC KEY-----”及空格、換行,如下圖。最後得到一行字符串並保存該txt文件為“public_key.txt”。


(4)上傳商戶公鑰至支付寶
瀏覽器訪問https://ms.alipay.com/index.htm並用簽約帳號登錄,點擊菜單欄我的產品,右側點擊密鑰管理,見下圖紅色框內

點擊上傳,選擇步驟(3)生成的“public_key.txt”並完成上傳。
(5)獲取RSA支付寶公鑰
成功上傳公鑰至支付寶後,頁麵顯示如下:


其中紅色框內部分即支付寶公鑰,請複製至新建txt文檔,去掉換行和空格,妥善保存(用於驗簽收到的支付寶通知)。
3.3  RSA簽名和驗簽*
建議:簽名和驗簽盡量在商戶服務器端進行,同時一些敏感數據(如公私鑰等)也應存儲在服務器端,避免可能的安全隱患。
3.3.1 RSA簽名
(1)在項目中添加下麵的類:

對不起各位,最近比較忙,一直沒時間編輯,下麵放出官方源文件,大家可以直接下載查看!

https://download.csdn.net/detail/gulaer/5017686


最後更新:2017-04-04 07:03:27

  上一篇:go POJ1401 數學N!因子分解
  下一篇:go spring裏頭各種獲取ApplicationContext的方法