统一支付流程设计如下:
客户端:
服务器端:
简单解释一下:
- 每次支付开始,都要让服务器生成一个订单作为此次支付的记录,订单的id即为 bill_id。订单有4中状态:订单生成,支付失败,支付成功,发货成功。
- pay_server即为统一支付系统的服务器端,考虑到调用量和方便调试,使用了简单的http协议+json+sign的方式
对于服务器内部,唯一麻烦的一点是,《等待pay_server支付结果通知》这个接口。因为这个http请求需要支持挂起,在第三方支付服务器通知了pay_server之后,pay_server 根据通知里面透传的bill_id 将订单状态修改后,再给客户端结果。
客户端:
基于这一点,我们就可以做一个同一个工厂函数,将这个工厂函数类封装成一个jar包。
同时,我们对每一种支付方式,都封装出一个统一的接口,而工厂函数返回的即这样一个接口的实现。当某一种支付方式的封装类不存在时,就捕获这个异常,并返回NULL。
统一接口的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public
abstract
class
PaymentInterf
{
/**
* 初始化统一方法
* @param context 上下文
* @param parameters 初始化时需要的参数 数组
* 1、移动 parameters--》mmid 、mmkey
* 2、联通 parameters:
* string appid 应用编号
* string cpCode 开发商编号
* string cpid 开发商VAC资质编号
* string company 开发者公司名字
* string phone 开发者客服电话号码
* string game 应用名称
* UnipayPayResultListener mCallBack 初始化函数回调结果(目前 只有联通多了一个非String类型的参数)
*
* 3、Amazon初始化
* suk
* callBack
*
*/
public
abstract
void
init
(
Context
context
,
Object
.
.
.
parameters
)
;
/**
* 支付统一函数
* @param context 上下文
* @param parameters 支付时需要传递的参数 如 payCode billId 。。。
*/
public
abstract
void
pay
(
Context
context
,
Object
.
.
.
parameters
)
;
public
static
void
billDeliver
(
String
appKey
,
String
billID
)
{
HttpLobbiesService
.
g
(
)
.
billDeliver
(
appKey
,
billID
,
new
HttpLobbiesService
.
Callback
(
)
{
@
Override
public
void
onResult
(
ResultInfo
info
)
{
if
(
info
!=
null
&
amp
;
&
amp
;
info
.
getRetCode
(
)
==
0
)
{
Log
.
e
(
"billDeliver"
,
info
.
getRetCode
(
)
+
"/:"
+
info
.
getObj
(
)
)
;
}
}
}
)
;
}
}
|
工厂函数的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public
class
PaymentFactoy
{
public
static
PaymentInterf
producePay
(
int
billTypy
)
{
try
{
switch
(
billTypy
)
{
case
Constant
.
BILL_TYPE_MMCNCCPAY
:
return
MMPayInstance
.
getInstance
(
)
;
case
Constant
.
BILL_TYPE_DIANXIN
:
return
CTEStoreInstance
.
getInstance
(
)
;
case
Constant
.
BILL_TYPE_UNIPAY
:
return
UnicomInstance
.
getInstance
(
)
;
case
Constant
.
BILL_TYPE_TAOBAO
:
return
TaoBaoInstance
.
getInstance
(
)
;
case
Constant
.
BILL_TYPE_WEIPAY
:
return
WeiPayInstance
.
getInstance
(
)
;
case
Constant
.
BILL_TYPE_WIMI
:
return
WeiMiInstance
.
getInstance
(
)
;
default
:
break
;
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
return
null
;
}
return
null
;
}
;
}
|
上面的方法是只封装了一个factory函数的jar包,其他的对每种支付的封装还是走源码的方式。