微信支付传送门:https://www.cnblogs.com/dingxiansen/p/9209159.html

一、支付宝支付

1. 支付宝支付流程图

2. 集成前准备

  1. 去蚂蚁金服注册应用获取appKey等信息
  2. 创建应用,添加APP支付功能
  3. 找到APP支付开发文档,下载 SDK&Demo

3. 开始集成

  1、导入Demo中需要用到的Jar包

    

  2、配置AndroidManifest.xml(这里直接放常用的权限)

  

  1. <!--所需权限-->
  2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  5. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  6. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  7. <uses-permission android:name="android.permission.INTERNET" />
  8. <uses-permission android:name="android.permission.READ_LOGS" />
  9. <uses-permission android:name="android.permission.VIBRATE" />
  10. <uses-permission android:name="android.permission.WAKE_LOCK" />
  11. <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  12.  
  13. <!--广播跳转-->
  14. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  15.  
  16. <!--百度地图-->
  17. <!--百度地图权限-->
  18. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  19. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  20.  
  21. <!--Mob分享-->
  22. <uses-permission android:name="android.permission.GET_TASKS" />
  23. <!-- 短信验证登陆功能需要添加次权限来自动填充验证码,用不到可以去掉 -->
  24. <uses-permission android:name="android.permission.RECEIVE_SMS" />
  25. <uses-permission android:name="android.permission.READ_SMS" />
  26.  
  27. <!--微信支付权限-->
  28. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  29.  
  30. <!--支付宝支付权限-->
  31. <!-- 安卓读写sd权限 -->
  32. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

支付回调

  1. <!--支付宝支付-->
  2. <!-- 支付宝H5页面支付用的 -->
  3. <activity
  4. android:name="com.alipay.sdk.app.H5PayActivity"
  5. android:configChanges="orientation|keyboardHidden|navigation"
  6. android:exported="false"
  7. android:screenOrientation="behind" />
  8. <!-- 支付宝App支付页面用的 -->
  9. <activity
  10. android:name="com.alipay.sdk.auth.AuthActivity"
  11. android:configChanges="orientation|keyboardHidden|navigation"
  12. android:exported="false"
  13. android:screenOrientation="behind" />

3、请求后台接口拿到签过名的信息(appKey,订单信息等等),这里我获取数据,是直接给后台传递的商品id,如果有的需要商品数量直接给传给后台,后台根据id查询出商品的信息,然后返回给前台所需要的支付参数。

  支付宝返回参数用例(开始集成的时候看过好多博客都没有返回参数数据结构,结果一脸懵逼,在这里贴出,未加密之前的0.0):

  

格式化后的:

  1. {
  2. "msg":"success",
  3. "code":200,
  4. "data":"alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=你们申请的app_id&biz_content=%7B%22out_trade_no%22%3A%22HY201806210002%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22subject%22%3A%22%E4%BC%98%E9%93%BA%E4%BC%9A%E5%91%98%E6%9C%8D%E5%8A%A1%E8%B4%B9%22%2C%22total_amount%22%3A%220.01%22%7D&charset=UTF-8&format=json&method=alipay.trade.app.pay&notify_url=http%3A%2F%2F你们的回调地址%2FaliPayCallBack%2FcallBack&sign=buipaoj2F8xl5XCAUVoJz%2Fbh8dHbaoRmdzoAEzqKRJqtZATT4bfFdzSHurAAL5C5gvntFrDTGHgNRGw%2BNZBtG4DfetOzcpHMAyjslrmUIMIr1YGC7Qya04mFBCh%2B0UIa1E7RISZWSbIVCHpZISknNgF2oTuTixNosXvDXzkGYGBUoaxdh1f6%2F%2Bw9lqKz7mkhsUc0x8lCeJHw4MnTS4gSLU%2BDmOCk6Tkiwb4Yv4Mz%2F6j7XReeagfX7qxs5qbObnnPX%2FFmu9T%2BF0LwJaPxr5Xys8kr8E4bhd4f7Y5FimXiw%2BG7EFkY0I69boiRob7zo%2BbWQ%2F53TAMeTXX5RJybEdXhrA%3D%3D&sign_type=RSA2&timestamp=2018-06-21+14%3A11%3A40&version=1.0",
  5. "status":"0"
  6. }

