京东支付没有现成的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

IOS APP端京东支付集成相关推荐

  1. 苹果手机 微信PHP问题,安卓、ios APP调用微信支付时,页面出现空白 。(php微信支付,app发起微信支付白屏)?...

    安卓.ios APP调用微信支付时,页面出现空白 我的后端是用php开发的.我是先调用微信的统一下单生成,生成prepay_id预支付订单号,代码如下: public function send_pa ...

  2. 微信境外支付php_PHP实现 APP端微信支付功能

    前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这里就不多说了,可以参考微信支付开发文档,一定要仔细阅读开发文档,可以让你少踩点坑:准备工作完成后就是配置参数,调用统 ...

  3. php微信app支付教程,PHP APP端微信支付的方法

    这篇文章主要介绍了关于PHP APP端微信支付的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这 ...

  4. 用PHP开发APP端微信支付

    用PHP开发APP端微信支付的一点个人心得 最近因为公司需求,要开发APP端上的微信支付,看了微信文档,感觉还不错,没有遇到太大的坑,需要注意的点不算太多. 写一个记事文档,作为备忘录. APP支付流 ...

  5. app端微信支付(二) - 生成预付单

    ​前一篇文章的时序图中说了,app端调用微信支付必须先由后台调用微信后台生成预付单,再构建参数给手机端,而数据的构建要以xml形式,那么看看代码具体实现吧,代码已经精简过了,自己的业务已经除去,精简的 ...

  6. iOS应用之微信支付集成

    1. 准备工作 工程所需的微信支付SDK,如下图: 导入工程的SDK文件 微信支付所需的相关用户信息(由用户申请) //微信支付商户号#define MCH_ID @"YOUR_MCH_ID ...

  7. 京东支付集成遇到的问题记录

    集成京东支付时遇到的问题在此记录,望小伙伴不再进坑 步骤一: 在module_base_ui的build.gradle中android代码块里添加 sourceSets { main { jniLib ...

  8. iOS应用之微信支付集成-直接前端集成

    所有信息的生成都在前端完成,包括对订单进行sign签名以及MD5签名加密(此方法相对来说有些复杂,没有官方给的方法简单). 注:官方给的是v3&v4支付流程,签名和加密都是在服务器端进行,由于 ...

  9. PHP APP端支付宝支付

    应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,实际开发过程是前后端分离,前端调用后端API接口,实现功能返回数据,我所用的跨挤啊为TP5,大致可以分为四步: 1.在 ...

最新文章

  1. 2022-2028年中国塑胶模具行业市场专项调研及前瞻分析报告
  2. OkHttp源码分析
  3. Android Studio Intent使用(显式、隐式)
  4. art-template辅助函数和子模板
  5. ElasticSearch聚合分析
  6. go interface类型转换_Go语言的九大核心特性主要有哪些?
  7. 2018-08-10 Netty:4.x
  8. POJ NOI0101-08 字符三角形
  9. JAVA中map删除键值对_以有效的方式从Map中删除多个键?
  10. build.xml:391: javac doesn‘t support the “nativeheaderdir“ attribute
  11. 如何优雅的进行W10远程控制
  12. PS怎么做出水彩油画喷溅效果图片
  13. 数据流程图,业务流程图,模块结构图
  14. 天尚网最新单机游戏下载,直接下载哦!
  15. 计算机常用的数字编码是什么意思,编码是什么意思
  16. 微信小程序开发学习5(自定义组件)
  17. MySQL--找出每个部门薪水最高的员工 方法总结
  18. python绘图用什么软件_作图用什么软件比较好?
  19. android 接收闹钟广播,Android获取第三方闹钟的闹铃信息
  20. 什么是计算机器语言?

热门文章

  1. [IDE] 使用教育邮箱申请免费激活JetBrains
  2. thinkpad E14 ubuntu1804 wifi不可用
  3. 本田裂行125保养里程参数
  4. 苹果2019财年第二财季财报前瞻:分析师预计营收将继续下滑
  5. 余额宝体验金领取方法,最高体验金达100万
  6. java实现excel批量导入图片到服务器
  7. 粉丝福利 | 送书和键盘鼠标
  8. 86.(cesium篇)cesium叠加面接收阴影效果(gltf模型)
  9. KEIL 声明隐晦declared implicitly和重复定义symbol multiply defined
  10. 计算机主机电源的构造,PC电源内部结构探秘:原来水这么深