调用第三方接口~支付宝
你是大神,就别看了,浪费时间。
这次遇到 对接支付宝支付,真的很难受。 大家都说简单,确实! 到最后,一大神帮我写了,就几行代码 【捂脸】 ,呵呵了~
这几天都睡不好,本来项目说不用接支付的,到后来要了,无语!
废话不多说,开始吧!
--------------------------------------------------------------------------------------------------------------------
前几天后台哥给我一个文档,是接口支付文档,里面有两个链接,还有四个参数。(这是后话:到后来我才知道,两个链接只要其中一个就行了,我就无语了。 我开始以为两个都要用到,都要调用!! )
然后我看官方文档,要 账号、公钥、秘钥 ,但是我只有 后台哥给的两接口!两接口!心里无语,就只能还是看官方文档了
第一步肯定是下载官方demo啊,然后运行!如图:
搞毛啊,支付失败! 其实是没有账号、公钥之类的 ,就是这些如图:
然后看着文档、看着demo, 可是我只有两个接口啊!! 没办法,我技术菜,所以就百度啊,结果网上全部都是官网文档拿过来抄一遍,好点的,就写几句,基本上也是官方demo。 心里顿时无数个神兽在狂奔!!
就算是狂奔那也要接入自己的项目中啊,所以先把官方能用的都拿过来用。 像 SDK、 Manifest、类,都是直接拿过来用的。如图:
因为我没有账号之类的,所以支付失败
好! 这些都拷贝到项目中。然后就做最重要的了。写代码!!
先看效果图吧(如下)
这个界面主要是 EditText 和 RecyclerView ,按钮是TextView。
界面的话说起来也简单,没什么难的,网上搜索一大堆,就不说了。这篇文章主要说对接 后台哥 给的接口,让我吐血几桶的接口!!
还是看文档吧:
orderInfo 是订单信息,难道是把 支付接口放在这里? 错!
这里是拼接订单信息的变量,肯定是要放在点击事情中,例如官方demo的点击事件:
经过一段时间的研究,我基本上弄懂了,但是要前面说的账号之类的,而我只有两个接口和四个参数。 摸瞎 没办法,就各种试~ 结果还是不行。 然后去群里问,结果被人鄙视了。说对接支付宝最简单,好简单。就微信难点。我艹,简单你就帮忙啊,帮我搞一下,我还说了有偿呢!!又不是白占用你时间,我知道大神的时间宝贵。多的没有50-100 肯定是有的(我最近搬家交三付一、买了电瓶车,才过几天就被碰瓷的人讹了500大洋,不说别的,只怪自己不小心、又要还房贷、搬家后还要买点东西,还借了钱,实在是没有多的,但是50-100 还是有的),就当作请大神吃饭吧,可是没有人。 到昨天终于有个大神帮忙了(后话:大神人真的非常好,就是不给我 支付宝账号,无赖。 感谢吧!)
不吐槽了~ 弱鸡就是弱鸡!
--------------------------------------------------------------------------------------------------------------------------------------------
按我这个界面,要支付的话,肯定要有 订单号、标题、内容、金额。如图:
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'
,不加的话,肯定报错!
最后最重要的就是这段代码了,就这段代码完成支付:
(对你有用就点个赞吧,希望能帮到你)