第三方支付之支付寶支付

前言

App開發(fā)中用到的支付有支付寶异剥、微信瑟由、銀聯(lián)卡、pos等冤寿,但最常見的方式就是支付寶和微信支付歹苦,尤其電商項(xiàng)目。閑來沒事總結(jié)一下督怜,以下是集成支付寶支付的個(gè)人心得殴瘦。
首先App添加支付寶支付功能,需要滿足兩點(diǎn)條件号杠。

1:簽約成為支付寶商戶

簽約地址:https://b.alipay.com/痴施, 只有成為簽約商戶的開發(fā)者才能具備集成支付寶app支付的資格。 簽約資料:1)營業(yè)執(zhí)照 2)APP說明文檔 3)商戶經(jīng)營信息、商戶聯(lián)系人等信息

2:集成APP代碼

2.1:導(dǎo)入jar包資源

Eclipse將lib包復(fù)制到lib文件夾下辣吃,Android studio在gradle中可以添加依賴

compile files('libs/alipaySdk-20160223.jar')

2.2:修改AndroidManifest.xml清單

聲明activity

<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" />

2.3:根據(jù)情況添加支付寶混淆規(guī)則

2.4:添加主要代碼(重要)

支付寶數(shù)據(jù)交互流程圖

主要流程分為:
1:app通過下單調(diào)用后臺(tái)接口动遭,然后后臺(tái)服務(wù)器返回簽名后訂單信息
2:app調(diào)起支付寶支付,傳簽名的訂單信息神得,用戶輸入支付寶密碼進(jìn)行支付
3:支付寶返回支付結(jié)果厘惦,app進(jìn)行支付結(jié)果展示,支付寶服務(wù)端異步回調(diào)商戶服務(wù)端即我們自己后臺(tái)服務(wù)端哩簿,后臺(tái)更改訂單狀態(tài)
生成簽名后的訂單信息官方建議安全起見宵蕉,在后臺(tái)服務(wù)端生成,在此我在app端生成方面講解整個(gè)流程节榜。

//生成訂單所需信息
public String getOrderInfo(String order_id,String order_sn,  String price) {
    // 簽約合作者身份ID
    String orderInfo = "partner=" + "\"" + Keys.DEFAULT_PARTNER + "\"";
    // 簽約賣家支付寶賬號(hào)
    orderInfo += "&seller_id=" + "\"" + Keys.DEFAULT_SELLER + "\"";
    // 商戶網(wǎng)站唯一訂單號(hào)
    orderInfo += "&out_trade_no=" + "\"" + order_id+"-"+getTimeByCalendar()+ "\"";
    // 商品名稱
    orderInfo += "&subject=" + "\"" + order_sn + "\"";
    // 商品詳情
    orderInfo += "&body=" + "\"" + order_id + "\"";
    // 商品金額
    orderInfo += "&total_fee=" + "\"" + price + "\"";
    // 服務(wù)器異步通知頁面路徑
    orderInfo += "&notify_url=" + "\"" + payUrlBean.getAlipay_order_pay_notify()
            + "\"";
    // 服務(wù)接口名稱羡玛, 固定值
    orderInfo += "&service=\"mobile.securitypay.pay\"";
    // 支付類型, 固定值
    orderInfo += "&payment_type=\"1\"";
    // 參數(shù)編碼宗苍, 固定值
    orderInfo += "&_input_charset=\"utf-8\"";
    // 設(shè)置未付款交易的超時(shí)時(shí)間  
    // 默認(rèn)30分鐘稼稿,一旦超時(shí),該筆交易就會(huì)自動(dòng)被關(guān)閉讳窟。
    // 取值范圍:1m~15d让歼。
    // m-分鐘,h-小時(shí)丽啡,d-天谋右,1c-當(dāng)天(無論交易何時(shí)創(chuàng)建,都在0點(diǎn)關(guān)閉)补箍。
    // 該參數(shù)數(shù)值不接受小數(shù)點(diǎn)改执,如1.5h,可轉(zhuǎn)換為90m坑雅。
    orderInfo += "&it_b_pay=\"30m\"";
    // extern_token為經(jīng)過快登授權(quán)獲取到的alipay_open_id,帶上此參數(shù)用戶將使用授權(quán)的賬戶進(jìn)行支付
    // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
    // 支付寶處理完請(qǐng)求后天梧,當(dāng)前頁面跳轉(zhuǎn)到商戶指定頁面的路徑,可空
    orderInfo += "&return_url=\"m.alipay.com\"";
    // 調(diào)用銀行卡支付霞丧,需配置此參數(shù)呢岗,參與簽名, 固定值 (需要簽約《無線銀行卡快捷支付》才能使用)
    // orderInfo += "&paymethod=\"expressGateway\"";
    return orderInfo;
}

