iOS APP 위 챗 H5 결제 예시 요약 실현
9107 단어 iOS위 챗 페 이 먼 트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 결제 실현 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.