后台返回信息之后接下来就是我们的事情了,调起支付宝进行支付

  1. /*支付宝测试*/
  2. private void testZfbPay(final String key, final String value) {
  3. StringRequest stringRequest = new StringRequest(Request.Method.POST, NetWorkUrl.ZFBPAY, new Response.Listener<String>() {
  4. @RequiresApi(api = Build.VERSION_CODES.M)
  5. @Override
  6. public void onResponse(String s) {
  7. Log.e("GoPayOrderActivity", "-------getJson2-------" + s.toString());
  8.  
  9. /*判断code*/
  10. String code = (JSONObject.parseObject(s.toString()).getString("code"));
  11.  
  12. if (code.equals("200")) {
  13. String orderInfo = (JSONObject.parseObject(s.toString()).getString("data"));//返回的信息
  14. MyALipayUtils.ALiPayBuilder builder = new MyALipayUtils.ALiPayBuilder();
  15.  
  16. builder.build().toALiPay(GoPayOrderActivity.this, orderInfo);
  17. }
  18. }
  19. }, new Response.ErrorListener() {
  20. @Override
  21. public void onErrorResponse(VolleyError volleyError) {
  22.  
  23. }
  24. }) {
  25. @Override
  26. public Map<String, String> getParams() throws AuthFailureError {
  27. Log.e("GoPayOrderActivity", "getParams:-----------------> " + userEntity.getPhone());
  28.  
  29. Map<String, String> map = new HashMap<String, String>();
  30. map.put("account", userEntity.getPhone());
  31. map.put(key, value);
  32. map.put("token", userEntity.getToken());
  33. return map;
  34. }
  35.  
  36. @Override
  37. public Map<String, String> getHeaders() throws AuthFailureError {
  38. HashMap<String, String> headers = new HashMap<String, String>();
  39. if (userEntity.getToken().equals("") && userEntity != null) {
  40. headers.put("Authorization", userEntity.getToken());
  41. }
  42. return headers;
  43. }
  44.  
  45. };
  46. /*设置请求一次*/
  47. stringRequest.setRetryPolicy(
  48. new DefaultRetryPolicy(
  49. 5000,//默认超时时间,应设置一个稍微大点儿的,例如本处的500000
  50. DefaultRetryPolicy.DEFAULT_MAX_RETRIES,//默认最大尝试次数
  51. DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
  52. )
  53. );
  54. AppApplication.getHttpQueues().add(stringRequest);/*请求数据*/
  55. }

MyALipayUtils.java这个类直接copy使用就可以

  1. /**
  2. * Created by dingchao on 2018/3/20.
  3. */
  4.  
  5. public class MyALipayUtils {
  6. private static final int SDK_PAY_FLAG = 1;
  7. private Activity context;
  8. private ALiPayBuilder builder;
  9.  
  10. private MyALipayUtils(ALiPayBuilder builder) {
  11. this.builder = builder;
  12. }
  13.  
  14. private Handler mHandler = new Handler() {
  15. public void handleMessage(Message msg) {
  16.  
  17. // 返回码 含义
  18. // 9000 订单支付成功
  19. // 8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
  20. // 4000 订单支付失败
  21. // 5000 重复请求
  22. // 6001 用户中途取消
  23. // 6002 网络连接出错
  24. // 6004 支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
  25. // 其它 其它支付错误
  26. PayResult payResult = new PayResult((Map<String, String>) msg.obj);
  27. switch (payResult.getResultStatus()) {
  28. case "9000":
  29. MobclickAgent.onEvent(context, "payment_success", "付款成功");
  30. Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show();
  31. AppApplication.finishActivity();
  32. context.finish();
  33. // Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
  34. /*跳转我的会员页面*/
  35. // Intent intent = new Intent(context, MyVipActivity.class);
  36. // context.startActivity(intent);
  37. break;
  38. case "8000":
  39. Toast.makeText(context, "正在处理中", Toast.LENGTH_SHORT).show();
  40. break;
  41. case "4000":
  42. MobclickAgent.onEvent(context, "payment_fali", "付款失败");
  43. Toast.makeText(context, "订单支付失败", Toast.LENGTH_SHORT).show();
  44. break;
  45. case "5000":
  46. Toast.makeText(context, "重复请求", Toast.LENGTH_SHORT).show();
  47. break;
  48. case "6001":
  49. Toast.makeText(context, "已取消支付", Toast.LENGTH_SHORT).show();
  50. break;
  51. case "6002":
  52. Toast.makeText(context, "网络连接出错", Toast.LENGTH_SHORT).show();
  53. break;
  54. case "6004":
  55. Toast.makeText(context, "正在处理中", Toast.LENGTH_SHORT).show();
  56. break;
  57. default:
  58. MobclickAgent.onEvent(context, "payment_fali", "付款失败");
  59. Toast.makeText(context, "支付失败", Toast.LENGTH_SHORT).show();
  60. break;
  61. }
  62. }
  63. };
  64.  
  65. /**
  66. * 签名发在客户端来做。
  67. *
  68. * @param context
  69. */
  70. public void toALiPay(final Activity context) {
  71. this.context = context;
  72. boolean rsa2 = (builder.getRsa2().length() > 0);
  73. Map<String, String> params = buildOrderParamMap(rsa2);
  74. String orderParam = buildOrderParam(params);
  75. String privateKey = rsa2 ? builder.getRsa2() : builder.getRsa();
  76. String sign = getSign(params, privateKey, rsa2);
  77. final String orderInfo = orderParam + "&" + sign;
  78. Log.e("chx", "toALiPay: " + orderInfo);
  79. Runnable payRunnable = new Runnable() {
  80.  
  81. @Override
  82. public void run() {
  83. PayTask alipay = new PayTask(context);
  84. Map<String, String> result = alipay.payV2
  85. (orderInfo, true);
  86. Message msg = new Message();
  87. msg.what = SDK_PAY_FLAG;
  88. msg.obj = result;
  89. mHandler.sendMessage(msg);
  90. }
  91. };
  92.  
  93. Thread payThread = new Thread(payRunnable);
  94. payThread.start();
  95. }
  96.  
  97. /**
  98. * 签名在服务端来做
  99. *
  100. * @param context
  101. * @param orderInfo
  102. */
  103. public void toALiPay(final Activity context, final String orderInfo) {
  104. this.context = context;
  105. Runnable payRunnable = new Runnable() {
  106.  
  107. @Override
  108. public void run() {
  109. PayTask alipay = new PayTask(context);
  110. Map<String, String> result = alipay.payV2
  111. (orderInfo, true);
  112. Message msg = new Message();
  113. msg.what = SDK_PAY_FLAG;
  114. msg.obj = result;
  115. mHandler.sendMessage(msg);
  116. }
  117. };
  118.  
  119. Thread payThread = new Thread(payRunnable);
  120. payThread.start();
  121. }
  122.  
  123. /**
  124. * 构造支付订单参数列表
  125. *
  126. * @param
  127. * @param
  128. * @return
  129. */
  130. private Map<String, String> buildOrderParamMap(boolean rsa2) {
  131. Map<String, String> keyValues = new HashMap<String, String>();
  132.  
  133. keyValues.put("app_id", builder.appid);
  134.  
  135. keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"" + builder.money + "\",\"subject\":\"" + builder.title + "\",\"out_trade_no\":\"" + builder.orderTradeId + "\"}");
  136.  
  137. keyValues.put("charset", "utf-8");
  138.  
  139. keyValues.put("method", "alipay.trade.app.pay");
  140. //回调接口
  141. keyValues.put("notify_url", builder.getNotifyUrl());
  142.  
  143. keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");
  144.  
  145. // keyValues.put("timestamp", "2016-07-29 16:55:53");
  146. keyValues.put("timestamp", getCurrentTimeString());
  147.  
  148. keyValues.put("version", "1.0");
  149.  
  150. return keyValues;
  151. }
  152.  
  153. /**
  154. * 构造支付订单参数信息
  155. *
  156. * @param map 支付订单参数
  157. * @return
  158. */
  159. private String buildOrderParam(Map<String, String> map) {
  160. List<String> keys = new ArrayList<String>(map.keySet());
  161.  
  162. StringBuilder sb = new StringBuilder();
  163. for (int i = 0; i < keys.size() - 1; i++) {
  164. String key = keys.get(i);
  165. String value = map.get(key);
  166. sb.append(buildKeyValue(key, value, true));
  167. sb.append("&");
  168. Log.e("chx", "buildOrderParam: " + buildKeyValue(key, value, true));
  169. }
  170.  
  171. String tailKey = keys.get(keys.size() - 1);
  172. String tailValue = map.get(tailKey);
  173. sb.append(buildKeyValue(tailKey, tailValue, true));
  174.  
  175. return sb.toString();
  176. }
  177.  
  178. /**
  179. * 对支付参数信息进行签名
  180. *
  181. * @param map 待签名授权信息
  182. * @return
  183. */
  184. private String getSign(Map<String, String> map, String rsaKey, boolean rsa2) {
  185. List<String> keys = new ArrayList<String>(map.keySet());
  186. // key排序
  187. Collections.sort(keys);
  188.  
  189. StringBuilder authInfo = new StringBuilder();
  190. for (int i = 0; i < keys.size() - 1; i++) {
  191. String key = keys.get(i);
  192. String value = map.get(key);
  193. authInfo.append(buildKeyValue(key, value, false));
  194. authInfo.append("&");
  195. }
  196.  
  197. String tailKey = keys.get(keys.size() - 1);
  198. String tailValue = map.get(tailKey);
  199. authInfo.append(buildKeyValue(tailKey, tailValue, false));
  200.  
  201. String oriSign = sign(authInfo.toString(), rsaKey, rsa2);
  202. String encodedSign = "";
  203.  
  204. try {
  205. encodedSign = URLEncoder.encode(oriSign, "UTF-8");
  206. } catch (UnsupportedEncodingException e) {
  207. e.printStackTrace();
  208. }
  209. return "sign=" + encodedSign;
  210. }
  211.  
  212. private static final String ALGORITHM = "RSA";
  213.  
  214. private static final String SIGN_ALGORITHMS = "SHA1WithRSA";
  215.  
  216. private static final String SIGN_SHA256RSA_ALGORITHMS = "SHA256WithRSA";
  217.  
  218. private static final String DEFAULT_CHARSET = "UTF-8";
  219.  
  220. private String getAlgorithms(boolean rsa2) {
  221. return rsa2 ? SIGN_SHA256RSA_ALGORITHMS : SIGN_ALGORITHMS;
  222. }
  223.  
  224. private String sign(String content, String privateKey, boolean rsa2) {
  225. try {
  226. PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
  227. Base64.decode(privateKey));
  228. KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);
  229. PrivateKey priKey = keyf.generatePrivate(priPKCS8);
  230.  
  231. java.security.Signature signature = java.security.Signature
  232. .getInstance(getAlgorithms(rsa2));
  233.  
  234. signature.initSign(priKey);
  235. signature.update(content.getBytes(DEFAULT_CHARSET));
  236.  
  237. byte[] signed = signature.sign();
  238.  
  239. return Base64.encode(signed);
  240. } catch (Exception e) {
  241. e.printStackTrace();
  242. }
  243.  
  244. return null;
  245. }
  246.  
  247. /**
  248. * 拼接键值对
  249. *
  250. * @param key
  251. * @param value
  252. * @param isEncode
  253. * @return
  254. */
  255. private String buildKeyValue(String key, String value, boolean isEncode) {
  256. StringBuilder sb = new StringBuilder();
  257. sb.append(key);
  258. sb.append("=");
  259. if (isEncode) {
  260. try {
  261. sb.append(URLEncoder.encode(value, "UTF-8"));
  262. } catch (UnsupportedEncodingException e) {
  263. sb.append(value);
  264. }
  265. } else {
  266. sb.append(value);
  267. }
  268. return sb.toString();
  269. }
  270.  
  271. /**
  272. * 获取当前日期字符串
  273. *
  274. * @return
  275. */
  276. private String getCurrentTimeString() {
  277. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  278. return df.format(new Date());
  279. }
  280.  
  281. public static class ALiPayBuilder {
  282. private String rsa2 = "";
  283. private String rsa = "";
  284. private String appid;
  285. private String money;
  286. private String title;
  287. private String notifyUrl;
  288. private String orderTradeId;
  289.  
  290. public MyALipayUtils build() {
  291. return new MyALipayUtils(this);
  292. }
  293.  
  294. public String getOrderTradeId() {
  295. return orderTradeId;
  296. }
  297.  
  298. public ALiPayBuilder setOrderTradeId(String orderTradeId) {
  299. this.orderTradeId = orderTradeId;
  300. return this;
  301. }
  302.  
  303. public String getRsa2() {
  304. return rsa2;
  305. }
  306.  
  307. public ALiPayBuilder setRsa2(String rsa2) {
  308. this.rsa2 = rsa2;
  309. return this;
  310. }
  311.  
  312. public String getRsa() {
  313. return rsa;
  314. }
  315.  
  316. public ALiPayBuilder setRsa(String rsa) {
  317. this.rsa = rsa;
  318. return this;
  319. }
  320.  
  321. public String getAppid() {
  322. return appid;
  323. }
  324.  
  325. public ALiPayBuilder setAppid(String appid) {
  326. this.appid = appid;
  327. return this;
  328. }
  329.  
  330. public String getMoney() {
  331. return money;
  332. }
  333.  
  334. public ALiPayBuilder setMoney(String money) {
  335. this.money = money;
  336. return this;
  337. }
  338.  
  339. public String getTitle() {
  340. return title;
  341. }
  342.  
  343. public ALiPayBuilder setTitle(String title) {
  344. this.title = title;
  345. return this;
  346. }
  347.  
  348. public String getNotifyUrl() {
  349. return notifyUrl;
  350. }
  351.  
  352. public ALiPayBuilder setNotifyUrl(String notifyUrl) {
  353. this.notifyUrl = notifyUrl;
  354. return this;
  355. }
  356. }
  357. }

