呼叫第三方介面~支付寶
你是大神,就別看了,浪費時間。
這次遇到 對接支付寶支付,真的很難受。 大家都說簡單,確實! 到最後,一大神幫我寫了,就幾行程式碼 【捂臉】 ,呵呵了~
這幾天都睡不好,本來專案說不用接支付的,到後來要了,無語!
廢話不多說,開始吧!
--------------------------------------------------------------------------------------------------------------------
前幾天後臺哥給我一個文件,是介面支付文件,裡面有兩個連結,還有四個引數。(這是後話:到後來我才知道,兩個連結只要其中一個就行了,我就無語了。 我開始以為兩個都要用到,都要呼叫
然後我看官方文件,要 賬號、公鑰、祕鑰 ,但是我只有 後臺哥給的兩介面!兩介面!心裡無語,就只能還是看官方文件了
第一步肯定是下載官方demo啊,然後執行!如圖:
搞毛啊,支付失敗! 其實是沒有賬號、公鑰之類的 ,就是這些如圖:
然後看著文件、看著demo, 可是我只有兩個介面啊!! 沒辦法,我技術菜,所以就百度啊,結果網上全部都是官網文件拿過來抄一遍,好點的,就寫幾句,基本上也是官方demo。 心裡頓時無數個神獸在狂奔!!
就算是狂奔那也要接入自己的專案中啊,所以先把官方能用的都拿過來用。 像 SDK、 Manifest、類,都是直接拿過來用的。如圖:
因為我沒有賬號之類的,所以支付失敗
好! 這些都拷貝到專案中。然後就做最重要的了。寫程式碼!!
先看效果圖吧(如下)
這個介面主要是 EditText 和 RecyclerView ,按鈕是TextView。
介面的話說起來也簡單,沒什麼難的,網上搜索一大堆,就不說了。這篇文章主要說對接 後臺哥 給的介面,讓我吐血幾桶的介面!!
還是看文件吧:
orderInfo 是訂單資訊,難道是把 支付介面放在這裡? 錯!
這裡是拼接訂單資訊的變數,肯定是要放在點選事情中,例如官方demo的點選事件:
經過一段時間的研究,我基本上弄懂了,但是要前面說的賬號之類的,而我只有兩個介面和四個引數。 摸瞎 沒辦法,就各種試~ 結果還是不行。 然後去群裡問,結果被人鄙視了。說對接支付寶最簡單,好簡單。就微信難點。
不吐槽了~ 弱雞就是弱雞!
--------------------------------------------------------------------------------------------------------------------------------------------
按我這個介面,要支付的話,肯定要有 訂單號、標題、內容、金額。如圖:
getOutTradeNo 就是訂單號,我看了網上都是以時間來定義訂單號的,這也是我看的最多的,但是大神肯定有其他辦法,我就選了這個簡單的。
payV2(View v) 這是 提交按鈕 的點選事件,這個是根據官方demo寫的,我覺得這樣寫真的很省事,就用了。連 類名 我都沒改。哈哈哈!
這四個 變數用 log,.e(); 都是可以打印出來的。這就前進了一小步。
然後就是呼叫支付介面了。這是後臺哥給的介面文件:
到了這一步,我基本上就抓瞎了,真的不知道怎麼弄, 然後在群裡問,群裡大神說你先搞一個 網路請求, 就是網路結構。 看文件是用get 和 post 請求。然後我在網上找,還是不會對接。
終於就在昨天,一個大神伸出援助之手!! 因為大神說的理論的懂,而且支付邏輯我也知道,就是不會寫,然後實在是不想浪費大神時間(大神是真心幫的解答),然後我無恥我說:大神幫我寫吧,這樣就不會浪費你時間。
誒~
---------------------------------------------------------------------------------------------------------------------------------------------------------------
開始 :是寫 map.put(); 把要傳的值都put 出來。
還有兩個工具類:
HttpUtil
public static String getUrlParamsByMap(Map<String, Object> map) { if (map == null) { return ""; } StringBuffer sb = new StringBuffer(); for (Map.Entry<String, Object> entry : map.entrySet()) { sb.append(entry.getKey() + "=" + entry.getValue()); sb.append("&"); } String s = sb.toString(); if (s.endsWith("&")) { s = s.substring(0, s.length() - 1); } return s; }
和 JsonUtils
/** * 把一個map變成json字串 * @param map * @return */ public static String parseMapToJson(Map<?, ?> map) { try { Gson gson = new Gson(); return gson.toJson(map); } catch (Exception e) { } return null; } /** * 把一個json字串變成物件 * @param json * @param cls * @return */ public static <T> T parseJsonToBean(String json, Class<T> cls) { Gson gson = new Gson(); T t = null; try { t = gson.fromJson(json, cls); } catch (Exception e) { } return t; } /** * 把json字串變成map * @param json * @return */ public static HashMap<String, Object> parseJsonToMap(String json) { Gson gson = new Gson(); Type type = new TypeToken<HashMap<String, Object>>() { }.getType(); HashMap<String, Object> map = null; try { map = gson.fromJson(json, type); } catch (Exception e) { } return map; } /** * 把json字串變成集合 * params: new TypeToken<List<yourbean>>(){}.getType(), * * @param json * @param type new TypeToken<List<yourbean>>(){}.getType() * @return */ public static List<?> parseJsonToList(String json, Type type) { Gson gson = new Gson(); List<?> list = gson.fromJson(json, type); return list; } /** * * 獲取json串中某個欄位的值,注意,只能獲取同一層級的value * * @param json * @param key * @return */ public static String getFieldValue(String json, String key) { if (TextUtils.isEmpty(json)) return null; if (!json.contains(key)) return ""; JSONObject jsonObject = null; String value = null; try { jsonObject = new JSONObject(json); value = jsonObject.getString(key); } catch (JSONException e) { e.printStackTrace(); } return value; } }
把這兩個類搞好後,還得 加一個
compile 'com.squareup.retrofit2:converter-gson:2.0.1'
,不加的話,肯定報錯!最後最重要的就是這段程式碼了,就這段程式碼完成支付:
(對你有用就點個贊吧,希望能幫到你)