Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)
一. 移动支付:
用户需要在移动终端提交账号、密码以及金额等数据 到 远端服务器。然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端。用户提交账号、密码以及金额等数据都是比较敏感的数据,这些数据不能让外界获取。
阿里等等支付宝平台把支付的逻辑封装起来,只给我们提供一个方法去调用,这样提高了安全性。当我们用户提交账号、密码以及金额等数据,点击"支付"的时候,支付宝平台已经调用方法加密数据(这个支付逻辑是远程服务,为了安全,防止信息泄露),提交给远端服务器(解密数据,逻辑判断)。
二. 通过一个移动支付的框架案例说明远程服务的应用:
1.这是支付宝公司内部开发的框架,内部进行很多加密,别人反编译也是无法获得什么有用的信息的,支付宝公司开发出这个"远程安全支付服务",可以供用户调用,但是无法获取内部实现逻辑,数据怎么加密,怎么解密,这些都是不清楚,这样安全才能得到保障,这样用户才能放心使用移动支付服务。
如下,这里我们新建的"Alipay"工程,模拟的就是阿里云服务终端提供了支付逻辑。
(1)新建一个Android工程,命名为"Alipay",如下:

(2)我们知道,这个用户提交的数据加密过程是不能暴露给其他人的,这是很敏感的,所以这里我们要使用的远程服务service,使用远程服务service的目的是因为只暴露给用户可调用的方法,不提供具体实现的逻辑,提高信息安全性。用户点击"支付",实际上是调用阿里云支付的远程服务的支付逻辑方法。
这里我们定义一个服务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:Android进程间通讯(IPC)之AIDL (面试常问),修改结果如下:
AlipayService如下:
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)就这样远程的服务平台,我们就是搭建好了。
3. 以后别的公司,要使用支付的操作,那就使用上面支付宝定义的支付服务即可。
下面我们模拟出一家公司开发出一种游戏APP需要使用支付服务,这个游戏为"捕鱼达人"
(1)新建一个Android工程,命名为" Alipay_捕鱼达人 ",如下:

如果我们的公司想要接入支付宝的服务,我们必须向支付宝服务的公司进行申请(提供我们公司的营业执照、公司的类型;以及告诉他们,我们是哪一个应用哪一个包名要接入这个支付应用),提交完申请,如果没有问题,这个时候支付宝公司,才会提供给你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)在" Alipay_捕鱼达人 "的src目录下,新建一个包"com.himi.alipay",这个包名和前面远程支付包名一样。
(现实开发中,支付宝公司会提供给申请公司----支付业务包名和方法接口)
效果如下图:

(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打印的日志为:

倘若我们输入的密码 或者 账号不正确,如下:

与此同时,logcat打印的日志为:

倘若我们输入的现金超过了限制的金额,如下:

与此同时,logcat打印的日志为:

三、远程服务的应用场景总结
1. 超级大公司,写出来逻辑供别的程序员使用。
2. 手机企业,手机定制厂商,提供一些方便的逻辑供程序员使用。
比如snoy手机,人脸识别。
3. 系统的源码,内置很多的服务。电话的服务TelephoneManager, 布局填充器的服务LayoutInflaterService等等
Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)的更多相关文章
- Java学习笔记53(网络编程:TCP协议案例)
简易的案例 客户端: package demo; import java.io.IOException; import java.io.InputStream; import java.io.Outp ...
- Java学习笔记52(网络编程:UDP协议案例)
InetAddress类: 表示互联网中的IP地址,示例: package demo; import java.net.InetAddress; import java.net.UnknownHost ...
- Java学习笔记34(集合框架八:综合案例:模拟斗地主的洗牌发牌)
规则: 1.54张扑克牌,有花色 2.顺序打乱,一人一张依次发牌,一人17张,留三张作为底牌 3.看牌:按大小王2A....43的序排列打印 示例: package demo; import java ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Android 数字签名学习笔记
Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- 20145316许心远《Java学习笔记(第8版)》课程总结
20145316许心远<Java学习笔记(第8版)>课程总结 每周读书笔记链接汇总 ▪ 第一周读书笔记 ▪ 第二周读书笔记 ▪ 第三周读书笔记 ▪ 第四周读书笔记 ▪ 第五周读书笔记 ▪ ...
随机推荐
- 空间数据索引RTree完全解析及Java实现
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/MongChia1993/article/details/69941783 第一部分 空间数据的背景介 ...
- 平衡二叉树、B树、B+树、B*树、LSM树简介
平衡二叉树是基于分治思想采用二分法的策略提高数据查找速度的二叉树结构.非叶子结点最多只能有两个子结点,且左边子结点点小于当前结点值,右边子结点大于当前结点树,并且为保证查询性能增增删结点时要保证左右两 ...
- nodejs 打造 多人对战游戏服务器(初级入门)
使用socket.set 和 socket.get 在存取玩家信息 百牛信息技术bainiu.ltd整理发布于博客园 socket.get('playerinfo', function (err, p ...
- Code:NLog
ylbtech-Code:NLog 1. NLog介绍使用返回顶部 1. NLog是什么 NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog ...
- oracle报ORA-00911:invalid character
转自:http://www.cnblogs.com/chuang-sharing/p/9493316.html 今天查问题的时候,发现一个在分号后边加注释,解析错误的问题: select decode ...
- Hackerearth: Mathison and the Pokémon fights
Mathison and the Pokémon fights code 这是一道比较有意思,出的也非常好的题目. 给定$n$个平面上的点$(x_i, y_i)$,(允许离线地)维护$Q$个操作:1. ...
- 洛谷 - P2805 - 植物大战僵尸 - 最大流 - 最大权闭合子图
https://www.luogu.org/problemnew/show/P2805 最大权闭合子图的特点是,假如你要选一个结点,则要先选中它的所有子节点.正权连S负权连T,容量为绝对值,原图有向边 ...
- thrift配置——windows客户端与linux服务端通信(C++)
windows客户端: 1.首先要安装boost库 下载源文件 2.安装boost之前先要安装python-3.4.0.amd64,很多地方没有说,弄了很久 3.运行bootstrap.bat 生成b ...
- 如何阻止浏览器的默认事件,你是否也遇到过无法阻止Google默认事件的情况( 原生JS )
如题,话不多话,我们先看怎么解决 根据不同的绑定事件的方法,我们有不同的阻止默认事件的方法 如果你不知到如何绑定事件,请查看我的上一篇文章 关于浏览器滚动的兼容性问题以及事件绑定 1.句柄绑定 只需要 ...
- npm install 各种后缀 --xx说明
npm install xx -g 首先是在npm install xx 命令后面加 -g 它表示将当前包上下文(即,当前工作目录)安装为全局包. npm install (没有参数),在本地node ...