美文网首页iOS开发指南iOS开发随笔支付功能
iOS支付宝、微信的回调问题解决办法

iOS支付宝、微信的回调问题解决办法

作者: Raybon_lee | 来源:发表于2015-10-12 16:26 被阅读16139次

以前我们使用的回调是这个方法
支付宝钱包支付接口开发包2.0标准版(iOS 2.2.1)


补充:

  • 最近很多人遇到的一个问题就是iOS9 之后,系统左上角增加了一个返回按钮,说是这个时候没有回调,由于我也没有再做这一块的,无法测试到,还望遇到这个问题的朋友出来说一下解决办法:
    

我的猜测: SDK 有一个是notify_url 想必这个在预请求订单消息的时候可以和后台商量一下,加进去,在发送订单交易的时候微信支付完成,后台完成对这个URL 的请求回调,APP,我想者应该能收到回调数据的,如果猜测正确,还望朋友能够及时联系我,把这个文章补充完整。谢谢朋友们的支持!


- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    
    return YES;
}

最近稍微研究了一下这个,因为我也很少接触这个,帮朋友分析了一下,
系统目前提供使用新的方法

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:");

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:");

NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:");
这个意思是使用版本是4.2,支持到版本9.0  

目前支付宝的回调需要使用这个新方法也就是下面这种写法,都加上注释了,

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
/*
 9000 订单支付成功
 8000 正在处理中
 4000 订单支付失败
 6001 用户中途取消
 6002 网络连接出错
 */
    if ([url.host isEqualToString:@"safepay"]) {
        //这个是进程KILL掉之后也会调用,这个只是第一次授权回调,同时也会返回支付信息
        [[AlipaySDK defaultService]processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            NSString * str = resultDic[@"result"];
            NSLog(@"result = %@",str);
        }];
        //跳转支付宝钱包进行支付,处理支付结果,这个只是辅佐订单支付结果回调
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSString * query = [[url query] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            id<DataVerifier> dataVeri = CreateRSADataVerifier(@"public");
            //验证签名是否一致
            if ([dataVeri verifyString:@"22" withSign:@"ee"]) {
                
            }
            NSLog(@"result = %@",resultDic);
            NSString * str = resultDic[@"memo"];
            NSLog(@"memo = %@",str);
            
        }];
        
    }else if ([url.host isEqualToString:@"platformapi"]){
        //授权返回码
        [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
            
        }];
    }
    
    
    return YES;
}

使用之前的handleopenurl 这个代理方法,我们百度的可能还有其他解决办法,
一、最有效的方法好像是把工程中得info文件中得
Main storyboard file base name
删除后边的value,就可以回调了
二、第二种就是采用支付宝推荐的使用sourceApplication 这个方法进行回调,

模拟支付行为代码

#pragma mark -
#pragma mark   ==============点击订单模拟支付行为==============
//
//选中商品调用支付宝极简支付
//
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    /*
     *点击获取prodcut实例并初始化订单信息
     */
    Product *product = [self.productList objectAtIndex:indexPath.row];
    
    /*
     *商户的唯一的parnter和seller。
     *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
     */
    
/*============================================================================*/
/*=======================需要填写商户app申请的===================================*/
/*============================================================================*/
    NSString *partner = @"";
    NSString *seller = @"";
    NSString *privateKey = @"";
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
    
    //partner和seller获取失败,提示
    if ([partner length] == 0 ||
        [seller length] == 0 ||
        [privateKey length] == 0)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
                                                        message:@"缺少partner或者seller或者私钥。"
                                                       delegate:self
                                              cancelButtonTitle:@"确定"
                                              otherButtonTitles:nil];
        [alert show];
        return;
    }
    
    /*
     *生成订单信息及签名
     */
    //将商品信息赋予AlixPayOrder的成员变量
    Order *order = [[Order alloc] init];
    order.partner = partner;
    order.seller = seller;
    order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
    order.productName = product.subject; //商品标题
    order.productDescription = product.body; //商品描述
    order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品价格
    order.notifyURL =  @"http://www.xxx.com"; //回调URL
    
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    order.showUrl = @"m.alipay.com";
    
    //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
    NSString *appScheme = @"alisdkdemo";
    
    //将商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
    
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];
    
    //将签名成功字符串格式化为订单字符串,请严格按照该格式
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"reslut = %@",resultDic);
        }];
        
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
}

授权信息

- (NSString *)description
{
    if (self.appID.length != 16||self.pid.length != 16) {
        return nil;
    }
    NSArray *decriptionArray = @[[NSString stringWithFormat:@"app_id=\"%@\"", self.appID],
                                 [NSString stringWithFormat:@"pid=\"%@\"", self.pid],
                                 [NSString stringWithFormat:@"apiname=\"%@\"", self.apiName?self.apiName:@"com.alipay.account.auth"],
                                 [NSString stringWithFormat:@"app_name=\"%@\"", self.appName?self.appName:@"mc"],
                                 [NSString stringWithFormat:@"biz_type=\"%@\"", self.bizType?self.bizType:@"openservice"],
                                 [NSString stringWithFormat:@"product_id=\"%@\"", self.productID?self.productID:@"WAP_FAST_LOGIN"],
                                 [NSString stringWithFormat:@"scope=\"%@\"", self.scope?self.scope:@"kuaijie"],
                                 [NSString stringWithFormat:@"target_id=\"%@\"", self.targetID?self.targetID:@"20141225xxxx"],
                                 [NSString stringWithFormat:@"auth_type=\"%@\"", self.authType?self.authType:@"AUTHACCOUNT"],
                                 [NSString stringWithFormat:@"sign_date=\"%@\"", self.signDate?self.signDate:@"2014-12-25 00:00:00"],
                                 [NSString stringWithFormat:@"service=\"%@\"", self.service?self.service:@"mobile.securitypay.pay"]];
    
    return [decriptionArray componentsJoinedByString:@"&"];
    
}


