編輯:關於Android編程
支付寶支付在app項目中非常常見,現在把集成步驟提出了,雖然非常簡單,但是,希望對第一次集成支付的同學有幫助。
要集成別人的東西,第一步當然是去看他的開發文檔,支付寶支付以前是在支付寶開發者平台,現在改成了螞蟻金服開放平台https://open.alipay.com/platform/home.htm。
在開發平台上把SDK下載下來,提取裡面的jar包,放到自己的項目裡面vcTjtcTP7sS/wO/D5qOssrvQ6NKq1/bIzrrO0N64xKO6PGJyIC8+DQo8aW1nIGFsdD0="這裡寫圖片描述" src="/uploadfile/Collfiles/20160913/20160913091955233.png" title="\" />
//======支付寶 // 商戶PID //public static final String PARTNER = ""; // 商戶收款賬號 //public static final String SELLER = ""; // 商戶私鑰,pkcs8格式 public static final String RSA_PRIVATE = ""; // 支付寶公鑰 // public static final String RSA_PUBLIC = //支付結果標志 private static final int SDK_PAY_FLAG = 1;"";
首先看這些變量:
PID商戶號,和賬號是你公司與支付寶簽約時獲取的,這個找你們負責人要,商戶私鑰和公鑰是是配對的,可以通過SDK中的一個應用來生成,一般是後台開發人員去生成。
在項目中可以看到一個pay方法,這個就是調支付寶支付的方法:我們可以看看方法裡的幾個參數:
在pay方法中第一步是將訂單進行簽名,在簽名的方法中需要傳入的參數:有兩個參數是對商品的描述的:subject,body,一個是你後台返回的訂單流水號:out_trade_no,一個是商品的價格:price,還有三個就是剛剛說到的支付寶配置相關參數:partner,seller,notify_url,第一個是商戶pid,第二個是商戶賬號,第三個是支付結果回調地址(這個由你的後台返回的,叫後台給)。後面三個配置參數可以直接寫死的程序了,但是這種方式可維護行太差,一般當你請求後台接口的時候會把這三個參數同時返回,這樣就方便更改。好了,現在把所有的參數都說明白,現在把我跟人的項目按步驟貼上來,注意,我這個代碼是經過改裝的,所以跟demo有一點點不一樣:
第一步、請求我的後台,生成訂單號,同時返回相關支付寶的的配置參數:
asyncHttpHelper = AndroidAsyncHttpHelper.getInstance(); Mapparams = new HashMap<>(); params.put("access_token", sharePreferenceUtil.getToken()); params.put("price", payMoney); params.put("pay", pay); APPLogger.i(Constants.TAG, pay); asyncHttpHelper.get(ChargeActivity.this, Constants.HTTP_URL + "Account/rechargePlatform", params, new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { super.onSuccess(statusCode, headers, response); APPLogger.i(Constants.TAG, "支付寶支付:" + response.toString()); if (response.optBoolean("success")) { JSONObject jsonObject = response.optJSONObject("data"); //回調地址 String notify_url = jsonObject.optString("notify_url"); //訂單號 String out_trade_no = jsonObject.optString("out_trade_no"); //賬戶 String seller_id = jsonObject.optString("seller_id"); //商戶pid String partner = jsonObject.optString("partner"); String subject = jsonObject.optString("subject"); String body = jsonObject.optString("body"); String total_fee = jsonObject.optString("total_fee"); //起調 pay(subject, body, total_fee, out_trade_no,partner,seller_id,notify_url); } } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { super.onFailure(statusCode, headers, responseString, throwable); } }); }
這個是我項目中的一個接口請求,只看返回的參數以及注釋,這裡在你支付過程中的所有參數都有返回,其他可以忽略。
第二步、調用支付寶的pay()方法,把pay方法的所要用的參數全部傳進去,pay方法的具體代碼如下:
//發起支付 private void pay(String subject, String body, String total_fee, String out_trade_no,String partner,String seller,String notify_url) { String oderInfo = getOrderInfo(subject, out_trade_no, body, total_fee,partner,seller,notify_url); /** * 特別注意,這裡的簽名邏輯需要放在服務端,切勿將私鑰洩露在代碼中! */ String sign = sign(oderInfo); try { /** * 僅需對sign 做URL編碼 */ sign = URLEncoder.encode(sign, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } /** * 完整的符合支付寶參數規范的訂單信息 */ final String payInfo = oderInfo + "&sign=\"" + sign + "\"&" + getSignType(); Runnable payRunnable = new Runnable() { @Override public void run() { // 構造PayTask 對象 PayTask alipay = new PayTask(ChargeActivity.this); // 調用支付接口,獲取支付結果 String result = alipay.pay(payInfo, true); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必須異步調用 Thread payThread = new Thread(payRunnable); payThread.start(); } /** * sign the order info. 對訂單信息進行簽名 * * @param content 待簽名訂單信息 */ private String sign(String content) { return SignUtils.sign(content, RSA_PRIVATE); } /** * get the sign type we use. 獲取簽名方式 */ private String getSignType() { return "sign_type=\"RSA\""; } /** * create the order info. 創建訂單信息 */ private String getOrderInfo(String subject, String orderId, String body, String price,String partner,String seller,String notify_url) { // 簽約合作者身份ID String orderInfo = "partner=" + "\"" + partner + "\""; // 簽約賣家支付寶賬號 orderInfo += "&seller_id=" + "\"" + seller + "\""; // 商戶網站唯一訂單號 orderInfo += "&out_trade_no=" + "\"" + orderId + "\""; // 商品名稱 orderInfo += "&subject=" + "\"" + subject + "\""; // 商品詳情 orderInfo += "&body=" + "\"" + body + "\""; // 商品金額 orderInfo += "&total_fee=" + "\"" + price + "\""; // 服務器異步通知頁面路徑 orderInfo += "¬ify_url=" + "\"" + notify_url + "\""; // 服務接口名稱, 固定值 orderInfo += "&service=\"mobile.securitypay.pay\""; // 支付類型, 固定值 orderInfo += "&payment_type=\"1\""; // 參數編碼, 固定值 orderInfo += "&_input_charset=\"utf-8\""; // 設置未付款交易的超時時間 // 默認30分鐘,一旦超時,該筆交易就會自動被關閉。 // 取值范圍:1m~15d。 // m-分鐘,h-小時,d-天,1c-當天(無論交易何時創建,都在0點關閉z)。 // 該參數數值不接受小數點,如1.5h,可轉換為90m。 orderInfo += "&it_b_pay=\"30m\""; // extern_token為經過快登授權獲取到的alipay_open_id,帶上此參數用戶將使用授權的賬戶進行支付 // orderInfo += "&extern_token=" + "\"" + extern_token + "\""; // 支付寶處理完請求後,當前頁面跳轉到商戶指定頁面的路徑,可空 orderInfo += "&return_url=\"m.alipay.com\""; // 調用銀行卡支付,需配置此參數,參與簽名, 固定值 (需要簽約《無線銀行卡快捷支付》才能使用) // orderInfo += "&paymethod=\"expressGateway\""; return orderInfo; }
可以看到,在pay方法中傳入的參數都在getOderInfo方法中,
再看這個方法:
將你demo中的這些參數都替換成你自己的參數,就是你傳入的參數:
好,到這一步,所有的參數已經參數已經配置、更改完成,
最後,再回到這個pay方法,裡面有一個支付結果異步通知,通過這個通知,我們一個知道支付是否成功
對demo中的handler進行稍作修改,這個貼的是我自己項目中的代碼,有些東西你看不懂是什麼的完全可以忽略,你只需要看懂demo就行了:
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); /** * 同步返回的結果必須放置到服務端進行驗證(驗證的規則請看https://doc.open.alipay.com/doc2/ * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665& * docType=1) 建議商戶依賴異步通知 */ String resultInfo = payResult.getResult();// 同步返回需要驗證的信息 String resultStatus = payResult.getResultStatus(); // 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考接口文檔 if (TextUtils.equals(resultStatus, "9000")) { //Toast.makeText(ChargeActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(ChargeActivity.this, ChargeResultActivity.class); Bundle bundle = new Bundle(); bundle.putString("resultStatus", "9000"); bundle.putString("activityFlag","0"); startIntent(ChargeResultActivity.class, bundle, true); } else { // 判斷resultStatus 為非"9000"則代表可能支付失敗 // "8000"代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端異步通知為准(小概率狀態) if (TextUtils.equals(resultStatus, "8000")) { //Toast.makeText(ChargeActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show(); } else { // 其他值就可以判斷為支付失敗,包括用戶主動取消支付,或者系統返回的錯誤 //Toast.makeText(ChargeActivity.this, "支付失敗", Toast.LENGTH_SHORT).show(); } Intent intent = new Intent(ChargeActivity.this, ChargeResultActivity.class); Bundle bundle = new Bundle(); bundle.putString("resultStatus", "8000"); bundle.putString("activityFlag","0"); startIntent(ChargeResultActivity.class, bundle, true); } break; } default: break; } } ; };
到這裡,如果你不覺得我寫的東西完全看不懂,太渣的話,你的支付寶應該能發起支付了。
最後,如果你的手機沒有裝支付寶怎麼辦?之前的sdk裡提供了一個檢測是否安裝支付寶的方法。而現在沒了,現在如果你沒有安裝支付寶,支付寶會調用在他SDK中集成的H5頁面進行支付,只需要在你的項目中的manifest配置文件中加如如下代碼:
要注意的是,你不能修改這個配置裡的任何東西,必須copy,否則沒用。
沒寫過博客,在學習中,寫的不好勿噴,希望指點一二,謝謝!
按照我一開始的打算,上面一篇文章應該是“Android動畫總結系列(5)——屬性動畫源碼分析”,不過屬性動畫源碼分析寫起來
1.git的介紹git是一種項目版本控制工具,公司開發一般多用git,或者svn進行代碼托管,最近,因為項目涉及到多人合作開發,所以趁著有空分享一下經驗,以免各位走彎路。
寫在前面:Googl官方的Android開發文檔關於生命周期的描述給出了這麼一張圖片:我對這張圖片的解讀是這樣的:Activity 類中定義的七個回調方法,覆蓋了活動生命
最近看了一大堆的自定義View多數都可以充當耗時操作的交互界面,再接再厲再傳一個SubmitView,一個和可用於模仿提交等待與用戶交互用的一個自定義View