iOS APP 위 챗 H5 결제 예시 요약 실현

위 챗 H5 결제 절차
1.주문 요청(호출 통일 하단 인터페이스)주:거래 유형 tradetype=MWEB
2.단일 인 터 페 이 스 를 통일 하여 결제 관련 매개 변 수 를 업 체 배경 으로 되 돌려 줍 니 다.예 를 들 어 결제 점프 url(매개 변수 이름"mweburl"),상인 통과 mweburl 위 챗 결제 중간 페이지 를 조정 합 니 다.예:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx27142704550165900edae5270331515985&package=600759311&redirect_url=http%3a%2f%2www.baidu.com
3.중간 페이지 에서 H5 권한 의 검사,안전성 검사(구체 적 인 오 류 는 위 챗 공식 문서 참조)
4.권한 검증 에 성공 하면 위 챗 결제 중간 페이지 에서 결제 요청 을 합 니 다.요청 완료 후 리 셋 페이지 로 이동(redirecturl 결정).앱 은 웹 뷰 에서 이 요청 을 감청 하고 위 챗 을 열 어 결제 해 야 한다.예:weixin://wap/pay?prepayid%3Dwx2718114258281033efb8751f1574826586&package=2965581453&noncestr=1545905512&sign=cb0f6dbd067549a04aada9c3eef09aac
5.위 챗 결제 완료 후 앱 으로 돌아 갑 니 다.
Refer 와 redirecturl 설명
HTTP Referer 는 header 의 일부분 으로 브 라 우 저가 웹 서버 에 요청 할 때 보통 Referer 를 가지 고 서버 에 내 가 어느 페이지 에서 연결 되 었 는 지 알려 준다.위 챗 중간 페이지 는 Refer 를 검사 합 니 다.비 안전 도 메 인 이름 은 정상적으로 불 러 올 수 없습니다.
redirect_url 은 위 챗 중간 페이지 에서 위 챗 결 제 를 불 러 일 으 킨 후 페이지 의 방향 을 바 꾸 는 주소 입 니 다.중간 페이지 에서 위 챗 결 제 를 불 러 오 면 지정 한 redirect 로 이동 합 니 다.url。또한 위 챗 앱 은 결제 완료 시 redirecturl 리 셋 결과,redirecturl 은 보통 페이지 주소 이기 때문에 위 챗 결제 가 완료 되면 Safari 브 라 우 저 를 엽 니 다.본문 수정 을 통 해 redirecturl,위 챗 결제 완료 후 현재 앱 으로 돌아 가기.
메모:위 챗 은 Referer(출처)와 redirect 를 검사 합 니 다.url(대상)이 보안 도 메 인 인지 여부 입 니 다.리 디 렉 션 하지 않 으 면url,위 챗 은 Referer 를 redirecturl,결 제 를 불 러 오 면 Refer 에 대응 하 는 페이지 로 다시 설정 합 니 다.
redirecturl。
코드 구현
1.info.plist 설정 scheme
위 챗 H5 결제 의 보안 도 메 인 이름 을 scheme 로 설정 해 야 하 며,위 챗 결제 가 완료 되면 이 scheme 을 통 해 앱 으로 되 돌아 갑 니 다.

<key>CFBundleURLTypes</key>
 <array>
  <dict>
   <key>CFBundleTypeRole</key>
   <string>Editor</string>
   <key>CFBundleURLName</key>
   <string>wxPay</string>
   <key>CFBundleURLSchemes</key>
   <array>
<string>  scheme(    )</string> </array> 
  </dict>
 </array>

<key>LSApplicationQueriesSchemes</key>
 <array>
  <string>wechat</string>
  <string>weixin</string>

</array>
2、위 챗 중간 페이지 차단,redirecturl
다시 shouldStart Load With Request:방법 안에서 위 챗 중간 페이지 를 차단 합 니 다.https://wx.tenpay.com"시작 요청),redirect 캡 처url,만약 redirecturl 은 scheme 로 바 뀌 었 습 니 다.바 뀌 지 않 으 면 요청 을 차단 하고 현재 redirect 를 저장 합 니 다.url。새 위 챗 중간 페이지 를 만 들 기 요청,redirecturl 을"보안 도 메 인 이름://"로 바 꿉 니 다.(위 챗 결제 완료 시 openURL 을 통 해 현재 앱 을 엽 니 다.redirect 를 바 꾸 지 않 으 면url,위 챗 결제 완료 시 Safari 브 라 우 저 를 엽 니 다.)"Referer"를 보안 도 메 인 이름 으로 설정 합 니 다(위 챗 에서 Referer 를 검사 합 니 다.보안 도 메 인 이름 이 아 닌 경우 불 러 오 는 데 실 패 했 습 니 다).다시 로드 요청 합 니 다.