对这个地方的写法是不是新手都有疑问呢,说实话,我这也有疑问

//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];

对于id < DataSigner > 我的理解是对于生成的对象要遵循一种协议,也是C的写法,还希望大神看到回复解释一下,这种原理,以前看百度地图的时候看到过

还有个地方需要主要的,验证公钥,这里我只是随便写的,我最近看到公司项目这一块了,就记录一下,以便能帮助更多新手,提高效率

 //跳转支付宝钱包进行支付,处理支付结果,这个只是辅佐订单支付结果回调
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSString * query = [[url query] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            id<DataVerifier> dataVeri = CreateRSADataVerifier(@"public");
            //验证签名是否一致
            if ([dataVeri verifyString:@"22" withSign:@"ee"]) {
                
            }
            NSLog(@"result = %@",resultDic);
            NSString * str = resultDic[@"memo"];
            NSLog(@"memo = %@",str);
            
        }];

相关文章

网友评论

  • if_you_like:授权这个怎么接入呀
    Raybon_lee:@if_you_like 这个你要联系一下支付宝了,文章只处理技术问题
  • 小脸书1:挺好
  • 国王or乞丐:你注册了么?
  • 现在的执着:您好,请教一下,集成支付宝支付成功后,返回到app时,走appdelegate里面的OL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 这个方法,但是不走里面的回调,是为什么?
    清都:@Raybon_lee 客户端的,要支持回调
    Raybon_lee:@清都 你用的是网页还是客户端,这个接口是客户端回调触发的,网页版的和这个不一样
    清都:看一下有没有走``[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic)``这个支付方法的回调,我的一开始没走这个方法里的block,在`- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options``加上相关方法后,里面的回调没走,``[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic)``这个方法的回调倒是走了,很奇怪。
  • 江山此夜寒:楼主,如果没有支付宝软件,用网页支付,怎么回调
    Raybon_lee:@江山此夜寒 支付宝自带的我接口回调
  • Micro同学:感谢资料!请教一下。。目前调用支付宝app支付之后走了appdelegate里的回调,自己设置了成功和失败的判断。。但是如何把结果给到webview那里或者直接跳转相应的url地址呢?。。。
    Raybon_lee:@microyulive 不是太明白你的需求额
  • 049a6d94ddba:你好,请教个问题,支付宝回到那个系统方法handleOpenUrl sourceApplication这个方法我返回NO,也能回调到app,这是为什么呢?这个方法的作用到底是什么?返回值YES/NO是干什么用的。(我的手机是iOS7.1 走的不是最新iOS9的方法)
    Raybon_lee:@BeSmaple 返回yes是系统确认已经收到回调,
  • 我没喝酒啊:你好,请教一个问题。如果现在用户通过支付宝支付,然后在返回请求结果的时候因为网络问题,没有获取到支付成功的消息。请问这个问题,在集成支付宝的时候应该怎么预处理?
    Raybon_lee:@我没喝酒啊 这个是你这边需要处理的,没网络按照正常的逻处理就行,有网络可以切换界面,这个需要你自己处理这个逻辑
    我没喝酒啊:@Raybon_lee 那用户这边该怎么处理呢
    Raybon_lee:@我没喝酒啊 只要你支付成功,有网的时候再去请求一次网络
  • Developer_Yancy:兄弟,iOS9的回调遇到点问题求帮忙,网页版的支付宝和iOS8的支付宝APP支付结果回调都跑这个方法,
    [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
    DR_NSLog(@"reslut = %@",resultDic);
    }];
    但是iOS9的支付宝APP回调就不跑这个方法了?
    Raybon_lee:@56c5ed1c1555 :joy:,晚上给你看一下吧
    56c5ed1c1555:@Raybon_lee 我没走 回调。 求解救
    Raybon_lee:@Coder_CYX 解决了这里就不给你回答了啊:joy:
  • 闪了腰的企鹅:我就是想来看看

    if ([dataVeri verifyString:str withSign:sign]) {

    },

    结果你就把这里省略了。。。
    Raybon_lee:@闪了腰的企鹅 检查一下你的各项参数和服务器对应一下
    闪了腰的企鹅:@Raybon_lee 我一直验证失败。。
    Raybon_lee:@闪了腰的企鹅 😂这个只是提供接入的一些问题,后面有写要慢慢弄
  • 司马捷:回调给服务器啊 你写的是啥???
    Raybon_lee:@机器人小雪这个主要是关于支付完成后都会回调,其他的没涉及到
    Raybon_lee:@机器人小雪 什么回调服务器,这个是去年的,更新什么了么:joy:
  • wolf_gt::50:

本文标题:iOS支付宝、微信的回调问题解决办法

本文链接:https://www.haomeiwen.com/subject/melocttx.html