虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > IOS编程/Objective-C > IOS APP端京东支付集成

IOS APP端京东支付集成
类别:IOS编程/Objective-C   作者:码皇   来源:Yashon     点击:

京东支付没有现成的SDK, 使用的是加载html。因此,在集成京东支付的时候,我们使用webView来进行加载显示支付的页面。

京东支付没有现成的SDK, 使用的是加载html。因此,在集成京东支付的时候,我们使用webView来进行加载显示支付的页面。

 

京东支付需要传递多个参数才能拉起支付页面,那么我们怎么样获得和传递参数呢?

 

1.我们需要与自己的后台进行交互,通过网络请求,获取到拉起支付页面所需要的参数,并将参数解析成字符串进行保存。

 

2.在选择京东支付方式之后, 跳转到一个由Viewcontroller控制webView的场景下,将webView的delegate指向当前的ViewController。将获取到的参数, 通过网络请求传递给京东的后台进行验证,京东后台及html页面地址为 : https://m.jdpay.com/wepay/web/pay

 

在viewDidLoad方法中调用如下方法:

 

-(void)viewDidLoad {

//通过AFN向京东发送参数并进行验证,并获取支付的html路径

[selfloadTheJDRequest];

}

 

-(void)loadTheJDRequest {

ShowIndicatorWithMessage(@"正在跳转请稍后");

NSMutableDictionary *formDic = [[NSMutableDictionaryalloc]init];

[formDic setObject:self.getDic[@"successCallbackUrl"] ? self.getDic[@"successCallbackUrl"] :@""forKey:@"successCallbackUrl"];

[formDic setObject:self.getDic[@"tradeDescription"] ? self.getDic[@"tradeDescription"] :@""forKey:@"tradeDescription"];

[formDic setObject:self.getDic[@"tradeTime"] ? self.getDic[@"tradeTime"] :@""forKey:@"tradeTime"];

[formDic setObject:self.getDic[@"tradeNum"] ? self.getDic[@"tradeNum"] :@""forKey:@"tradeNum"];

[formDic setObject:self.getDic[@"tradeName"] ? self.getDic[@"tradeName"] :@""forKey:@"tradeName"];

[formDic setObject:self.getDic[@"merchantRemark"] ? self.getDic[@"merchantRemark"] :@""forKey:@"merchantRemark"];

[formDic setObject:self.getDic[@"version"] ? self.getDic[@"version"] :@""forKey:@"version"];

[formDic setObject:self.getDic[@"currency"] ? self.getDic[@"currency"] :@""forKey:@"currency"];

[formDic setObject:self.getDic[@"merchantSign"] ? self.getDic[@"merchantSign"] :@""forKey:@"merchantSign"];

 

//获取本地保存的token值

NSString *JDToken = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"JDTOKEN"];

 

NSLog(@"-------------%@",JDToken);

 

[formDic setObject:JDToken ? JDToken :@""forKey:@"token"];

[formDic setObject:self.getDic[@"tradeAmount"] ? self.getDic[@"tradeAmount"] :@""forKey:@"tradeAmount"];

[formDic setObject:self.getDic[@"notifyUrl"] ? self.getDic[@"notifyUrl"] :@""forKey:@"notifyUrl"];

[formDic setObject:self.getDic[@"merchantNum"] ? self.getDic[@"merchantNum"] :@""forKey:@"merchantNum"];

[formDic setObject:self.getDic[@"failCallbackUrl"] ? self.getDic[@"failCallbackUrl"] :@""forKey:@"failCallbackUrl"];

 

//通过AFN提交参数

AFHTTPRequestOperationManager *manager=[AFHTTPRequestOperationManagermanager];

manager.responseSerializer.acceptableContentTypes=[NSSetsetWithObjects:@"text/html",@"text/javascript",nil];

manager.responseSerializer=[AFHTTPResponseSerializerserializer];

[manager POST:self.getDic[@"jdReqUrl"]parameters:formDicsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {

NSString *htmlstring=[[NSStringalloc]initWithData:responseObjectencoding:NSUTF8StringEncoding];

//将第二次请求出来的html字符串加载到webview

[self.chargeWebViewloadHTMLString:htmlstringbaseURL:[NSURLURLWithString:self.getDic[@"jdReqUrl"]]];

} failure:^(AFHTTPRequestOperation *operation,NSError *error) {

}];

}

 

 

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {

ShowTips(@"数据加载出错啦!");

}

 

-(void)viewWillDisappear:(BOOL)animated {

[superviewWillDisappear:animated];

HideIndicator();

}

 

3.根据回调进行判断是否支付成功, 回调地址中包含token字段及其信息, 则表示支付成功,否则支付失败。 此处的token值获取到之后, 保存在本地, 在步骤2中向京东发送参数时, token不为空时,拉起的支付页面显示带有银行卡的界面, 若token为空时, 则显示京东的登录界面。

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

 

NSLog(@"============%@",request.URL);

if ([request.URL.absoluteStringrangeOfString:@"call_back_url"].location !=NSNotFound) {

if ([request.URL.absoluteStringrangeOfString:@"token"].location !=NSNotFound) {

NSLog(@"-------------充值成功");

 

NSString *token = [[request.URL.absoluteStringcomponentsSeparatedByString:@"token="]lastObject];

NSString *gettoken = [[tokencomponentsSeparatedByString:@"&"]firstObject];

 

NSLog(@"-------------%@",gettoken);

 

[[NSUserDefaultsstandardUserDefaults]setObject:gettoken forKey:@"JDTOKEN"];

[[NSUserDefaultsstandardUserDefaults]synchronize];

 

 

[self.navigationControllerpopToViewController:self.navigationController.viewControllers[self.navigationController.viewControllers.count - 3] animated:YES];

} else {

NSLog(@"-------------充值失败");

UIAlertView *alt=[[UIAlertViewalloc]initWithTitle:@"支付失败"message:nildelegate:selfcancelButtonTitle:@"稍后尝试"otherButtonTitles:@"再次提交",nil];

alt.tag=1000;

[alt show];

}

}

returnYES;

}

 

 

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

if (alertView.tag ==1000) {

if (buttonIndex == alertView.cancelButtonIndex) {

[self.navigationControllerpopToViewController:self.navigationController.viewControllers[self.navigationController.viewControllers.count - 3] animated:YES];

} else {

[selfloadTheJDRequest];

}

}

}

 

-(void)webViewDidFinishLoad:(UIWebView *)webView {

HideIndicator();

}

 

 

5.注意事项:

(1)京东支付,每天只有五次支付机会,支付五次之后,会提示一些京东默认的错误信息及带有错误信息的界面。

(2)首次与后台交互时,返回的token值必定为空,拉起之后进入登录界面, 当支付成功之后,才会有token的信息在京东的回调地址中,此时前端或者后端截取之后保存到本地即可下次直接之用

(3)回调地址中包含token才表示成功, 否则失败。

 

相关热词搜索: