Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)
2015-09-12 12:53
253 查看
一. 移动支付:
用户需要在移动终端提交账号、密码以及金额等数据 到 远端服务器。然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端。[b]用户[b]提交账号、密码以及金额等数据都是比较敏感的数据,这些数据不能让外界获取。[/b][/b]
[b][b] 阿里等等支付宝平台把支付的逻辑封装起来,只给我们提供一个方法去调用,这样提高了安全性。当我们用户[b][b][b]提交账号、密码以及金额等数据,点击"支付"的时候,支付宝平台已经调用方法[b][b][b][b][b][b]加密数据[/b][/b][/b][/b][/b](这个支付逻辑是远程服务,为了安全,防止信息泄露),提交给远端服务器(解密数据,逻辑判断)。[/b][/b][/b][/b][/b][/b]
[b][b][b][b][b]二.通过一个移动支付的框架案例说明远程服务的应用:[/b][/b][/b][/b][/b]
[b][b][b][b][b]1.这是支付宝公司内部开发的框架,内部进行很多加密,别人反编译也是无法获得什么有用的信息的,支付宝公司开发出这个"远程安全支付服务",可以供用户调用,但是无法获取内部实现逻辑,数据怎么加密,怎么解密,这些都是不清楚,这样安全才能得到保障,这样用户才能放心使用移动支付服务。[/b][/b][/b][/b][/b]
[b][b][b][b][b]如下,这里我们新建的"Alipay"工程,模拟的就是阿里云服务终端提供了支付逻辑。[/b][/b][/b][/b][/b]
[b][b][b][b][b](1)新建一个Android工程,命名为"Alipay",如下:[/b][/b][/b][/b][/b]
[b][b][b][b][b]
[/b][/b][/b][/b][/b]
(2)我们知道,这个用户提交的数据加密过程是不能暴露给其他人的,这是很敏感的,所以这里我们要使用的远程服务service,使用[b]远程服务service的目的是因为只暴露给用户可调用的方法,不提供具体实现的逻辑,提高信息安全性。用户点击"支付",实际上是调用阿里云支付的远程服务的支付逻辑方法。[/b]
这里我们定义一个服务Service,为AlipayService,如下:
为了调用远程服务的safePay,必须提供一个接口IService供外界使用,如下:
这个时候工程如下图:
(3)接下来,就是找到工程目录下的IService.java文件,改扩展名".java" 为 ".aidl ",同时修改AlipayService服务代码,这个参考Android(java)学习笔记232: 远程服务之 ipc和aidl (面试常问),修改结果如下:
[b]AlipayService如下:[/b]
此时工程变成如下:
(4)就这样远程的服务平台,我们就是搭建好了。
[b]3. 以后别的公司,要使用支付的操作,那就使用上面支付宝定义的支付服务即可。[/b]
[b] 下面我们模拟出一家公司开发出一种游戏APP需要使用支付服务,这个游戏为"捕鱼达人"[/b]
[b](1)新建一个Android工程,命名为" Alipay_捕鱼达人 ",如下:[/b]
[b]
[/b]
如果我们的公司想要接入支付宝的服务,我们必须向支付宝服务的公司进行申请(提供我们公司的营业执照、公司的类型;以及告诉他们,我们是哪一个应用哪一个包名要接入这个支付应用),提交完申请,如果没有问题,这个时候支付宝公司,才会提供给你SDK的接口,让你调用支付的逻辑服务。上面提到的参数Key,就是支付宝公司提供给申请公司的密钥,从而使得申请的公司可以使用到这个支付逻辑业务。如果没有这个key,支付宝服务会认为这是一个非法的业务请求,不会提供支付业务(支付宝公司赚钱的业务)。
(2)首先来到布局文件activity_main.xml文件,如下:
布局效果如下:
(3)在[b][b]" Alipay_捕鱼达人 "的src目录下,新建一个包"com.himi.alipay",这个包名和前面远程支付包名一样。[/b][/b]
[b][b](现实开发中,支付宝公司会提供给申请公司----支付业务包名和方法接口)[/b][/b]
[b][b]效果如下图:[/b][/b]
(4)进行MainActivity.java代码编写,如下:
(5)布署程序到模拟器上,如下:
点击按钮 " 花费2元买炮弹 " ,如下打印土司提示,同时观察logcat打印的日志,如下:
与此同时,logcat打印的日志为:
倘若我们输入的密码 或者 账号不正确,如下:
[b]与此同时,logcat打印的日志为:[/b]
倘若我们输入的现金超过了限制的金额,如下:
[b][b]与此同时,logcat打印的日志为:[/b][/b]
三、远程服务的应用场景总结
1. 超级大公司,写出来逻辑供别的程序员使用。
2. 手机企业,手机定制厂商,提供一些方便的逻辑供程序员使用。
比如snoy手机,人脸识别。
3. 系统的源码,内置很多的服务。电话的服务TelephoneManager, 布局填充器的服务LayoutInflaterService等等
用户需要在移动终端提交账号、密码以及金额等数据 到 远端服务器。然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端。[b]用户[b]提交账号、密码以及金额等数据都是比较敏感的数据,这些数据不能让外界获取。[/b][/b]
[b][b] 阿里等等支付宝平台把支付的逻辑封装起来,只给我们提供一个方法去调用,这样提高了安全性。当我们用户[b][b][b]提交账号、密码以及金额等数据,点击"支付"的时候,支付宝平台已经调用方法[b][b][b][b][b][b]加密数据[/b][/b][/b][/b][/b](这个支付逻辑是远程服务,为了安全,防止信息泄露),提交给远端服务器(解密数据,逻辑判断)。[/b][/b][/b][/b][/b][/b]
[b][b][b][b][b]二.通过一个移动支付的框架案例说明远程服务的应用:[/b][/b][/b][/b][/b]
[b][b][b][b][b]1.这是支付宝公司内部开发的框架,内部进行很多加密,别人反编译也是无法获得什么有用的信息的,支付宝公司开发出这个"远程安全支付服务",可以供用户调用,但是无法获取内部实现逻辑,数据怎么加密,怎么解密,这些都是不清楚,这样安全才能得到保障,这样用户才能放心使用移动支付服务。[/b][/b][/b][/b][/b]
[b][b][b][b][b]如下,这里我们新建的"Alipay"工程,模拟的就是阿里云服务终端提供了支付逻辑。[/b][/b][/b][/b][/b]
[b][b][b][b][b](1)新建一个Android工程,命名为"Alipay",如下:[/b][/b][/b][/b][/b]
[b][b][b][b][b]
[/b][/b][/b][/b][/b]
(2)我们知道,这个用户提交的数据加密过程是不能暴露给其他人的,这是很敏感的,所以这里我们要使用的远程服务service,使用[b]远程服务service的目的是因为只暴露给用户可调用的方法,不提供具体实现的逻辑,提高信息安全性。用户点击"支付",实际上是调用阿里云支付的远程服务的支付逻辑方法。[/b]
这里我们定义一个服务Service,为AlipayService,如下:
package com.himi.alipay; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; /** * * 阿里云安全支付的服务 * */ public class AlipayService extends Service { //获取远程服务的秘书 private class MyBinder extends Binder implements IService { public int callSafePay(String username, String password, float money, long timestamp) { // TODO 自动生成的方法存根 return safePay(username, password, money, timestamp); } } @Override public IBinder onBind(Intent intent) { // TODO 自动生成的方法存根 return null; } /** * * @param username 用户名 * @param password 密码 * @param money 金额 * @param timestamp 时间戳 (用户提交支付的时间) * @return 404用户名密码错误 200支付成功 503支付超过限额 (现实开发中,这种逻辑状态码估计很多) */ public int safePay(String username, String password, float money, long timestamp) { System.out.println("加密username"); System.out.println("加密password"); System.out.println("连接支付宝的服务器,检查用户名和密码是否正确"); if("123".equals(password)&&"abc".equals(username)) { }else { return 404; } System.out.println("连接银行网关,检查账户余额是否充足"); //银行的消费限额 if(money < 5000) { return 200; }else { System.out.println("超过银行限额支付失败"); return 503; } } }
为了调用远程服务的safePay,必须提供一个接口IService供外界使用,如下:
package com.himi.alipay; public interface IService { public int callSafePay(String key, String username, String password, float money, long timestamp); }
这个时候工程如下图:
(3)接下来,就是找到工程目录下的IService.java文件,改扩展名".java" 为 ".aidl ",同时修改AlipayService服务代码,这个参考Android(java)学习笔记232: 远程服务之 ipc和aidl (面试常问),修改结果如下:
[b]AlipayService如下:[/b]
package com.himi.alipay; import android.app.IntentService; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; /** * * 阿里云安全支付的服务 * */ public class AlipayService extends Service { private class MyBinder extends IService.Stub{ public int callSafePay(String key, String username, String password, float money, long timestamp) { // TODO 自动生成的方法存根 return safePay(key,username, password, money, timestamp); } } @Override public IBinder onBind(Intent intent) { // TODO 自动生成的方法存根 return new MyBinder(); } /** * @param key 支付宝公司提供给(其他公司)需要支付业务服务的密钥 * @param username 用户名 * @param password 密码 * @param money 金额 * @param timestamp 时间戳 (用户提交支付的时间) * @return 404用户名密码错误 200支付成功 503支付超过限额 (现实开发中,这种逻辑状态码估计很多) */ public int safePay(String key,String username, String password, float money, long timestamp) { System.out.println("加密username"); System.out.println("加密password"); System.out.println("连接支付宝的服务器,检查用户名和密码是否正确"); if("123".equals(password)&&"abc".equals(username)) { }else { return 404; } System.out.println("连接银行网关,检查账户余额是否充足"); //银行的消费限额 if(money < 5000) { return 200; }else { System.out.println("超过银行限额支付失败"); return 503; } } }
此时工程变成如下:
(4)就这样远程的服务平台,我们就是搭建好了。
[b]3. 以后别的公司,要使用支付的操作,那就使用上面支付宝定义的支付服务即可。[/b]
[b] 下面我们模拟出一家公司开发出一种游戏APP需要使用支付服务,这个游戏为"捕鱼达人"[/b]
[b](1)新建一个Android工程,命名为" Alipay_捕鱼达人 ",如下:[/b]
[b]
[/b]
如果我们的公司想要接入支付宝的服务,我们必须向支付宝服务的公司进行申请(提供我们公司的营业执照、公司的类型;以及告诉他们,我们是哪一个应用哪一个包名要接入这个支付应用),提交完申请,如果没有问题,这个时候支付宝公司,才会提供给你SDK的接口,让你调用支付的逻辑服务。上面提到的参数Key,就是支付宝公司提供给申请公司的密钥,从而使得申请的公司可以使用到这个支付逻辑业务。如果没有这个key,支付宝服务会认为这是一个非法的业务请求,不会提供支付业务(支付宝公司赚钱的业务)。
(2)首先来到布局文件activity_main.xml文件,如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.himi.fish.MainActivity" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:onClick="pay" android:text="花费2元买炮弹" /> </RelativeLayout>
布局效果如下:
(3)在[b][b]" Alipay_捕鱼达人 "的src目录下,新建一个包"com.himi.alipay",这个包名和前面远程支付包名一样。[/b][/b]
[b][b](现实开发中,支付宝公司会提供给申请公司----支付业务包名和方法接口)[/b][/b]
[b][b]效果如下图:[/b][/b]
(4)进行MainActivity.java代码编写,如下:
package com.himi.fish; import com.himi.alipay.IService; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { private MyConn conn; private IService iService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent service = new Intent(); service.setAction("com.himi.alipay"); conn = new MyConn(); bindService(service, conn, BIND_AUTO_CREATE); } private class MyConn implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { iService = IService.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { // TODO 自动生成的方法存根 } } public void pay(View view) { try { int result = iService.callSafePay("123456", "abc", "123", 505.02f, System.currentTimeMillis()); switch (result) { case 404: Toast.makeText(this, "用户名密码错误", 0).show(); break; case 200: Toast.makeText(this, "支付成功", 0).show(); break; case 503: Toast.makeText(this, "支付超过限额", 0).show(); break; default: break; } } catch (RemoteException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
(5)布署程序到模拟器上,如下:
点击按钮 " 花费2元买炮弹 " ,如下打印土司提示,同时观察logcat打印的日志,如下:
与此同时,logcat打印的日志为:
倘若我们输入的密码 或者 账号不正确,如下:
[b]与此同时,logcat打印的日志为:[/b]
倘若我们输入的现金超过了限制的金额,如下:
[b][b]与此同时,logcat打印的日志为:[/b][/b]
三、远程服务的应用场景总结
1. 超级大公司,写出来逻辑供别的程序员使用。
2. 手机企业,手机定制厂商,提供一些方便的逻辑供程序员使用。
比如snoy手机,人脸识别。
3. 系统的源码,内置很多的服务。电话的服务TelephoneManager, 布局填充器的服务LayoutInflaterService等等
相关文章推荐
- Android 性能调优
- Android 学习第14课,Android 布局
- Android 学习资源
- Android 百度地图开发(一)如何调用百度地图接口和在项目中显示百度地图以及实现定位
- android学习笔记(22)listview初步
- android:windowSoftInputMode属性使用
- android多线程下载模块
- Android学习系列之(八)Fragment之间的数据传递与导航抽屉的实现
- Android KK台,联系人列表#集团放置A~Z之前
- Android中的菜单-ContextMenu,PopupMenu
- android---Notification通知解析
- [转载]android中The connection to adb is down,问题和解决
- Android 实现沉浸式状态栏的方法
- Android:Resources资源文件
- Android:布局实例之常见用户设置界面
- Android:res之selector背景选择器
- Android学习路线01
- Android:Tab切换方法整理
- Android简易数据存储之SharedPreferences
- android post方式传递参数并获取返回数据代码