IOS APP端京东支付集成

京东支付没有现成的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:gettokenforKey:@"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才表示成功, 否则失败。


Demo下载地址: http://download.csdn.net/detail/svendson/9512589

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值