完成上述操作,你的app在蚂蚁金服后台应用上线之后,就完全可以调用支付了,但是在开发阶段,应用没有上线,你是不能进行调试的,所以支付宝有沙箱模式可以进行调试,ios没有哟

进行沙箱调试在Activity的的onCreate()方法中添加

  1. EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);//支付宝沙箱环境,正式需注释

别忘了让你们后台把appKey等信息换成沙箱的,然后测试支付的时候,需要下载一个沙箱支付宝,这个你可以随意支付,附上链接

沙箱首页:https://sandbox.alipaydev.com/user/accountDetails.htm?currentBar=1

App支付接入文档:https://docs.open.alipay.com/204/105051

沙箱钱包下载:

调试都没有问题之后,就可以在蚂蚁金服开发者平台进行应用上线,然后沙箱代码就可以注释了,这样支付宝支付就接入完成

如果问题或建议请发送到我的邮箱:dingchao7323@qq.com

    

Android开发支付集成——支付宝集成的更多相关文章

  1. Android开发支付集成——微信集成

    支付宝支付传送门:https://www.cnblogs.com/dingxiansen/p/9208949.html 二.微信支付 1. 微信支付流程图 相比较而言,微信支付是要比支付宝麻烦一些,并 ...

  2. android开发 ,对接支付宝,服务器(PHP)校验失败

    已备忘记,资料链接: http://my.oschina.net/u/256646/blog/174222 注意: 里面有一个设计到支付宝公钥的地方: 注 意这个是2048位的公钥应该是9行或者10行 ...

  3. android 集成支付宝app支付(原生态)-包括android前端与java后台

    本文讲解了 android开发的原生态app集成了支付宝支付, 还提供了java后台服务器处理支付宝支付的加密代码, app前端与java后台服务器使用json数据格式交互信息,java后台服务主要用 ...

  4. 五步搞定Android开发环境部署

    引言   在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入 Android浪潮的朋友们,为了确保大家能顺利完成开发 ...

  5. Android开发学习——搭建开发环境

    在学校开课学习了android的一些简单的UI组件,布局,四大组件学习了2个,数据存储及网络通信,都是一些简单的概念,入门而已.许多东西需要自己去学习. 学习一下 Android开发环境的搭建,两种方 ...

  6. android开发环境搭建日记和嵌入式Android开发环境初探

    非常感谢博客园的各位,按照你们的博文,还有利用百度和谷歌逐渐建立了android的开发环境,只是给自己备份参考查看,看过的人可以忽略这篇文章. 本文章大部分参考了:http://www.cnblogs ...

  7. Android开发环境部署

    引言   在windows系统中安装Android的开发环境,将分为五个步骤来完成: 第一步:安装JDK 第二步:配置Windows上JDK的变量环境 第三步: 下载安装Eclipse 第四步:下载安 ...

  8. 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程

      在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环境的搭 ...

  9. 【Android开发】 第一课 环境搭建教程

    Windows 开发环境部署: Android Studio 中文社区:http://www.android-studio.org/ 本教程将分为五个步骤来完成Android开发环境的部署. 第一步: ...

