iOS H5 결제(위 챗,알 리 페 이)네 이 티 브 패키지 구현

머리말
지급 은 앱 결제,H5 결제,스 캔 결제 등 으로 나 뉜 다.app 결 제 는 일반적으로 app 에서 사용 되 고 해당 하 는 결제 SDK 를 통합 해 야 하 며 H5 결 제 는 주로 웹 페이지 에 사용 된다.만약 당신 의 앱 이 통합 결제 SDK 를 원 하지 않 고 결제 기능 을 실현 하려 고 한다 면,당신 은 프로젝트 에서 H5 결 제 를 사용 할 수 있 습 니 다.본 고 는 H5 결 제 를 어떻게 원생 호출 가능 한 구성 요소 로 포장 하 는 지 를 다 루 고 있다.
1.H5 지불 절차
주의:다음은 웹 H5 결제 절차 이 며,네 이 티 브 호출 은 일부 절 차 를 수정 해 야 합 니 다.
1.1 위 챗 페 이
  • 주문 을 통일 하여 위 챗 중간 페이지 주소 mweb 획득url
  • 페이지 를 위 챗 중간 페이지 로 다시 설정 합 니 다위 챗 중간 페이지 결제 요청
  • safari 브 라 우 저 결제 차단 요청 은 위 챗 앱 을 열 어 결 제 를 시작 합 니 다(app 에 있 으 면 shouldStart Load With Request:방법 에서 결제 요청 을 차단 하고 위 챗 을 열 어야 합 니 다)
  • 위 챗 중간 페이지 다시 redirecturl
    1.2 알 리 페 이 지급
  • 웹 페이지 결제 요청 을 하고 H5 는 form 폼 에 제출 합 니 다
  • 페이지 는 알 리 페 이 계산대 페이지 로 재 설정 합 니 다
  • 앱 결제 요청 을 하고 카운트다운 을 시작 합 니 다.알 리 페 이 시간 초과 페이지 를 열 면 웹 결제 인터페이스 로 이동 하고 알 리 페 이 를 불 러 오 면 카운트다운 이 끝 납 니 다
  • 결제 완료 페이지 return 으로 건 너 뛰 기url 페이지,사용자 가 수 동 으로 터치 해 야 합 니 다
  • 2.네 이 티 브 패키지 아이디어
    웹 뷰 를 새로 열 어 지불 중간 페이지 를 불 러 오고 중간 페이지 의 지불 요청 을 차단 하 며 지불 을 불 러 온 다음 웹 뷰 프로 세 스 를 닫 습 니 다.
    웹 뷰 는 window(또는 현재 컨트롤 러 의 view)에 추가 하고 크기 를 설정 해 야 합 니 다(육안 으로 보이 지 않 으 면 됩 니 다).wkwebview 를 사용 할 때 webView 가 표시 되 지 않 을 경우 H5 요청 이 걸 려 알 리 페 이 페이지 에서 결제 요청 을 불 러 일 으 키 지 못 하기 때 문 입 니 다.
    3.코드 구현
    구체 적 인 절 차 는 코드 주석 참조
    
    @interface HJH5WebPayManager()<UIWebViewDelegate>
    
    @property (nonatomic,strong) UIWebView *payWebview;
    
    @property (nonatomic,strong) void(^sendPayResult)(HJH5SendWebPayResult);
    
    @end
    
    @implementation HJH5WebPayManager
    
    +(instancetype)sharedInstance{
     static dispatch_once_t once ;
     static HJH5WebPayManager *_instace = nil;
     dispatch_once(&once, ^{
     _instace = [[self alloc] init];
     });
     return _instace;
    }
    
    -(void)loadWebPayTransitionPage:(NSString *)html handleBlock:(void (^)(HJH5SendWebPayResult))handle{
     NSMutableURLRequest *request = nil;
     if ([html hasPrefix:@"https://wx.tenpay.com"]) {
     //      
     NSString *wxScheme = @"";
     NSString *referer = [NSString stringWithFormat:@"%@://",wxScheme];
     // redirect_url   scheme,          APP,     Safari   (  redirect_url     HTTP   )
     NSRange range = [html rangeOfString:@"redirect_url="];
     NSString *reqUrl;
     if (range.length>0) {
      reqUrl = [html substringToIndex:range.location+range.length];
      reqUrl = [reqUrl stringByAppendingString:referer];
     }else{
      reqUrl = [html stringByAppendingString:[NSString stringWithFormat:@"&redirect_url=%@",referer]];
     }
     request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:reqUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
     //      ,  Referer ,          Referer ,  Referer            
     [request setValue:referer forHTTPHeaderField:@"Referer"];
     if (self.payWebview) {
      [self.payWebview removeFromSuperview];
      self.payWebview = nil;
     }
     self.payWebview = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 0.1, 0.1)];
     self.sendPayResult = handle;
     [[UIApplication sharedApplication].keyWindow addSubview:self.payWebview];
     self.payWebview.delegate = self;
     [self.payWebview loadRequest:request];
     }else if ([html hasPrefix:@"<form"]){
     //      ,html        form      ,    loadString    
     if (self.payWebview) {
      [self.payWebview removeFromSuperview];
      self.payWebview = nil;
     }
     self.payWebview = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 0.1, 0.1)];
     self.sendPayResult = handle;
     [[UIApplication sharedApplication].keyWindow addSubview:self.payWebview];
     self.payWebview.delegate = self;
     NSString *payStr = html;
     NSString *htmlString = [NSString stringWithFormat:@"htmlString:<html> 
    " "<head>
    " "<meta name=\"viewport\" content=\"initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" />
    " "<style type=\"text/css\">
    " "body {font-size:16px;}
    " "</style>
    " "</head>
    " "<body>" "%@" "</body>" "</html>",payStr]; [self.payWebview loadHTMLString:htmlString baseURL:nil]; }else{ // html, handle(HJH5SendWebPayResultOther); return; } // ,20 , 。 __weak typeof(self) weakSelf = self; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ if (weakSelf.sendPayResult) { weakSelf.sendPayResult(HJH5SendWebPayResultOther); } [weakSelf endPayment]; }); } - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ // , if (self.sendPayResult) { self.sendPayResult(HJH5SendWebPayResultLoadFail); } [self endPayment]; } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ NSURL *url = request.URL; NSString *newUrl = url.absoluteString; // , if([newUrl rangeOfString:@"weixin://wap/pay"].location != NSNotFound){ // if ([[UIApplication sharedApplication] canOpenURL:url]) { if (@available(iOS 10.0, *)){ [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; }else{ [[UIApplication sharedApplication] openURL:url]; } if (self.sendPayResult) { self.sendPayResult(HJH5SendWebPayResultSuccess); } [self endPayment]; }else{ if (self.sendPayResult) { self.sendPayResult(HJH5SendWebPayResultSendFail); } [self endPayment]; } return NO; }else if([newUrl rangeOfString:@"alipay://alipayclient/?"].location != NSNotFound){ // , fromAppUrlScheme APP scheme, APP 。 NSString *aliScheme = @" scheme, scheme APP"; newUrl = [HJStringHelper decodeURL:newUrl]; NSString *parameterString = [newUrl stringByReplacingOccurrencesOfString:@"alipay://alipayclient/?" withString:@""]; NSError *error = nil; id dict = [NSJSONSerialization JSONObjectWithData:[parameterString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&error]; if (!error) { if ([dict isKindOfClass:[NSMutableDictionary class]]) { dict[@"fromAppUrlScheme"] = aliScheme; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error]; if (!error) { parameterString = [HJStringHelper escapeURL:[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]]; NSString *payUrl = [NSString stringWithFormat:@"alipay://alipayclient/?%@",parameterString]; dispatch_async(dispatch_get_main_queue(), ^{ // if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:payUrl]]) { if (@available(iOS 10.0, *)){ [[UIApplication sharedApplication] openURL:[NSURL URLWithString:payUrl] options:@{} completionHandler:nil]; }else{ [[UIApplication sharedApplication] openURL:[NSURL URLWithString:payUrl]]; } if (self.sendPayResult) { self.sendPayResult(HJH5SendWebPayResultSuccess); } [self endPayment]; }else{ if (self.sendPayResult) { self.sendPayResult(HJH5SendWebPayResultSendFail); } [self endPayment]; } }); } } } return NO; }else{ return YES; } } -(void)endPayment{ self.sendPayResult = nil; [self.payWebview removeFromSuperview]; self.payWebview = nil; } @end
    3.1 입참 설명
    이 방법 으로 결제 불 러 오기-(void)loadWebPayTransition 페이지:(NSString*)html handleBlock:(void(^)(HJH5SendWebPayResult))handle 을 호출 합 니 다.
    그 중에서 html 는 위 챗 중간 페이지 주소 와 알 리 페 이 폼 폼 스 크 립 트 입 니 다.예:
    위 챗: https://wx.tenpay.com ?xxxx
    알 리 페 이:
    document.forms[' alipaysubmit '].submit();
    1.H5 결제 절 차 를 보면 위 챗 에서 주문 한 후에 중간 페이지 주 소 를 얻 을 수 있 고 지불 은 form 폼 으로 중간 페이지 를 불 러 와 야 합 니 다.
    3.2 오류 처리
    
    typedef NS_ENUM(NSUInteger,HJH5SendWebPayResult) {
     HJH5SendWebPayResultSuccess = 0, //      
     HJH5SendWebPayResultLoadFail, //        
     HJH5SendWebPayResultSendFail, //      ,                
     HJH5SendWebPayResultOther //  
    };
    
    지급 요청 발송 성공 은 이번 H5 지급 개시 가 완료 되 었 음 을 나타 내 며,구체 적 인 지급 결 과 는 조회 백 스테이지 에서 획득 해 야 한다.따라서 일부 이상 상황 을 처리 해 야 한다.예 를 들 어 페이지 로 딩 실패,위 챗 이나 알 리 페 이 가 설치 되 지 않 은 등 이상 한 상황 을 처리 해 야 한다.
    4.설명
    이러한 방안 은 위 챗 과 알 리 페 이 H5 결제 절 차 를 통일 시 키 고 결제 중간 페이지 를 암시 적 으로 표시 하여 H5 단일 페이지 응용 경로 에 영향 을 주지 않 습 니 다.앱 은 통합 결제 SDK 가 필요 없 이 애플 스 캔 코드 를 우회 할 수 있다.
    알 리 페 이 결제 절차 가 위 챗 과 같이 바 뀌 었 기 때문에 알 리 페 이 홈 페이지 결제 기능 이 잘 려 알 리 페 이 앱 을 열 어 결제 할 수 밖 에 없 었 다.이것 도 이런 방안 의 부족 한 점 이다.
    iOS-APP 위 챗 H5 결제 총괄 실현 
    iOS 의 H5 결제(위 챗,알 리 페 이)네 이 티 브 패키지 구현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.iOS H5 결제 에 관 한 더 많은 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 사랑 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기