iOS H 5は微信を呼び出し、アリペイの支払いはappソリューションに戻ることができません


最新のプロジェクトではH 5ページで微信、支付宝クライアントの支払いを呼び出す需要に遭遇したが、これは推奨のやり方ではないが、需要は確かに存在する.のh 5ページをロードして、支払いが必要なクライアント(微信または支付宝)をクリックします.
WeChat決済ソリューション:
   1.まず、自分のプロジェクトのschemeを設定し、LSApplicationQueriesSchemesにweixinを追加します.
  2.支払いをクリックするとshouldStartLoadWithRequestコールバックメソッドでhttps://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?....このような接続は、あなたの支払いリンクであり、webViewのロードが完了すると、微信/支付宝を呼び出して支払うことができます.
   3.支払いが完了すると、成功しても失敗してもSafariブラウザに転送されます.
   4.支払いが完了してappに戻るには、コールバックのURLアドレスをブロックする必要があります.コールバックのURLにはredirect_を接続しないでください.url、さもないとブラウザにジャンプします.
   5.最後にReferをwww.xxx.に設定します.com://scheme設定:www.xxx.comは直接アプリに戻ることができます.(www.xxx.comこれはH 5ライセンスのドメイン名でなければなりません).
アリペイ決済ソリューション:
   1.まず、自分のプロジェクトのschemeを設定し、LSApplicationQueriesSchemesにalipayを追加します.
   2.WeChat支払いと同様にshouldStartLoadWithRequestコールでUrlSchemeをブロックし、プロジェクトで設定したUrlSchemeに置き換えます.
コードは次のとおりです.
//UIwebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    //  
    NSString *wxPre = @"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?";
    if ([request.URL.absoluteString hasPrefix:wxPre]) {
        //          redirect_url,               
        NSString *string1 = request.URL.absoluteString;
        // redirect_url          
        NSString *string2 = [string1 stringByReplacingOccurrencesOfString:@"redirect_url=http://www.xxx.com/ad_list.php" withString:@""];
        NSURL *newURL = [NSURL URLWithString:string2];
        //  webView
        UIWebView *web = [[UIWebView alloc]initWithFrame:CGRectZero];
        [self.view addSubview:web]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{

                NSMutableURLRequest* newResult = [NSMutableURLRequest requestWithURL:newURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
                [newResult setHTTPMethod:@"GET"];
                [newResult setValue:@“www.xxx.com://" forHTTPHeaderField: @"Referer"];
                [web loadRequest:newResult];
            });
            
        });
    }

    //   
    NSString *reqUrl = request.URL.absoluteString;
    if ([reqUrl hasPrefix:@"alipays://"] || [reqUrl hasPrefix:@"alipay://"]) {
        reqUrl = [self URLDecodeString:reqUrl];
        //  fromAppUrlScheme    APP UrlSheme
        NSString *newStr = [self changeScheme:request.URL.absoluteString];
        NSString *encodeValue = [newStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSURL *url = [NSURL URLWithString:encodeValue];
        [[UIApplication sharedApplication]openURL:url options:nil completionHandler:nil];
        return NO;
    }

  return YES;
}
//  UrlScheme
- (NSString *)changeScheme:(NSString *)str{
    NSArray *paramsArr = [str componentsSeparatedByString:@"?"];
    NSDictionary *dict = [self jsonToMessageDict:paramsArr.lastObject];
    NSMutableDictionary *mDict = [NSMutableDictionary dictionaryWithDictionary:dict];
    mDict[@"fromAppUrlScheme"] = @"your Url Scheme";
    NSString *jsonStr = mDict.mj_JSONString; //MJExtension
    return [NSString stringWithFormat:@"%@?%@",paramsArr.firstObject,jsonStr];
}

- (NSDictionary *)jsonToMessageDict:(id)messageJson{
    NSDictionary *messageDict = [NSJSONSerialization JSONObjectWithData:[messageJson dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];
    return messageDict ? : @{};
}

- (NSString *)URLDecodeString:(NSString *)str{
    NSString *decodeString = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)str, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
    return decodeString;
}