iOS H5 결제(위 챗,알 리 페 이)네 이 티 브 패키지 구현
지급 은 앱 결제,H5 결제,스 캔 결제 등 으로 나 뉜 다.app 결 제 는 일반적으로 app 에서 사용 되 고 해당 하 는 결제 SDK 를 통합 해 야 하 며 H5 결 제 는 주로 웹 페이지 에 사용 된다.만약 당신 의 앱 이 통합 결제 SDK 를 원 하지 않 고 결제 기능 을 실현 하려 고 한다 면,당신 은 프로젝트 에서 H5 결 제 를 사용 할 수 있 습 니 다.본 고 는 H5 결 제 를 어떻게 원생 호출 가능 한 구성 요소 로 포장 하 는 지 를 다 루 고 있다.
1.H5 지불 절차
주의:다음은 웹 H5 결제 절차 이 며,네 이 티 브 호출 은 일부 절 차 를 수정 해 야 합 니 다.
1.1 위 챗 페 이
1.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
알 리 페 이:
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 결제 에 관 한 더 많은 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 사랑 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.