Note
公司项目中最近继承支付功能,支付方式为 微信、支付宝,趁此机会整理一下支付宝和微信的流程
移动端,主要是支付结果回调处比较麻烦,实际上整个集成过程比较简单
无论集成哪个支付方式,其业务逻辑都是一样的,大致如图
15718986345195.jpg根据集成支付的业务逻辑图,开发者需要做的工作就是
- 下载支付平台SDK 集成到项目,配置好可用环境
- 请求后台商品信息,包装对应下单平台的请求参数 --> 调起三方平台发起付款
- 付款完成(或失败)返回App,根据回调查询支付结果 --> 展示给用户
下面分别说一下 支付宝/微信 的一些集成过程
1.支付宝集成
支付宝SDK 在集成到项目的时候可能会遇到一些头文件找不到的情况,这里可以参考我之前写的支付宝代码集成讲解AliPayDemo
支付宝特点:
- 集成代码复杂,会报一些头文件找不到之类的错误,详看上面Demo
- 支付完成回调方便,在调起支付宝支付的方法中就有对应的回调Block
主要步骤:
- 官网下载SDK,集成到项目
- 请求公司商品信息,封装请求信息拉起支付宝客户端支付
- 支付完成返回App,在调用支付宝的回调中请求最终支付结果,展示给用户
核心代码展示
#pragma mark - AppDelegate 中监听支付宝支付回调的,处理可能在支付过程中App被kill的情况
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
if (!url) {
return NO;
}
// 支付宝完成之后回到App
if ([url.host isEqualToString:@"safepay"]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
DLog(@"result = %@",resultDic);
if([resultDic[@"resultStatus"]isEqualToString:@"9000"]){
DLog(@"AppDeletate: safepay alipay 9000");
}
else{
DLog(@"AppDeletate: safepay alipay not 9000");
}
}];
}
if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode
[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
DLog(@"result = %@",resultDic);
if([resultDic[@"resultStatus"]isEqualToString:@"9000"]){
DLog(@"AppDeletate: platformapi alipay 9000");
}
else
{
DLog(@"AppDeletate: platformapi alipay not 9000");
}
}];
}
}
/// 使用支付宝支付
- (void)payWithAliPay
{
// 1. 封装参数,请求商品订单信息
XYWeakSelf;
NSDictionary *params = @{
@"id" : @"商品ID"],
@"payType" : PayTypeAliPay]
};
NSString *url = URL_for_Visa_WithPath(@"/pay/");
[NetWorkUikits requestWithUrl:url param:params completionHandle:^(NSDictionary*json) {
// 2.拿到商品信息,封装支付参数,调起支付宝支付
NSString *appScheme = @"com.scheme.xiaoyouPrince";
NSString *orderSpec = [NSString stringWithFormat:@"%@",json[@"orderInfo"]];
[[AlipaySDK defaultService] payOrder:orderSpec fromScheme:appScheme callback:^(NSDictionary *resultDic) {
DLog(@"%@",resultDic);
// 3. 支付完成,回调查看支付结果
[weakSelf checkPayMent:weakSelf.model.orderNumber payTypeKey:@"1"];
}];
} failureHandle:^(NSError *error) {
NSLog(@"error = %@",error);
}];
}
因为支付宝调用支付的方法中有支付结束的回调,可以直接在内部请求支付结果信息并展示即可。
至此,支付宝支付的核心就此结束。
2.微信支付集成
微信支付SDK 下载之后,根据文档集成到App项目中。
微信支付特点:
- 集成代码简单
- 支付完成回调麻烦,官方使用代理的方式,对每次的 Request 进行一个 response 回调。支付完成回调的使用场景一般在微信支付跳回 App 时候。
主要步骤:
- 官网下载SDK,集成到项目
- 请求公司商品信息,封装请求信息拉起微信客户端支付
- 支付完成返回App,监听微信支付回调,并在回调中请求后台最终支付结果。
官方的回调使用的是代理模式,这里根据官方方法,列出如下步骤:
- 在 APPDelegate 中监听调起 App 方法,在内部设置微信API的代理管理者 WXApiManager
- 在 支付页面,设置 WXApiManager 代理,来真正执行该页面的回调业务。
- -- 此方法主要是便于微信API的管理和日后功能的扩展,如微信登录,分享等
核心代码展示
#pragma mark - AppDelegate 中注册微信SDK 的代理
// 这里我自己创建了一个工具类 WXApiManager ,来管理微信API相关的代理回调
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
if (!url) {
return NO;
}
// 接收微信回调
if ([url.scheme isEqualToString:@"你的微信scheme"]) {
[WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
}
#pragma mark - 设置支付页面作为微信支付完成回调的代理,实现代理方法
- (void)viewDidLoad {
[super viewDidLoad];
// 监听微信支付完成回调
[[WXApiManager sharedManager] setDelegate:self];
// ... 其他配置
}
/// 使用微信支付
- (void)payWithWeChat
{
// 1.请求商品信息
NSDictionary *params = @{
@"id" : @"你的商品id"],
@"payType" : PayTypeWeChat]
};
NSString *url = URL_for_Visa_WithPath(@"/pay/");
[NetWorkUikits requestWithUrl:url param:params completionHandle:^(NSDictionary*json) {
// 2. 封装商品信息,调起微信发起付款
NSString *prepayId = [NSString stringWithFormat:@"%@",json[@"prepayId"]];
NSString *nonceStr = [NSString stringWithFormat:@"%@",json[@"nonceStr"]];
uint32_t timeStamp = [json[@"timeStamp"] unsignedIntegerValue];
NSString *sign = [NSString stringWithFormat:@"%@",json[@"sign"]];
PayReq *request = [[PayReq alloc] init];
request.partnerId = @"1548525371";
request.prepayId= prepayId;
request.package = @"Sign=WXPay";
request.nonceStr= nonceStr;
request.timeStamp= timeStamp;
request.sign= sign;
[WXApi sendReq:request];
} failureHandle:^(NSError *error) {
NSLog(@"error = %@",error);
}];
}
#pragma mark - 微信支付回调
// 本页面需要实现微信支付回调,在微信跳回App的时候就会调用此方法
- (void)managerDidRecvPayResponse
{
// 这里是微信支付完成请求最终支付状态并自行处理
[self checkPayMent:self.model.orderNumber payTypeKey:@"2"];
}
微信的回调,比较麻烦。这里写的工具类来统一处理微信回调。目前只写入了支付回调。。后面可能会有分享、登录等功能扩展,使用统一工具类也便于日后功能扩展。
工具类 WXApiManager 也统一放到AliPayDemo中了,需要自取吧。
至此,微信支付的核心就此结束。
最后,祝大家玩的愉快~
网友评论