统一支付流程设计如下:
客户端:

服务器端:

简单解释一下:
- 每次支付开始,都要让服务器生成一个订单作为此次支付的记录,订单的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 && 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包,其他的对每种支付的封装还是走源码的方式。