iOS 第三方支付

支付

APP中我们常用的第三方支付主要是:微信支付和支付宝支付,去年公司的项目
中加入了两种支付方式,特地总结如下:

支付流程

1、支付流程图

支付流程图

2、添加URL

icon

3、导入SDK

SDK

4、注册自己的微信ID

icon

5、具体流程
1、点击支付

需要判断是保证金支付还是订单支付,下面的方法以微信支付为例

2、获取订单信息(服务端交互)
1
2
3
4
5
6
//保证金支付
- (RACSignal *)wechatPayDepositWithOrder:(ArtOrder *)order

//订单支付
- (RACSignal *)wechatPayWithOrder:(ArtOrder *)order

这里订单支付和保证金支付有点不同:

保证金支付是与这个订单无关的,所以在与服务端交互的时候不需要传递具体上项目或者商品的相关信息,只是传递一个保证金的金额即可,而在订单支付的过程中,我们需要将这次付款行为的商品相关信息传递给服务端。然后服务端与微信提供的接口进行交互获取订单信息

3、获取订单信息

与服务端交互完成后会返回一个PayReq的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*! @brief 第三方向微信终端发起支付的消息结构体
*
* 第三方向微信终端发起支付的消息结构体,微信终端处理后会向第三方返回处理结果
* @see PayResp
*/
@interface PayReq : BaseReq

/** 商家向财付通申请的商家id */
@property (nonatomic, retain) NSString *partnerId;
/** 预支付订单 */
@property (nonatomic, retain) NSString *prepayId;
/** 随机串,防重发 */
@property (nonatomic, retain) NSString *nonceStr;
/** 时间戳,防重发 */
@property (nonatomic, assign) UInt32 timeStamp;
/** 商家根据财付通文档填写的数据和签名 */
@property (nonatomic, retain) NSString *package;
/** 商家根据微信开放平台文档对数据做的签名 */
@property (nonatomic, retain) NSString *sign;

@end

参数详细介绍

4、调用微信API等待返回

从服务端获取到了订单的信息之后,需要调用微信的API提供的这个接口,传递数据,跳转到微信客户端 用户进行支付,自己的应用等待用户操作之后的回调

1
2
3
4
5
6
7
8
9
10
/*! @brief 发送请求到微信,等待微信返回onResp
*
* 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型
* SendAuthReq、SendMessageToWXReq、PayReq等。
* @param req 具体的发送请求,在调用函数后,请自己释放。
* @return 成功返回YES,失败返回NO。
*/

+(BOOL) sendReq:(BaseReq*)req;

5、 用户进行支付操作

pay1

6、 支付结果回调

pay2

支付动作结束之后,微信会调用

1
2
3
4
5
6
7
8
9
/*! @brief 发送一个sendReq后,收到微信的回应
*
* 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
* 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
* @param resp具体的回应内容,是自动释放的
*/

-(void) onResp:(BaseResp*)resp;

这里根据返回的状态码做出对应的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
switch (resp.errCode) {
case WXSuccess:{
NSLog(@"支付成功-PaySuccess,retcode = %d",
resp.errCode);
break;
}
case WXErrCodeCommon:{
errorMessage = @"支付失败";
break;
}
case WXErrCodeUserCancel:{
errorMessage = @"用户中途取消";
break;
}
default:{
NSLog(@"错误,retcode = %d, retstr = %@",
resp.errCode,resp.errStr);
errorMessage = @"支付失败";
break;
}


这样,本次支付就结束了。可以进行下面的操作啦………………

6、微信、支付宝支付中常见的问题
  • 1、一定要添加下面的回调

    [[AlipaySDK defaultService]

                      processOrderWithPaymentResult:url
                       standbyCallback:^(NSDictionary
                                            *resultDic) {

    }];
    否则可能收不到支付结果的回调

未完…………………………