Android支付——支付寶支付

相比之前的支付寶sdk,新版的sdk不再判斷App客戶端是否安裝了支付寶客戶端泞辐。如果用戶安裝了支付寶贡羔,將跳到支付寶客戶端支付派继;如果用戶沒有安裝支付寶客戶端,將跳到 sdk中的H5PayActivity 中進行支付捌袜。xml中需要對這個H5Pay進行聲明。
下文為對支付寶demo的使用整理。猎提。


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

有的demo中自己搞了一個H5PayActivity,完全沒必要旁蔼,只會誤導锨苏。。棺聊。

一伞租、支付流程

  1. 拼裝支付寶認同的訂單信息--orderInfo
  2. 對訂單做RSA 簽名---sign
  3. 對簽名后的訂單信息做URL編碼---sign
  4. 拼裝完整的訂單信息,即orderInfo+sign+簽名方式(固定)
  5. 進行支付(異步任務)

二限佩、支付前準備

  1. PARTNER 商戶PID
  2. SELLER 商戶收款方賬號
  3. RSA_PRIVATE 商戶私鑰葵诈,pkcs8 格式
  4. alipay_notify 支付寶異步通知地址,同自家服務端商量
  5. 支付寶sdk

三祟同、開始支付

  • 拼裝訂單信息orderInfo
    //s為商品的價格作喘,單位為元!D涂鳌;捕肌!
    String orderInfo = getOrderInfo("商品名", "商品描述", “商品價格广辰,s);

    /**
    * create the order info. 創(chuàng)建訂單信息
    */
    private String getOrderInfo(String subject, String body, String price) {
    // 簽約合作者身份ID
    String orderInfo = "partner=" + "\"" + Constans.PARTNER + "\"";
    // 簽約賣家支付寶賬號
    orderInfo += "&seller_id=" + "\"" + Constans.SELLER + "\"";
    // 商戶網(wǎng)站唯一訂單號---我們是由服務器返回的
    orderInfo += "&out_trade_no=" + "\"" + out_Trade + "\"";
    // 商品名稱
    orderInfo += "&subject=" + "\"" + subject + "\"";
    // 商品詳情
    orderInfo += "&body=" + "\"" + body + "\"";
    // 商品金額
    orderInfo += "&total_fee=" + "\"" + price + "\"";
    // 服務器異步通知頁面路徑
    orderInfo += "&notify_url=" + "\"" + Constans.alipay_notify + "\"";
    // 服務接口名稱暇矫, 固定值
    orderInfo += "&service=\"mobile.securitypay.pay\"";
    // 支付類型主之, 固定值
    orderInfo += "&payment_type=\"1\"";
    // 參數(shù)編碼, 固定值
    orderInfo += "&_input_charset=\"utf-8\"";
    // 設置未付款交易的超時時間
    // 默認30分鐘李根,一旦超時槽奕,該筆交易就會自動被關(guān)閉。
    // 取值范圍:1m~15d房轿。
    // m-分鐘粤攒,h-小時,d-天囱持,1c-當天(無論交易何時創(chuàng)建夯接,都在0點關(guān)閉)。
    // 該參數(shù)數(shù)值不接受小數(shù)點纷妆,如1.5h盔几,可轉(zhuǎn)換為90m。
    orderInfo += "&it_b_pay=\"30m\"";
    // extern_token為經(jīng)過快登授權(quán)獲取到的alipay_open_id,帶上此參數(shù)用戶將使用授權(quán)的賬戶進行支付
    //orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
    // 支付寶處理完請求后掩幢,當前頁面跳轉(zhuǎn)到商戶指定頁面的路徑逊拍,可空
    orderInfo += "&return_url=\"m.alipay.com\"";
    return orderInfo;    }
  • 對訂單信息做RSA 簽名
    String sign = sign(orderInfo);

  //SignUtils為支付寶demo中的類,SignUtils中用到的Base64也是demo中的類,復制即可
  private String sign(String content) {
  return SignUtils.sign(content, Constans.RSA_PRIVATE);
  }
  • 對簽名后的訂單信息做URL編碼
    try {
    /**
    * 僅需對sign 做URL編碼
    */
    sign = URLEncoder.encode(sign, "UTF-8");}
    catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
  • 拼裝支付寶認同的訂單信息
    final String payInfo = orderInfo + "&sign="" + sign + ""&" + getSignType();

  /**
   * get the sign type we use. 獲取簽名方式
   */
   private String getSignType() {
   return "sign_type=\"RSA\"";
   }
  • 調(diào)用支付寶sdk開始支付(異步任務)
    Runnable payRunnable = new Runnable() {
    @Override
    public void run() {
    // 構(gòu)造PayTask 對象
    PayTask alipay = new PayTask(RechargeActivity.this);
    // 調(diào)用支付接口际邻,獲取支付結(jié)果
    String result = alipay.pay(payInfo, true);
    Message msg = new Message();
    msg.what = SDK_PAY_FLAG;
    msg.obj = result;
    mHandler.sendMessage(msg);
    } };
    // 必須異步調(diào)用
    Thread payThread = new Thread(payRunnable);
    payThread.start();}

  Handler中對支付結(jié)果進行獲取
  @SuppressLint("HandlerLeak")
  private Handler mHandler = new Handler() {
  @SuppressWarnings("unused")
  public void handleMessage(Message msg) {
    switch (msg.what) {
        case SDK_PAY_FLAG: {
            PayResult payResult = new PayResult((String) msg.obj);
            /**
             * 同步返回的結(jié)果必須放置到服務端進行驗證(驗證的規(guī)則請看https://doc.open.alipay.com/doc2/
             * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
             * docType=1) 建議商戶依賴異步通知
             */
            //PayResult為demo中的類芯丧,復制
            String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
            String resultStatus = payResult.getResultStatus();
            // 判斷resultStatus 為“9000”則代表支付成功,具體狀態(tài)碼代表含義可參考接口文檔
            if (TextUtils.equals(resultStatus, "9000")) {
                Toast.makeText(RechargeActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); 
               finish();
            } else {
                // 判斷resultStatus 為非"9000"則代表可能支付失敗
                // "8000"代表支付結(jié)果因為支付渠道原因或者系統(tǒng)原因還在等待支付結(jié)果確認世曾,最終交易是否成功以服務端異步通知為準(小概率狀態(tài))
                if (TextUtils.equals(resultStatus, "8000")) {
                    Toast.makeText(RechargeActivity.this, "支付結(jié)果確認中", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "4000")) { 
                   Toast.makeText(RechargeActivity.this, "訂單支付失敗", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "5000")) {
                    Toast.makeText(RechargeActivity.this, "重復請求", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "6001")) {
                    Toast.makeText(RechargeActivity.this, "中途取消", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "6002")) { 
                   Toast.makeText(RechargeActivity.this, "網(wǎng)絡連接出錯", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "6004")) {
                    Toast.makeText(RechargeActivity.this, "支付結(jié)果未知缨恒,請查詢交易記錄", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "其它")) {
                    Toast.makeText(RechargeActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
                }
            }
            break;
        }
        default:
            break;
    }
    }    ;};

到此,支付基本完成轮听,按照官方demo配置應該都可以的肿轨!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蕊程,隨后出現(xiàn)的幾起案子椒袍,更是在濱河造成了極大的恐慌,老刑警劉巖藻茂,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驹暑,死亡現(xiàn)場離奇詭異,居然都是意外死亡辨赐,警方通過查閱死者的電腦和手機优俘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掀序,“玉大人帆焕,你說我怎么就攤上這事〔还В” “怎么了叶雹?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵财饥,是天一觀的道長。 經(jīng)常有香客問我折晦,道長钥星,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任满着,我火速辦了婚禮谦炒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘风喇。我一直安慰自己宁改,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布魂莫。 她就那樣靜靜地躺著透且,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豁鲤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天鲸沮,我揣著相機與錄音琳骡,去河邊找鬼。 笑死讼溺,一個胖子當著我的面吹牛楣号,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怒坯,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炫狱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剔猿?” 一聲冷哼從身側(cè)響起视译,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎归敬,沒想到半個月后酷含,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡汪茧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年椅亚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舱污。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呀舔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扩灯,到底是詐尸還是另有隱情媚赖,我是刑警寧澤霜瘪,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站省古,受9級特大地震影響粥庄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豺妓,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一惜互、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琳拭,春花似錦训堆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至絮缅,卻和暖如春鲁沥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耕魄。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工画恰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吸奴。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓允扇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親则奥。 傳聞我的和親對象是個殘疾皇子考润,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

  • 之前寫了一個關(guān)于微信支付的博文,后來有人問我為什么不寫上一個支付寶支付的呢读处。當初想的是支付寶支付比較簡單糊治,不像微信...
    2c2z0閱讀 2,088評論 0 0
  • 支付寶出了新文檔 現(xiàn)在才知道 記載一下新版與舊版區(qū)別 1 訂單信息生成 舊版當中訂單信息生成內(nèi)容較多 簽名在...
    云沐天閱讀 1,776評論 0 5
  • 最近在做支付寶支付模塊俊戳,集成過程中走了一些彎路。現(xiàn)將集成過程總結(jié)一些馆匿。 這里我直接寫了一個工具類抑胎,需要的時候直接調(diào)...
    poker1face閱讀 1,929評論 1 7
  • 整整一天與大海的親密接觸后阿逃,皮膚還是有些火辣辣的感覺,畢竟太陽是那么熱烈的炙烤著…… 三點半集合,等到全團的人都到...
    葉落塵世閱讀 267評論 0 0
  • 一時書 智庫捐款一元 為白血病患者捐款兩元 二時書 聯(lián)絡祺予恃锉,倪總都沒空搀菩。有怠慢他人的種子 三時書 客戶到公司,堵...
    我不叫許仲斌閱讀 146評論 0 0