写在前头
iOS系统9.0以后,左上角多了一个返回键。在app里调起支付,跳转到支付宝或者微信的时候,左上角有一个返回键,点击这个返回键时第三方支付是不给走回调的,因此这时候没办法立即判断支付的结果。
当触发正常的第三方支付回调的时候,会走以下两个触发的方式,进行正常通道的处理
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
if ([OpenShare handleOpenURL:url]) {
if ([url.host isEqualToString:@"pay"]) {
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
if ([url.host isEqualToString:@"safepay"]) {
// 支付跳转支付宝钱包进行支付,处理支付结果
[ZHJServiceAliPay processProductOrderResult:url callBack:^(NSDictionary *resultDic) {
DebugLog(@"resultDic = %@",resultDic);
NSNumber *resultStatus = resultDic[@"resultStatus"];
[YSNotificationCenter postNotificationName:ZHJServiceAliPayNotification object:resultStatus];
// if (resultStatus.integerValue == ZHJServiceAlipayResultTypeSuccess) {
// //支付成功通知
// }
}];
return YES;
}
return YES;
}
//微信SDK自带的方法,处理从微信客户端完成操作后返回程序之后的回调方法,显示支付结果的
-(void) onResp:(BaseResp*)resp {
}
而从左上角点击返回的时候,一定会走的生命周期delegate的applicationDidBecomeActive这个方法:
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
DebugLog(@"先DidBecomeActive");
NSString *paytype = [YSUserDefaults objectForKey:@"支付返回"];
if ([paytype notEmpty]) {
NSString *orderId = [YSUserDefaults objectForKey:@"订单ID"];
[YSNotificationCenter postNotificationName:ZHJWeiXinPayStatusNotification object:orderId];
}
}
从而可以利用归档记住当前需要的支付状态,在这里面进行处理
多讲一点
其实正常来说,走微信支付的话,服务器接收到微信回调的时候作一个处理的话,再加一个接口是最好的做法,但是如果没有或者是其他的情况下,只能用这样的方式进行处理了,当然在每次正常走回调的时候,需要将NSUserDefaults的值清理掉,避免两个方法重复走多一遍了。