iOS支付寶、微信的回調(diào)問題解決辦法

以前我們使用的回調(diào)是這個(gè)方法
支付寶錢包支付接口開發(fā)包2.0標(biāo)準(zhǔn)版(iOS 2.2.1)


補(bǔ)充:

  • 最近很多人遇到的一個(gè)問題就是iOS9 之后,系統(tǒng)左上角增加了一個(gè)返回按鈕,說(shuō)是這個(gè)時(shí)候沒有回調(diào),由于我也沒有再做這一塊的,無(wú)法測(cè)試到,還望遇到這個(gè)問題的朋友出來(lái)說(shuō)一下解決辦法:
    

我的猜測(cè): SDK 有一個(gè)是notify_url 想必這個(gè)在預(yù)請(qǐng)求訂單消息的時(shí)候可以和后臺(tái)商量一下,加進(jìn)去,在發(fā)送訂單交易的時(shí)候微信支付完成,后臺(tái)完成對(duì)這個(gè)URL 的請(qǐng)求回調(diào),APP,我想者應(yīng)該能收到回調(diào)數(shù)據(jù)的,如果猜測(cè)正確,還望朋友能夠及時(shí)聯(lián)系我,把這個(gè)文章補(bǔ)充完整。謝謝朋友們的支持!


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

最近稍微研究了一下這個(gè),因?yàn)槲乙埠苌俳佑|這個(gè),幫朋友分析了一下,
系統(tǒng)目前提供使用新的方法

- (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:");
這個(gè)意思是使用版本是4.2,支持到版本9.0  

目前支付寶的回調(diào)需要使用這個(gè)新方法也就是下面這種寫法,都加上注釋了,

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
/*
 9000 訂單支付成功
 8000 正在處理中
 4000 訂單支付失敗
 6001 用戶中途取消
 6002 網(wǎng)絡(luò)連接出錯(cuò)
 */
    if ([url.host isEqualToString:@"safepay"]) {
        //這個(gè)是進(jìn)程KILL掉之后也會(huì)調(diào)用,這個(gè)只是第一次授權(quán)回調(diào),同時(shí)也會(huì)返回支付信息
        [[AlipaySDK defaultService]processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            NSString * str = resultDic[@"result"];
            NSLog(@"result = %@",str);
        }];
        //跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果,這個(gè)只是輔佐訂單支付結(jié)果回調(diào)
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSString * query = [[url query] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            id<DataVerifier> dataVeri = CreateRSADataVerifier(@"public");
            //驗(yàn)證簽名是否一致
            if ([dataVeri verifyString:@"22" withSign:@"ee"]) {
                
            }
            NSLog(@"result = %@",resultDic);
            NSString * str = resultDic[@"memo"];
            NSLog(@"memo = %@",str);
            
        }];
        
    }else if ([url.host isEqualToString:@"platformapi"]){
        //授權(quán)返回碼
        [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
            
        }];
    }
    
    
    return YES;
}

使用之前的handleopenurl 這個(gè)代理方法,我們百度的可能還有其他解決辦法,
一、最有效的方法好像是把工程中得info文件中得
Main storyboard file base name
刪除后邊的value,就可以回調(diào)了
二、第二種就是采用支付寶推薦的使用sourceApplication 這個(gè)方法進(jìn)行回調(diào),

模擬支付行為代碼

#pragma mark -
#pragma mark   ==============點(diǎn)擊訂單模擬支付行為==============
//
//選中商品調(diào)用支付寶極簡(jiǎn)支付
//
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    /*
     *點(diǎn)擊獲取prodcut實(shí)例并初始化訂單信息
     */
    Product *product = [self.productList objectAtIndex:indexPath.row];
    
    /*
     *商戶的唯一的parnter和seller。
     *簽約后,支付寶會(huì)為每個(gè)商戶分配一個(gè)唯一的 parnter 和 seller。
     */
    
/*============================================================================*/
/*=======================需要填寫商戶app申請(qǐng)的===================================*/
/*============================================================================*/
    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; //商品標(biāo)題
    order.productDescription = product.body; //商品描述
    order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品價(jià)格
    order.notifyURL =  @"http://www.xxx.com"; //回調(diào)URL
    
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    order.showUrl = @"m.alipay.com";
    
    //應(yīng)用注冊(cè)scheme,在AlixPayDemo-Info.plist定義URL types
    NSString *appScheme = @"alisdkdemo";
    
    //將商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
    
    //獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];
    
    //將簽名成功字符串格式化為訂單字符串,請(qǐng)嚴(yán)格按照該格式
    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];
    }
}

授權(quán)信息

- (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:@"&"];
    
}


對(duì)這個(gè)地方的寫法是不是新手都有疑問呢,說(shuō)實(shí)話,我這也有疑問

//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];

對(duì)于id < DataSigner > 我的理解是對(duì)于生成的對(duì)象要遵循一種協(xié)議,也是C的寫法,還希望大神看到回復(fù)解釋一下,這種原理,以前看百度地圖的時(shí)候看到過

還有個(gè)地方需要主要的,驗(yàn)證公鑰,這里我只是隨便寫的,我最近看到公司項(xiàng)目這一塊了,就記錄一下,以便能幫助更多新手,提高效率

 //跳轉(zhuǎn)支付寶錢包進(jìn)行支付,處理支付結(jié)果,這個(gè)只是輔佐訂單支付結(jié)果回調(diào)
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSString * query = [[url query] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            id<DataVerifier> dataVeri = CreateRSADataVerifier(@"public");
            //驗(yàn)證簽名是否一致
            if ([dataVeri verifyString:@"22" withSign:@"ee"]) {
                
            }
            NSLog(@"result = %@",resultDic);
            NSString * str = resultDic[@"memo"];
            NSLog(@"memo = %@",str);
            
        }];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容