// 對(duì)訂單信息做RSA 簽名
    String sign = sign(orderInfo);
    try {
        // 僅需對(duì)sign 做URL編碼
        sign = URLEncoder.encode(sign, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    // 完整的符合支付寶參數(shù)規(guī)范的訂單信息
    final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"+ getSignType();

然后app需要調(diào)起支付寶上傳訂單信息

 Runnable payRunnable = new Runnable() {
        @Override
        public void run() {
            // 構(gòu)造PayTask 對(duì)象
            PayTask alipay = new PayTask(OrderConfirmActivity.this);
            boolean exist = alipay.checkAccountIfExist();
            // 調(diào)用支付接口蛹尝,獲取支付結(jié)果
            String result = alipay.pay(payInfo);
            Message msg = new Message();
            msg.what = SDK_PAY_FLAG;
            msg.obj = result;
            mHandler.sendMessage(msg);
        }
    };
    // 必須異步調(diào)用
    Thread payThread = new Thread(payRunnable);
    payThread.start();

根據(jù)支付寶返回的支付結(jié)果展示信息

 private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(android.os.Message msg) {
        switch (msg.what) {
        case RQF_PAY:
            //支付成功
            break;
        case RQF_LOGIN: 
            //支付失敗
            break;
        case SDK_PAY_FLAG: 
        PayResult payResult = new PayResult((String) msg.obj);
        // 支付寶返回此次支付結(jié)果及加簽后豫,建議對(duì)支付寶簽名信息拿簽約時(shí)支付寶提供的公鑰做驗(yàn)簽
        String resultInfo = payResult.getResult();
        String resultStatus = payResult.getResultStatus();
        // 判斷resultStatus 為“9000”則代表支付成功,具體狀態(tài)碼代表含義可參考接口文檔
        if (TextUtils.equals(resultStatus, "9000")) {
            Toast.makeText(OrderConfirmActivity.this, "支付成功",
                    Toast.LENGTH_SHORT).show();
            //支付成功
        } else {
            // 判斷resultStatus 為非“9000”則代表可能支付失敗
            // “8000”代表支付結(jié)果因?yàn)橹Ц肚涝蚧蛘呦到y(tǒng)原因還在等待支付結(jié)果確認(rèn)突那,最終交易是否成功以服務(wù)端異步通知為準(zhǔn)(小概率狀態(tài))
            if (TextUtils.equals(resultStatus, "8000")) {
                Toast.makeText(OrderConfirmActivity.this, "支付結(jié)果確認(rèn)中",
                        Toast.LENGTH_SHORT).show();
            } else {
                // 其他值就可以判斷為支付失敗挫酿,包括用戶主動(dòng)取消支付,或者系統(tǒng)返回的錯(cuò)誤
                Toast.makeText(OrderConfirmActivity.this, "支付失敗",
                        Toast.LENGTH_SHORT).show();
            }
        }
        break;  
        default:
            break;
        }
    };
};

這就是整個(gè)支付流程愕难,最后附上支付寶官網(wǎng)文檔及demo

https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.7WO30X&treeId=59&articleId=103658&docType=1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末早龟,一起剝皮案震驚了整個(gè)濱河市惫霸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葱弟,老刑警劉巖壹店,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芝加,居然都是意外死亡硅卢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門藏杖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來将塑,“玉大人,你說我怎么就攤上這事蝌麸〉懔龋” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵来吩,是天一觀的道長敢辩。 經(jīng)常有香客問我,道長误褪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任碾褂,我火速辦了婚禮兽间,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘正塌。我一直安慰自己嘀略,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布乓诽。 她就那樣靜靜地躺著帜羊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸠天。 梳的紋絲不亂的頭發(fā)上讼育,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音稠集,去河邊找鬼奶段。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剥纷,可吹牛的內(nèi)容都是我干的痹籍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼晦鞋,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蹲缠!你這毒婦竟也來了棺克?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤线定,失蹤者是張志新(化名)和其女友劉穎娜谊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渔肩,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡因俐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了周偎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抹剩。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蓉坎,靈堂內(nèi)的尸體忽然破棺而出澳眷,到底是詐尸還是另有隱情,我是刑警寧澤蛉艾,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布钳踊,位于F島的核電站,受9級(jí)特大地震影響勿侯,放射性物質(zhì)發(fā)生泄漏拓瞪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一助琐、第九天 我趴在偏房一處隱蔽的房頂上張望祭埂。 院中可真熱鬧,春花似錦兵钮、人聲如沸蛆橡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泰演。三九已至,卻和暖如春葱轩,著一層夾襖步出監(jiān)牢的瞬間睦焕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工靴拱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留复亏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓缭嫡,卻偏偏與公主長得像缔御,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妇蛀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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