随机推荐

  1. java游戏开发杂谈 - 线程

    线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序 ...

  2. 什么是TensorFlow?

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面: 从零开始学TensorFlow[01-搭 ...

  3. 【干货分享】可能是东半球最全的.NET Core跨平台微服务学习资源

    如果你发现还有西半球的资源,烦请相告,不胜感谢! 一..NET Core基础 微软英文官网 .NET Core 微软中文官网 GitHub 用ASP.NET内核和Azure构建现代Web应用程序 博客 ...

  4. Android之应用市场排行榜、上架、首发

    文章大纲 一.应用市场排行榜介绍二.应用市场上架介绍三.应用市场首发介绍四.参考文档   一.应用市场排行榜介绍   iiMedia Research(艾媒咨询)权威发布<2017-2018中国 ...

  5. CentOS7 使用firewalld打开关闭防火墙与端口

    1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...

  6. Unsupported major.minor version 52.0解决办法

    一.错误现象:当改变了jdk版本时,在编译java时,会遇到Unsupported major.minor version错误.jdk版本和stanford parser对应关系 JDK版本和Java ...

  7. spring boot 2.0 集成 shiro 和 pac4j cas单点登录

    新开的项目,果断使用  spring boot  最新版本  2.0.3 ,免得后期升级坑太多,前期把雷先排了. 由于对 shiro 比较熟,故使用 shiro 来做权限控制.同时已经存在了 cas  ...

  8. 年轻的工程师如何月入伍万XD

    郑昀:你要跟谁比?关键词:成长,自我管理,自我激励,面试,候选人201806 ——你觉得跟你的 Leader 差在什么地方?——肯定有差距,一个是知识面不如他广,二一个是解决问题不如他老练.——怎么追 ...

  9. Django学习笔记(2)——模型,后台管理和视图的学习

    一:Web投票示例 本节我们首先从全局范围再复习一下Django的概念,让自己对Django的设计理念, 功能模块,体系架构,基本用法有初步的印象. Django初始的详细博客内容:请点击我 该应用包 ...

  10. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU开发那些事 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔Kinetis系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2010年开始推出的Kinetis系列昭示着ARM C ...