Android 支付寶支付開發(fā)流程

首先奉上調(diào)起支付頁面截圖

301.jpg

一:介紹

項(xiàng)目中要用到支付功能通今,需要支付寶支付爆班、微信支付矩乐、銀聯(lián)支付,所以打算總結(jié)一下傀蚌,方便以后的查閱,也方便大家蘸吓, 用到的地方避免再次被坑善炫。
今天我們就主要介紹一下支付寶支付,其他支付也給出了對(duì)應(yīng)的連接美澳。

在做支付之前销部,在網(wǎng)上也查尋了資料摸航,大多都說制跟,支付接入坑太多舅桩,微信坑最多,銀聯(lián)文檔太復(fù)雜雨膨。
其實(shí)如果接入的多的話擂涛,那些套路都可以繞著走。
網(wǎng)上的經(jīng)驗(yàn)什么的大都是比較老的聊记,比較新的能用到的文章不多(但是好文章還是有的撒妈,對(duì)我?guī)椭埠艽螅旅娼o大家詳細(xì)介紹一下排监,幫助大家繞開坑狰右。

二:交互流程

建議先把開發(fā)文檔仔仔細(xì)細(xì)看一遍,一定要看舆床,剛開始的時(shí)候沒有老老實(shí)實(shí)地看完棋蚌,結(jié)果遇到很多的坑,浪費(fèi)的挺多的時(shí)間的挨队,所以建議一定要好好看看谷暮,特別是交互流程這一部分。

2.1 功能流程

功能流程圖

1.第4步:調(diào)用支付接口:此消息就是本接口所描述的開發(fā)包提供的支付對(duì)象PayTask盛垦,將商戶簽名后的訂單信息傳進(jìn)pay方法喚起支付寶收銀臺(tái)湿弦,訂單格式具體參見“請(qǐng)求參數(shù)說明”。
2.第5步:支付請(qǐng)求:手機(jī)支付寶支付開發(fā)包將會(huì)按照商戶客戶端提供的請(qǐng)求參數(shù)發(fā)送支付請(qǐng)求腾夯。
3.第8步:接口返回支付結(jié)果:商戶客戶端在第4步中調(diào)用的支付接口颊埃,會(huì)返回最終的支付結(jié)果(即同步通知),參見“同步通知參數(shù)說明”蝶俱。
4.第12步:異步發(fā)送支付通知:手機(jī)支付寶支付服務(wù)器端發(fā)送異步通知消息給商戶服務(wù)器端(備注:第12步一定發(fā)生在第6步之后班利,但不一定晚于7~11步),參見“服務(wù)器異步通知參數(shù)說明”跷乐。

2.2 數(shù)據(jù)交互

數(shù)據(jù)交互圖

支付寶支付的功能流程相比較微信支付來說簡單的很肥败,如上面兩張圖展示的,我們的App(也就是商戶客戶端)所做的大概只有三個(gè)步驟:

生成訂單
調(diào)用支付寶接口愕提,發(fā)送訂單
返回訂單支付結(jié)果并處理

三:下載支付寶SDK

支付寶業(yè)務(wù)眾多馒稍,真想找到想要的支付sdk還是要費(fèi)一番功夫的,這里給出了最新的sdk地址(注意的是下載出來的SDK包里面并沒有傳說中的開發(fā)文檔浅侨,需要其他地方找或者看網(wǎng)頁上的)纽谒。

想要接入支付寶移動(dòng)支付功能,必須在支付寶商家服務(wù)平臺(tái)進(jìn)行申請(qǐng)與審核如输。移動(dòng)支付功能需要企業(yè)或者個(gè)體工商戶進(jìn)行申請(qǐng)鼓黔,審核通過之后方可使用央勒。
如何與支付寶簽約并審核請(qǐng)參考官方文檔:移動(dòng)支付-接入指南,里面詳細(xì)介紹了產(chǎn)品簽約與審核流程澳化。并且詳細(xì)介紹了申請(qǐng)成功之后如何查看或生成必要的一些配置參數(shù)崔步。

四:導(dǎo)入開發(fā)SDK

4.1 如果項(xiàng)目開發(fā)使用的Eclipse軟件,導(dǎo)入步驟如下:

1.將alipaySDK-20150602.jar包放入商戶應(yīng)用工程的libs目錄下缎谷,如下圖井濒。

101.png

2.進(jìn)入商戶應(yīng)用工程的Java Build Path,將libs目錄下的alipaySDK-20150602.jar導(dǎo)入列林,如下圖瑞你。

102.png

3.選中Order and Export,勾選alipaySDK-20150602.jar希痴,如下圖者甲。

103.png

4.2 如果項(xiàng)目開發(fā)使用的Android Studio軟件,導(dǎo)入步驟如下:

1.將支付寶SDK拷貝到項(xiàng)目libs文件夾下砌创,如果沒有l(wèi)ibs文件夾虏缸,就新建一個(gè)。

201.png

2.如果sdk使用過程中纺铭,提示找不到文件寇钉。
進(jìn)行如下操作,選中sdk文件舶赔,右擊選擇Reveal in Finder

202.png

五:修改AndroidManifest.xml配置

1.在商戶應(yīng)用工程的AndroidManifest.xml文件里面添加聲明:

<activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" >
</activity>
<activity
            android:name="com.alipay.sdk.auth.AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" >
 </activity>

和權(quán)限聲明:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

六:添加混淆規(guī)則

在商戶應(yīng)用工程的proguard-project.txt里添加以下相關(guān)規(guī)則:

-libraryjars libs/alipaySDK-20150602.jar
 
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}