//  referer          info.plist scheme  
 NSString *referer = [NSString stringWithFormat:@"%@://",wxScheme];
  if ([newUrl rangeOfString:@"https://wx.tenpay.com"].location != NSNotFound) {
   //  redirect_url    
   NSDictionary *params = [HJStringHelper getUrlParam:newUrl];
   NSString *backUrl = params[@"redirect_url"];
   if ([backUrl isEqualToString:referer]) {
   //  redirect_url    referer,   
    return YES;
   }else{
    //     redirectUrl,     
    self.redirectUrl = [HJStringHelper decodeURL:backUrl];
    dispatch_async(dispatch_get_main_queue(), ^{
     NSRange range = [newUrl rangeOfString:@"redirect_url="];
     NSString *reqUrl;
     if (range.length>0) {
      reqUrl = [newUrl substringToIndex:range.location+range.length];
      reqUrl = [reqUrl stringByAppendingString:referer];
     }else{
      reqUrl = [newUrl stringByAppendingString:[NSString stringWithFormat:@"&redirect_url=%@",referer]];
     }
     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:reqUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
     //      
     [request setValue:referer forHTTPHeaderField:@"Referer"];
     [self.webView loadRequest:request];
    });
    return NO;
   }
  }

2,차단 위 챗 중간 페이지 에서 위 챗 요청
위 챗 중간 페이지 를 불 러 오 는 데 성공 하면 위 챗 을 열 어 달 라 는 요청 을 받 을 수 있 습 니 다.openURL 로 이 url 을 열 어 위 챗 결제 로 이동 합 니 다.

 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];
    }
   }else{
   }
   return NO;
  }
3.로 딩 재 설정 주소
위 챗 중간 페이지 가 위 챗 으로 넘 어 갈 때 페이지 를 방향 에서 redirecturl,redirecturl 은 scheme 로 변경 되 었 기 때문에 이 불법 scheme 요청 을 차단 하고 기 록 된 redirect 로 교체 해 야 합 니 다.url。

 if([newUrl isEqualToString:referer]){
   dispatch_async(dispatch_get_main_queue(), ^{
    if (self.redirectUrl) {
     //  ,       redirectUrl  ,     redirectUrl      ,         
     self.redirectUrl = [HJStringHelper decodeURL:self.redirectUrl];
     
     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[HJStringHelper encodeURL:self.redirectUrl]] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
     [self.webView loadRequest:request];
     self.redirectUrl = nil;
    }
   });
   return NO;
  }
전체 코드 는 다음 과 같다.
UIWebView 를 예 로 들 면

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
 //        
 NSURL *url = [request URL];
 NSString *newUrl = url.absoluteString;
 //        
 NSString *wxScheme = [h5WXPayScheme copy];
 if (wxScheme.length>0) {
 //        referer
  NSString *referer = [NSString stringWithFormat:@"%@://",wxScheme];
  if ([newUrl rangeOfString:@"https://wx.tenpay.com"].location != NSNotFound) {
   
   NSDictionary *params = [HJStringHelper getUrlParam:newUrl];
   NSString *backUrl = params[@"redirect_url"];
   if ([backUrl isEqualToString:referer]) {
    return YES;
   }else{
    self.redirectUrl = [HJStringHelper decodeURL:backUrl];
    dispatch_async(dispatch_get_main_queue(), ^{
     NSRange range = [newUrl rangeOfString:@"redirect_url="];
     NSString *reqUrl;
     if (range.length>0) {
      reqUrl = [newUrl substringToIndex:range.location+range.length];
      reqUrl = [reqUrl stringByAppendingString:referer];
     }else{
      reqUrl = [newUrl stringByAppendingString:[NSString stringWithFormat:@"&redirect_url=%@",referer]];
     }
     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:reqUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
     //      
     [request setValue:referer forHTTPHeaderField:@"Referer"];
     [self.webView loadRequest:request];
    });
    return NO;
   }
  }else 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];
    }
   }else{
    
   }
   return NO;
  }else if([newUrl isEqualToString:referer]){
   dispatch_async(dispatch_get_main_queue(), ^{
    if (self.redirectUrl) {
     
     self.redirectUrl = [HJStringHelper decodeURL:self.redirectUrl];
     
     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[HJStringHelper encodeURL:self.redirectUrl]] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
     [self.webView loadRequest:request];
     self.redirectUrl = nil;
    }
   });
   return NO;
  }
 }
 return [super webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
}
H5 결제 패 키 징 을 다 룬 글 도 있 는데 H5 결 제 는 홈 페이지 뿐만 아니 라 원생 도 호출 할 수 있다.구체 적 인 내용 은:iOS-H5 결제(위 챗,알 리 페 이)네 이 티 브 패키지
여기 서 iOS APP 의 위 챗 H5 결제 실현 에 관 한 예 시 를 정리 한 글 은 여기까지 입 니 다.더 많은 관련 iOS APP 의 위 챗 H5 결제 실현 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기