android支付平台集成调研 .
關于在線支付平臺,目前國內主要有以下幾種 paypal 支付寶,財付通,盛付通,易寶支付,快錢,銀聯在線,國付寶,網易寶,匯付天下等等。
手機支付平臺,調研了支付寶,支付寶,財付通,盛付通,paypal,易寶支付,銀聯在線,google in-app billing。其中盛大的盛付通不支持手機支付。其余都有手機集成服務。國內第三方平臺的合作對象都是面向企業用戶的,須實名認證。首先需要在網站上進行合作簽約,簽約之后才能獲得相應的id和key。必須使用企業賬戶才能簽約,沒有面向個人用戶的服務。Google提供的支付平臺是可以供單個開發者集成的,但是是以google play客戶端為依托的。
同時調研了幾種主流購物類app支付平臺的集成情況。其中 京東使用的是銀聯在線,當當使用的快錢,蘇寧是自己的一個易付寶。amazon,美團等用的是支付寶。使用最多的也是支付寶。
下面主要看一下幾種支付平臺的集成方式。
一、???????支付寶平臺的集成
在技術集成之前,商戶需要在https://ms.alipay.com進行注冊,并簽約安全支付服務。簽約成功后可獲取支付寶分配的合作商戶ID(PartnerID),賬戶ID(SellerID),調用接口時使用。
支付細節的實現,主要通過支付寶提供的一個支付安全服務安裝包alipay_plugin_20120428msp.apk,首次使用,首先檢查是否安裝此插件,沒有會提示安裝。具體的支付細節,在這個插件內完成。大部分的支付平臺也都是采用的這種方式。
調用支付寶的接口進行支付,主要有以下幾個步驟
1.??將商戶ID,收款帳號,外部訂單號,商品名稱,商品介紹,價格,通知地址封裝成訂單信息
2.??對訂單信息進行簽名
3.??將訂單信息,簽名,簽名方式封裝成請求參數
4.??調用pay方法。
主要流程圖如下:
支付接口pay方法的調用如下:
| 。。。 // start pay for this order. ?????? // 根據訂單信息開始進行支付 ?????? try { ?????????? // prepare the order info. ?????????? // 準備訂單信息 ?????????? String orderInfo = getOrderInfo(position); ?????????? // 這里根據簽名方式對訂單信息進行簽名 ?????????? String signType = getSignType(); ?????????? String strsign = sign(signType, orderInfo); ?????????? Log.v("sign:", strsign); ?????????? // 對簽名進行編碼 ?????????? strsign = URLEncoder.encode(strsign); ?????????? // 組裝好參數 ?????????? String info = orderInfo + "&sign=" + "\"" + strsign + "\"" + "&" ????????????????? + getSignType(); ?????????? Log.v("orderInfo:", info); ?????????? // start the pay. ?????????? // 調用pay方法進行支付 ?????????? MobileSecurePayer msp = new MobileSecurePayer(); ?????????? boolean bRet = msp.pay(info, mHandler, AlixId.RQF_PAY, this); ? ?????????? if (bRet) { ????????????? // show the progress bar to indicate that we have started ????????????? // paying. ????????????? // 顯示“正在支付”進度條 ????????????? closeProgress(); ????????????? mProgress = BaseHelper.showProgress(this, null, "正在支付", false, ???????????????????? true); ?????????? } else ????????????? ; ?????? } catch (Exception ex) { ?????????? Toast.makeText(AlixDemo.this, R.string.remote_call_failed, ????????????????? Toast.LENGTH_SHORT).show(); ?????? } 。。。 |
| /** ??? ?* 向支付寶發送支付請求 ??? ?* ??? ?* @param strOrderInfo ??? ?*??????????? 訂單信息 ??? ?* @param callback ??? ?*??????????? 回調handler ??? ?* @param myWhat ??? ?*??????????? 回調信息 ??? ?* @param activity ??? ?*??????????? 目標activity ??? ?* @return ??? ?*/ ??? public boolean pay(final String strOrderInfo, final Handler callback, ?????????? final int myWhat, final Activity activity) { ?????? if (mbPaying) ?????????? return false; ?????? mbPaying = true; ? ?????? // ?????? mActivity = activity; ? ?????? // bind the service. ?????? // 綁定服務 ?????? if (mAlixPay == null) { ?????????? // 綁定安全支付服務需要獲取上下文環境, ?????????? // 如果綁定不成功使用mActivity.getApplicationContext().bindService ?????????? // 解綁時同理 ?????????? mActivity.getApplicationContext().bindService( ????????????????? new Intent(IAlixPay.class.getName()), mAlixPayConnection, ????????????????? Context.BIND_AUTO_CREATE); ?????? } ?????? // else ok. ? ?????? // 實例一個線程來進行支付 ?????? 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. ????????????????? // 等待安全支付服務綁定操作結束 ????????????????? // 注意:這里很重要,否則mAlixPay.Pay()方法會失敗 ????????????????? synchronized (lock) { ???????????????????? if (mAlixPay == null) ???????????????????????? lock.wait(); ????????????????? } ? ????????????????? // register a Callback for the service. ????????????????? // 為安全支付服務注冊一個回調 ????????????????? mAlixPay.registerCallback(mCallback); ? ????????????????? // call the MobileSecurePay service. ????????????????? // 調用安全支付服務的pay方法 ????????????????? String strRet = mAlixPay.Pay(strOrderInfo); ????????????????? BaseHelper.log(TAG, "After Pay: " + strRet); ? ????????????????? // set the flag to indicate that we have finished. ????????????????? // unregister the Callback, and unbind the service. ????????????????? // 將mbPaying置為false,表示支付結束 ????????????????? // 移除回調的注冊,解綁安全支付服務 ????????????????? mbPaying = false; ????????????????? mAlixPay.unregisterCallback(mCallback); ????????????????? mActivity.getApplicationContext().unbindService( ???????????????????????? mAlixPayConnection); ? ????????????????? // send the result back to caller. ????????????????? // 發送交易結果 ????????????????? Message msg = new Message(); ????????????????? msg.what = myWhat; ????????????????? msg.obj = strRet; ????????????????? 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(); ????????????????? callback.sendMessage(msg); ????????????? } ?????????? } ?????? }).start(); ? ?????? return true; ??? } |
?
調用了支付服務之后,有兩種方式返回交易結果:
1.????????支付結果作為接口返回的字符串返回。返回的參數包含在result字符串中,具體再進行解析。
2.??支付寶服務器通知。商戶需要提供一個http協議的接口,包含在參數里傳遞給安全支付,即notify_url。支付寶服務器在支付完成后,會用POST方法調用notufy_url,以xml為數據格式傳輸支付結果。需要注意的是,商戶服務器收到支付寶發的通知之后,需要返回一個純字符串“success”,不然支付寶的服務器會持續調用七次回調url提供的接口。
集成需要的交易費用方面0-1萬元內是2.5%的費率,1-10萬是2.4%,10-100萬是2.2%,100萬以上2.0%。??????
二、???????財付通平臺的集成
財付通的集成和支付寶的非常相似(騰訊的傳統?→_→)。財付通也是提供了一個財付通安全支付服務應用TenpayService.apk用于處理交易的細節。對于此支付應用,財付通和支付寶的使用方式是一樣的。一種是捆綁預置,即打包在assets目錄下,另一種是放到自己的服務器中,通過檢查更新的方式動態加載。實際集成中可采用二者結合方式,初次使用使用預置apk,之后檢查更新動態下載。
但是調用支付接口之前,增加了一個獲取tokenid的過程,tokenid用于同財付通service進行交互。過程如下:
1.??用戶在商戶APP 選擇商品,使用財付通支付
2.??商戶APP向商戶server 請求使用財付通支付
3.??商戶server按照“支付初始化接口”的要求組織數據請求財付通“支付初始化接口”,接收初始化成功后返回的tokenid
4.??商戶server將生成的tokenid 返回給商戶APP
5.??商戶APP使用tokenid 調用財付通支付service
6.??財付通支付service 在驗證tokenid 后向用戶展示支付中心,顯示訂單信息及相關用戶信息
7.??用戶在支付中心輸入支付密碼執行支付
8.??財付通支付service 向財付通后臺server 請求執行支付,并實時接收支付結果
9.??支付成功后財付通支付service 向用戶展示支付成功UI,在用戶點擊“返回商戶網站”后回調商戶App
10.? 財付通后臺server 在支付成功后會通過“支付成功通知接口”在后臺通知商戶server 支付狀態。
接收支付接口返回結果方面,財付通對于方法返回值,不是直接返回的,而是通過handler回調,handler和msgId作為一個參數傳入接口,支付接口pay()方法的返回值只是個true false,用于區分調用成功或者失敗。其實跟淘寶的方式大同小異。對于notify_url,是財付通是通過get方式調用回調url,只返回支付成功的訂單。同樣的,商戶服務器在接收到財付通的調用之后,需要返回純字符串“success”“fail”表示處理成功或失敗。
調用支付接口的代碼如下:
| //構造支付參數 ????????????? HashMap<String, String> payInfo = new HashMap<String, String>(); ????????????? payInfo.put("token_id", mTokenId);???????? //財付通訂單號token_id ????????????? payInfo.put("bargainor_id", "1234567890"); //財付通合作商戶ID,此為演示示例 //??????????? payInfo.put("order_type", "1"); ????????????? payInfo.put("caller", "com.tenpay.android.appDemo"); ????????????? ????????????? //去支付 ????????????? tenpayHelper.pay(payInfo, mHandler, MSG_PAY_RESULT); |
財付通的服務費率是1%,另外有相關的套餐可以優惠。
三、??易寶支付平臺集成
與支付寶和財付通不同的是,易寶集成時,并沒有提供一個支付應用apk,只有一個jar包。是一個library project。因為在集成時,需要在manifest文件里面聲明支付頁面的activity。同時在調用支付頁面時,需要用startActivityForResult方式進入,支付結果會通過onActivityResult方法返回。易寶同樣支持服務端回調,但比較糾結的是,易寶的服務端回調url,不能在代碼中傳入,需要在易寶的網站進行配置。只有支付成功時才會觸發此回調,以get方式調用。
調用支付接口的代碼如下:其中customerNumber參數是簽約之后才能獲取到的。requestId為調用方自定義的訂單流水號。
| private void startPay(String customerNumber, String chennal) { ?????? String amount = etAmount.getText().toString(); ?????? String productName = etProductName.getText().toString(); ?????? String productDesc = etProductDesc.getText().toString(); ?????? ?????? if(TextUtils.isEmpty(productName) || TextUtils.isEmpty(amount)) { ?????????? Toast.makeText(YeepayExampleActivity.this, "", Toast.LENGTH_SHORT); ?????? } ?????? ?????? Intent intent = new Intent(getBaseContext(), YeepayPlugin.class); ?????? intent.putExtra("customerNumber", customerNumber); ?????? ?????? Random random = new Random(); ?????? String time = "" + System.currentTimeMillis(); ?????? String requestId = time + random.nextInt() % 10000; ?????? ?????? intent.putExtra("requestId", requestId); ?????? intent.putExtra("amount",? amount); ?????? intent.putExtra("productName", productName); ?????? intent.putExtra("time", time); ?????? intent.putExtra("productDesc", (productDesc == null) ? "" : productDesc); ?????? intent.putExtra("support", chennal); ?????? intent.putExtra("environment", "ENV_TEST" );? ?????? ?????? StringBuilder builder = new StringBuilder(); ?????? builder.append(CUSTOMER_NUMBER).append("$"); ?????? builder.append(requestId).append("$"); ?????? builder.append(amount).append("$"); ?????? builder.append(productName).append("$"); ?????? builder.append(time); ?????? ?????? String hmac = YeepayUtils.hmacSign(builder.toString(), KEY); ? ??? Log.e("YeepayExampleActivity", "hmac" + hmac); ? ?????? intent.putExtra("hmac", hmac); ?????? startActivityForResult(intent, 200); ??? } |
易寶集成后的費率需要和易寶的客戶經理面談決定
四、??銀聯在線支付集成
銀聯的支付應用同支付寶和財付通相同,采用的是獨立apk的方式提供服務。調用支付接口采用的startActivity的方式,相關參數通過bundle傳遞,調用示例如下:
| bundle.putBoolean(USE_TEST_MODE, true); ??????????? ??????????? bundle.putString(SP_ID, "0009"); ??????????? bundle.putString(SECURITY_CHIP_TYPE, null); ??????????? bundle.putString(SYS_PROVIDE, "00000001"); ??????????? bundle.putString(PAY_DATA, payData);??? … Intent startIntent = new Intent(); ??????????? // startIntent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); ??????????? startIntent.putExtras(bundle); ??????????? startIntent.setClassName(UPPayUtils.PACKAGE_NAME, ??????????????????? UPPayUtils.ACTIVITY_NAME); //??????????? activity.startActivityForResult(startIntent, UPPayUtils.STARTE_UPPAY); ??????????? activity.startActivity(startIntent); |
與以上三種支付平臺不同的是,銀聯支付接口的返回值是通過廣播的形式發送的。不支持商戶服務端的回調url。
五、??Google in-app billing集成
Google的支付服務不同于以上任何平臺,主要依賴于google play,交易的細節完全在google play中完成,商戶客戶端通過ipc發生支付請求,采用廣播進行通信,傳遞數據。同時,也與國內第三方平臺不同的是,應用內的付費產品,道具,需要在google play網站上進行設定,訂單信息是google play控制的。
不需要特別的賬號,簽約之類的繁瑣的過程,任何一個開發者都可以集成此服務,只需要有一個開發者賬號(用來發布產品的),和一個google電子錢包賬號,但是交易費貌似是30%- -!paypal只有5%。Google定義的購買方式有兩種,一種是限定賬戶的,通過這種方式,一次購買,永久有效,交易信息由google保存,當用戶再次購買此種商品時,會彈出提示。此類方式的好處在于,當發生用戶清理掉data或者卸載重裝之類的情況時,可以調用接口從google取回交易信息。另一種是不限定賬戶的,即用戶可以反復購買,交易信息是商家自己保存的。
交易的流程如下:
1.?? App通過aidl定義的接口,發送購買請求(REQUEST_PURCHASE),指定一個產品ID和其他參數。
2.?? Google Play App發送一個廣播,廣播的intent中包含3個鍵:RESPONSE_CODE, PURCHASE_INTENT, and REQUEST_ID。其中PURCHASE_INTENT是一個pending intent 用于啟動交易頁面。
3.?? 調用該 pending intent。
4.?? 當結賬流程結束(用戶成功購買了貨物或者取消了購買),Google Play發送一個通知消息(IN_APP_NOTIFY 廣播)。這個通知消息包括了指向該交易的通知ID。
5.?? 商戶客戶端調用aidl接口,傳入GET_PURCHASE_STATE_CHANGED參數來請求交易信息,同時傳入之前收到的通知id。
6.?? Google Play發送交易信息,信息保存在PURCHASE_STATE_CHANGED 廣播 intent中。
7.?? 商戶客戶端發送一個確認消息(CONFIRM_NOTIFICATIONS)來確認接收到了給定通知ID的交易信息。
另外,集成此服務需要在manifest文件中加入com.android.vending.BILLING權限。
參考信息見 http://developer.android.com/guide/google/play/billing/billing_overview.html
相關資料:http://wenku.baidu.com/view/f253e2caa1c7aa00b52acb37.html&qq-pf-to=pcqq.group
該微博裝載之 :http://blog.csdn.net/shanpengfei77/article/details/8161089?
為無私奉獻者致敬。
總結
以上是生活随笔為你收集整理的android支付平台集成调研 .的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 习题6.10
- 下一篇: 速度翻倍 SAS 6Gb/s接口性能全揭