支付宝支付设计和开发方案

背景  
     在移动支付领域,支付宝支付占用巨大份额,根据艾瑞咨询公布的报告数据:2014Q3,支付宝斩获了82.6%的市场份额,在移动支付的霸主地位越来越稳固。财付通支付的发力点在微信支付和手Q支付,在移动支付格局中取得了10.0%的市场份额,排名第二。 
     支付宝在移动支付领域的统治地位,使得我们有必要梳理支付宝移动开发流程。本文写作的目的就是梳理支付流程,从架构层面讲述如何在移动应用中嵌入支付宝支付功能,以及指出哪些地方存在开发陷阱。 

准备  
     首先,支付宝SDK下载主页的地址是: https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash 。这个地址隐藏很深,所以这里有必要指出。 
     按照说明,首先需要申请支付宝支付账号。这方面根据网站说明进行申请即可。一般需要2周左右的时间批准下来。 
申请成功后账号信息 包括 合作者身份ID partner, 卖家支付宝账号 seller_id,以及私钥 privateKey等。这三项将用于开发过程。 
     在官网上下载移动支付集成开发包。解压后, 发现其下包括三个文件夹(在英文Mac系统下文件名显示为乱码): 
  • “商户接入支付宝收银台界面展示标准”:讲的是如何使用支付宝Logo。
  • “支付宝钱包支付接口开发包2.0标准版”:用于支付,包括客户端和服务器端开发。
  • “即时到账批量退款有密接口refund_fastpay_by_platform_pwd”:用于到账及批量退款,只需要服务器端操作处理。
后两个文件夹,都包括4方面内容:接口文档,接入与使用规则,demo代码,以及版本更新说明。
架构设计  
首先,对于一个实际的App应用而言,可能会包括多种支付方式,因此可以采用设计模式中的策略Strategy模式来设计支付功能模块,支付宝支付作为其中的一个策略,pay方法是支付算法。 
如果除了支付方式payment method变化,订单order也可能会有不同的形式,如格式可能不同,有些支持可退款,有的不允许退款等,在这种多维度可变的情况下,支付模块的架构可以基于桥接模式。
其次,可以把支付宝支付的各个操作步骤,比如获取订单号,生成订单数据,进行支付,获取支付结果,处理异常等操作,根据状态进行划分。这样采用状态模式,提供设计的灵活性和扩展性。另外也可以设计状态机进行统一的状态切换管理。下面为参考代码:

复制代码
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
public  class  PayStateMachine {
     /* all possible state of payment */
     public enum PayState { PAY_INIT, PAY_GOT_CONTEXT, PAY_UPDATED_ORDER, PAY_APPLIED_
       ID, PAY_ORDER_CREATED, PAY_SUCCEED, ERROR_OCCURRED}
      
      
     /* errors may occurred during payment */
     public  enum  PayError {
         PAY_GET_CONTEXT_FAIL, PAY_UPDATE_ORDER_FAIL, PAY_APPLY_ID_FAIL, PAY_FAIL
     }
      
      
     private  static  PayStateMachine instance;
     private  PayState state;
     private  IOrder order;
     private  IPayment payment;
      
      
     private  PayStateMachine() {
     }
      
      
     public  static  PayStateMachine getInstance() {
         if  (instance ==  null ) {
             instance =  new  PayStateMachine();
         }
      
      
         return  instance;
     }
      
      
     public  void  initPayment(IOrder order, IPayment payment) {
         this .order = order;
         this .payment = payment;
         this .state = PayState.PAY_INIT;
     }
      
      
     public  void  startPay() {
         changeState(PayState.PAY_INIT);
     }
      
      
     public  void  changeState(PayState state) {
         onStateChanged( this .state, state);
     }
      
      
     public  void  reportError(PayError error, String detail) {
         LogUtil.printPayLog( "the error id is:"  + error +  " "  + detail);
         changeState(PayState.ERROR_OCCURRED);
     }
      
      
     private  void  onStateChanged(PayState oldState, PayState newState) {
         LogUtil.printPayLog( "oid state:"  + oldState +  " new state:"  + newState);
         this .state = newState;
      
         handlePayStateChange();
     }
      
      
     private  void  handlePayStateChange() {
         if  ( this .order ==  null  ||  this .payment ==  null
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值