第一行中的alipaySDK-20150602.jar扫倡,其中20150602是此版本發(fā)布的日期,注意將其修改為你導(dǎo)入的Jar的相應(yīng)的文件名竟纳。

到這里撵溃,支付寶支付的前期配置已經(jīng)完成,下面需要完成支付代碼編寫锥累。

七:支付接口調(diào)用

  1. 在點(diǎn)擊支付按鈕的點(diǎn)擊事件中缘挑,我提供的是從后端獲取訂單字符串,然后調(diào)用支付寶接口桶略,調(diào)起支付语淘。
  2. 需要在新線程中調(diào)用支付接口。代碼如下:
//    支付按鈕
    public void onClick(View view) {
        //起一個(gè)線程
        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                String data = null;
                PayBean payBean = new PayBean();
                payBean.setOrderTime("");
                String json = new Gson().toJson(payBean);
                //json為獲取后端結(jié)果時(shí)需要提供給后端訂單信息际歼,例如:時(shí)間惶翻、金額、訂單屬性等
                Log.i("charge request", json);
                try {
                    //data為后端返回?cái)?shù)據(jù)鹅心,其中包括訂單字符串
                    data = postJson(CHARGE_URL, json);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // Json解析data
                ChargeBean charge = new Gson().fromJson(data, ChargeBean.class);
                //獲取調(diào)起支付所需要的字符串credential
                String credential = (String) charge.getResult().getCredential();
                // 調(diào)起支付界面
                PayTask alipay = new PayTask(ThirdActivity.this);
                Map<String, String> result = alipay.payV2(credential, true);
                //在mHandler中處理支付寶返回結(jié)果
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        // 必須異步調(diào)用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }
  1. 在mHandler中處理支付結(jié)果
private Handler mHandler = new Handler() {

        public void handleMessage(Message msg) {
            if (msg.what == SDK_PAY_FLAG) {

                Toast.makeText(ThirdActivity.this, (String) msg.obj,
                        Toast.LENGTH_LONG).show();

                PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                /**
                 對(duì)于支付結(jié)果吕粗,請(qǐng)商戶依賴服務(wù)端的異步通知結(jié)果。同步通知結(jié)果旭愧,僅作為支付結(jié)束的通知颅筋。
                 */
                String resultInfo = payResult.getResult();// 同步返回需要驗(yàn)證的信息
                String resultStatus = payResult.getResultStatus();
                // 判斷resultStatus 為“9000”則代表支付成功宙暇,具體狀態(tài)碼代表含義可參考接口文檔
                if (resultStatus.equals("9000")) {
                    Toast.makeText(ThirdActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                }else if (resultStatus.equals("4000")){

                    // 4000為支付失敗,包括用戶主動(dòng)取消支付议泵,或者系統(tǒng)返回的錯(cuò)誤
                    Toast.makeText(ThirdActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();

                }else if (resultStatus.equals("6001")){

                    // 6001為取消支付占贫,或者系統(tǒng)返回的錯(cuò)誤
                    Toast.makeText(ThirdActivity.this, "取消支付", Toast.LENGTH_SHORT).show();

                }else if (resultStatus.equals("8000")) {
                    // "8000"代表支付結(jié)果因?yàn)橹Ц肚涝蚧蛘呦到y(tǒng)原因還在等待支付結(jié)果確認(rèn),最終交易是否成功以服務(wù)端異步通知為準(zhǔn)(小概率狀態(tài))
                    Toast.makeText(ThirdActivity.this, "支付結(jié)果確認(rèn)中", Toast.LENGTH_SHORT).show();
                }else {
                    // 其他為系統(tǒng)返回的錯(cuò)誤
                    Toast.makeText(ThirdActivity.this, "支付錯(cuò)誤", Toast.LENGTH_SHORT).show();
                    
                }
            }
        }
    };

以下四種為常用結(jié)果判斷

9000為支付成功
4000為支付失敗
6001為取消支付
8000為支付結(jié)果確認(rèn)中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肢簿,一起剝皮案震驚了整個(gè)濱河市靶剑,隨后出現(xiàn)的幾起案子蜻拨,更是在濱河造成了極大的恐慌池充,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缎讼,死亡現(xiàn)場離奇詭異收夸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)血崭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門卧惜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夹纫,你說我怎么就攤上這事咽瓷。” “怎么了舰讹?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵茅姜,是天一觀的道長。 經(jīng)常有香客問我月匣,道長钻洒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任锄开,我火速辦了婚禮素标,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萍悴。我一直安慰自己头遭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布癣诱。 她就那樣靜靜地躺著计维,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狡刘。 梳的紋絲不亂的頭發(fā)上享潜,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音嗅蔬,去河邊找鬼剑按。 笑死疾就,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艺蝴。 我是一名探鬼主播猬腰,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼猜敢!你這毒婦竟也來了姑荷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤缩擂,失蹤者是張志新(化名)和其女友劉穎鼠冕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胯盯,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懈费,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了博脑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憎乙。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叉趣,靈堂內(nèi)的尸體忽然破棺而出泞边,到底是詐尸還是另有隱情,我是刑警寧澤疗杉,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布阵谚,位于F島的核電站,受9級(jí)特大地震影響乡数,放射性物質(zhì)發(fā)生泄漏椭蹄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一净赴、第九天 我趴在偏房一處隱蔽的房頂上張望绳矩。 院中可真熱鬧,春花似錦玖翅、人聲如沸翼馆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽应媚。三九已至,卻和暖如春猜极,著一層夾襖步出監(jiān)牢的瞬間中姜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丢胚,地道東北人翩瓜。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像携龟,于是被迫代替她去往敵國和親兔跌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容