1. 程式人生 > >android支付平臺整合調研

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_PAYthis);

           if (bRet) {

              // show the progress bar to indicate that we have started

              // paying.

              // 顯示正在支付進度條

              closeProgress();

              mProgress = BaseHelper.showProgress(thisnull"正在支付"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, mHandlerMSG_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_MODEtrue);

            bundle.putString(SP_ID"0009");

            bundle.putString(SECURITY_CHIP_TYPEnull);

            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許可權。

相關推薦

android支付平臺整合調研

關於線上支付平臺,目前國內主要有以下幾種 paypal 支付寶,財付通,盛付通,易寶支付,快錢,銀聯線上,國付寶,網易寶,匯付天下等等。 手機支付平臺,調研了支付寶,支付寶,財付通,盛付通,paypal,易寶支付,銀聯線上,google in-app billing。其

android 支付整合 使用常見錯誤

1:自己近期在做了支付。遇到了一下問題先總結例如以下 第一條: Android快捷支付SDK Demo resultStatus={4001};memo={引數錯誤};result={}問題 分析:填寫的支付寶pkcs8編碼的私鑰 有問題。或

Android 支付整合Demo

一、申請移動支付許可權 首先登入【支付寶開放平臺】http://open.alipay.com/platform/home.htm,新增應用,申請移動支付許可權。申請開通支付,是需要公司檔案的,個人是不允許開始支付的。 具體細節就不再詳聊了,下面就講講如何將阿里給出的de

Android支付整合流程及其常見錯誤

一、你需要關心的東西 1.申請與認證(這不是這篇文章的重點,如有需要我會單獨寫一篇) 2.服務端的搭建(簽名,同樣很多坑) 3.金鑰的生成 二、金鑰生成 第一步就一大坑,為了個金鑰支付寶出了4個工具!你沒看錯,就是4個。寫一個不行嗎…剛

React Native (IOS和Android) 支付寶和微信支付整合實戰(支付Android篇)

序言:React Native無論是在社群和應用程度上,在國內外是十分廣泛和普及的。而支付寶和微信在支付模組上都有或多或少的支援,雖然沒有完整的Demo,不過在我做過一個相關整合的專案後,在此我把相關的步驟和方法總結出來和大家分享,希望能夠幫助大家少走彎路,快速整合。 支付

Android專案中整合華為賬號登入、支付

最近專案中集成了華為賬號登入與支付的功能,把踩過的坑和過程記錄下來。 先看下支付效果圖:  支付價格0.01請忽略,因為這是為了測試用的。 剛開始接到這個專案的時候我很奇怪,為什麼要整合華為支付呢,原有的微信和支付寶已經能夠滿足專案需求,難道還有客戶偏偏要用華為支付的?看

Android版使用移動廣告平臺整合Google Mobile Ads SDK教程

一:要求 1.請確保您使用的是最新版本的Android SDK,且編譯所針對的至少是Androidv3.2(將project.properties中的target設為android-13)。 2.Google Mobile Ads SDK(Android版)要求使用Andr

React Native (IOS和Android) 支付寶和微信支付整合實戰(微信IOS篇)

序言:React Native無論是在社群和應用程度上,在國內外是十分廣泛和普及的。而支付寶和微信在支付模組上都有或多或少的支援,雖然沒有完整的Demo,不過在我做過一個相關整合的專案後,在此我把相關的步驟和方法總結出來和大家分享,希望能夠幫助大家少走彎路,快速整合。 微信

Android支付寶 微信支付 簡單整合

最近專案需求 改版了支付方式,支付寶  微信都切換了 海外版,還集成了paypal,前幾天隨手記錄了一下paypal的整合,今天 整理一下 支付寶 和微信的,支付寶 微信 賬戶申請 應用建立就不說了,截圖太麻煩,這裡只貼 一些 關鍵程式碼片段,假設 支付寶 微信  賬號申請

android開發如何整合支付寶sdk

專案整合支付寶支付有挺長一段時間了,閒來沒事總結下,給心存疑惑的人以指導,大神無視即可。 android整合支付寶其實是一件很簡單的事情。後臺的事情咱們不考慮。對於客戶端而言,總結四步: 第一步:拷貝支付寶sdk到你的專案中,並做相關配置。 第二步:根據後

Thinkphp各大支付平臺線上支付整合原始碼

用Thinkphp給客戶開發網站的時候需要用到各大平臺付款功能,下面就免費分享給大家,此類是個成熟類,經過測試了(可以直接拿來使用,附帶使用方法,有需要的朋友請拿走。), 如果有需要安裝的演示請登陸“二當家的”檢視:http://www.erdangjiade.com/php/524.ht

關於android微信支付支付支付整合

最近專案中要整合微信和支付寶支付 在沒有接觸支付之間 覺得還是比較難的 但真正去實現的時候還是比較簡單的 就是有不少坑要去踩過之後才知道 支付寶支付 : 對於支付寶支付 我個人理解還是比較簡單的 https://open.alipay.com/platform/home.h

Android 3分鐘整合微信支付

一.長話短說,微信支付和支付寶支付一樣,分為三部曲。 a.向伺服器傳送請求,伺服器返回訂單資訊 b.呼叫微信請求發起支付 c.處理回撥結果 (在WXPayEntryActivity的onResp方法中,詳見如下步驟3) 二.直接上步驟:1.依賴://微信支付 c

Android微信支付功能整合【全攻略】

遵循:BY-SA 作者:譚東 時間:2016年10月28日 環境:Windows 7 Android版微信支付官方文件和Demo問題很多,官方也沒有及時更新和細化開發整合文件。 這裡分享我整合Android客戶端微信支付的思路和部分程式碼。希望對大家有幫

淺談android接入銀聯,支付支付平臺的方式

// 建立支付寶訂單資訊private String getNewOrderInfo(Pay pay) {StringBuilder sb = new StringBuilder();sb.append("partner=\"");sb.append(Keys.DEFAULT_PARTNER);sb.app

Android 支付寶和微信支付整合

場景 隨著移動支付的興起,在我們的app中,會經常有整合支付的需求.這時候一般都會採用微信和支付寶的sdk 來整合 支付寶支付 在使用支付寶支付的過程中,我們是在伺服器端生成訂單,客戶端訪問介面,得到訂單資訊.然後調起支付,支付成功後支付寶會分別 非同步呼叫伺服器端

Android移動開發-在Android專案裡整合呼叫微信支付開發的實現

如今移動支付比較火,尤其是在中國的市場。移動支付也稱為手機支付,就是允許使用者使用其移動終端(通常是手機)對所消費的商品或服務進行賬務支付的一種服務方式。單位或個人通過移動裝置、網際網路或者近距離感測直接或間接向銀行金融機構傳送支付指令產生貨幣支付與資金轉

Android 3分鐘整合支付支付

一.話不多說,直接上步驟。image.png2.在app的.gradle檔案中引入此jar包//支付寶支付 compile files('libs/alipaySdk-20170922.jar') 3.清單檔案 即AndroidManifest.xml檔案中宣告支付所需的ac

React Native (IOS和Android) 支付寶和微信支付整合實戰(微信支付服務端篇)

序言:React Native無論是在社群和應用程度上,在國內外是十分廣泛和普及的。而支付寶和微信在支付模組上都有或多或少的支援,雖然沒有完整的Demo,不過在我做過一個相關整合的專案後,在此我把相關的步驟和方法總結出來和大家分享,希望能夠幫助大家少走彎路,快速整合。 微信

React Native (IOS和Android) 支付寶和微信支付整合實戰(支付寶服務端篇)

序言:React Native無論是在社群和應用程度上,在國內外是十分廣泛和普及的。而支付寶和微信在支付模組上都有或多或少的支援,雖然沒有完整的Demo,不過在我做過一個相關整合的專案後,在此我把相關的步驟和方法總結出來和大家分享,希望能夠幫助大家少走彎路,快速整合。 支